En criptografia, el Tiny Encryption Algorithm (TEA) és un xifratge de blocs que destaca per la seva senzillesa de descripció i implementació, normalment unes poques línies de codi. Va ser dissenyat per David Wheeler i Roger Needham del Cambridge Computer Laboratory; es va presentar per primera vegada al taller Fast Software Encryption a Lovaina l'any 1994 i es va publicar per primera vegada a les actes d'aquest taller.

El xifrat no està subjecte a cap patent.

Propietats TEA funciona amb dos nombres enters sense signe de 32 bits (podria derivar-se d'un bloc de dades de 64 bits) i utilitza una clau de 128 bits. Té una estructura Feistel amb 64 rondes suggerides, normalment implementades en parelles denominades cicles. Té una programació de claus extremadament senzilla, barrejant tot el material clau de la mateixa manera per a cada cicle. S'utilitzen diferents múltiples d'una constant màgica per evitar atacs simples basats en la simetria de les rondes. La constant màgica, 2654435769 o 0x9E3779B9 (232).

TEA té algunes debilitats. El més notable és que pateix claus equivalents: cada clau és equivalent a tres altres, el que significa que la mida efectiva de la clau és només de 126 bits. Com a resultat, TEA és especialment dolent com a funció hash criptogràfica. Aquesta debilitat va portar a un mètode per piratejar la consola de jocs Xbox de Microsoft, on el xifrat s'utilitzava com a funció hash. El TEA també és susceptible a un atac de clau relacionada que requereix 223 textos en pla escollits sota un parell de claus relacionades, amb una complexitat temporal de 232. A causa d'aquestes debilitats, es va dissenyar el xifratge XTEA.

Codi de referència A continuació es mostra una adaptació de les rutines de xifrat i desxifrat de referència en C, publicades al domini públic per David Wheeler i Roger Needham:#include <stdint.h>

void encrypt (uint32_t v, const uint32_t k) { uint32_t v0=v, v1=v, sum=0, i; /* set up */ uint32_t delta=0x9E3779B9; /* a key schedule constant */ uint32_t k0=k, k1=k, k2=k, k3=k; /* cache key */ for (i=0; i<32; i++) { /* basic cycle start */ sum += delta; v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); } /* end cycle */ v=v0; v=v1; }

void decrypt (uint32_t v, const uint32_t k) { uint32_t v0=v, v1=v, sum=0xC6EF3720, i; /* set up; sum is (delta << 5) & 0xFFFFFFFF */ uint32_t delta=0x9E3779B9; /* a key schedule constant */ uint32_t k0=k, k1=k, k2=k, k3=k; /* cache key */ for (i=0; i<32; i++) { /* basic cycle start */ v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3); v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1); sum -= delta; } /* end cycle */ v=v0; v=v1; }

Referències

Categoria:Xifratges