I kryptografi er XTEA ( eXtended TEA ) en krypteringsalgoritme designet til at rette svagheder i TEA . David Wheeler og Roger Needham fra Cambridge University designede denne algoritme, som blev foreslået i en upubliceret teknisk rapport i 1997 ( Needham and Wheeler, 1997 ). Det er ikke underlagt noget patent.
Ligesom TEA er XTEA baseret på et 64-bit Feistel-netværk , med en 128-bit-nøgle i 64 drejninger anbefales. Flere forskelle er bemærkelsesværdige fra TEA, herunder en mere detaljeret nøglegenereringsplan og arrangement af forskydninger, XOR'er og tilføjelser.
Ud over XTEA præsenteres en krypteringsalgoritme, der bruger blokke af variabel størrelse, kaldet Block TEA , i den samme rapport; det bruger XTEA-funktionen per tur, men gælder cyklisk for hele meddelelsen under flere iterationer. Eftersom den behandler hele meddelelsen, Block TEA har særegenhed ikke at behøve et operativsystem tilstand . Et angreb på denne algoritme er beskrevet af Markku-Juhani Saarinen i en upubliceret 1998-rapport; han opdagede også en svaghed i XXTEA, efterfølgeren til Block TEA .
Indtil 2004 er det bedste angreb på XTEA en differentiel kryptanalyse ved hjælp af nøgle relateret til 24 af de 64 runder af XTEA, der beder 2 20,5 udvalgte tekster og en kompleksitet på 2 115,15 (Ko et al, 2004).
Denne standard C- sprogkildekode - frigivet til det offentlige domæne af David Wheeler og Roger Needham - udfører kryptering og dekryptering ved hjælp af XTEA:
void encipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) { unsigned long v0=v[0], v1=v[1], i; unsigned long sum=0, delta=0x9E3779B9; for(i=0; i<num_rounds; i++) { v0 += ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]); sum += delta; v1 += ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum>>11 & 3]); } v[0]=v0; v[1]=v1; } void decipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) { unsigned long v0=v[0], v1=v[1], i; unsigned long delta=0x9E3779B9, sum=delta*num_rounds; for(i=0; i<num_rounds; i++) { v1 -= ((v0 << 4 ^ v0 >> 5) + v0) ^ (sum + k[sum>>11 & 3]); sum -= delta; v0 -= ((v1 << 4 ^ v1 >> 5) + v1) ^ (sum + k[sum & 3]); } v[0]=v0; v[1]=v1; }Den oprindelige kildekode har nogle portabilitetsfejl på ikke-32-bit platforme. Den følgende kode er en bærbar tilpasning af den oprindelige kildekode, da den forklarer de heltals typer, den bruger:
#include <stdint.h> /* Prend 64 bits de données de v[0] et v[1], et 128 bits de key[0] à key[3] */ void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9; for (i=0; i < num_rounds; i++) { v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); sum += delta; v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); } v[0]=v0; v[1]=v1; } void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds; for (i=0; i < num_rounds; i++) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); } v[0]=v0; v[1]=v1; }Ændringerne fra referencekildekoden er mindre:
(v0<<4 ^ v0>>5) + v0 ^ sum + k[sum>>11 & 3];)