XXTEA
In crittografia il Corrected Block TEA (spesso abbreviato in XXTEA) è un cifrario a blocchi sviluppato per correggere le vulnerabilità riscontrate nel disegno del Block TEA, un algoritmo di cifratura erede del Tiny Encryption Algorithm che fu pubblicato per la prima volta insieme all'XTEA nel 1997.[1] L'algoritmo è stato presentato nel 1998 da David Wheeler e Roger Needham, del dipartimento informatico dell'Università di Cambridge.[2] Non è soggetto ad alcun brevetto. StrutturaL'XXTEA, tecnicamente parlando, è un cifrario a blocchi basato su una rete di Feistel non bilanciata, dove le due metà in cui è diviso il blocco di dati su cui opera la funzione non sono delle stesse dimensioni. L'XXTEA lavora, infatti, su blocchi di dimensione variabile la cui lunghezza è minimo 64 bit e multipla di 32 bit. Il numero dei cicli completi dipende dalla dimensione del blocco, ma devono comunque essere compresi fra un minimo di 6 ed un massimo di 32 (quando si utilizzano blocchi di piccole dimensioni). Il Block TEA, da cui deriva, applicava la funzione interna dell'XTEA ad ogni word del blocco, combinandola con la sua vicina del flusso di sinistra. Questo modo di operare comportava una bassa diffusione, una delle proprietà che un buon cifrario deve possedere: questa vulnerabilità fu subito utilizzata per proporre un metodo per violare il Block TEA.[3] Il Corrected Block TEA utilizza una funzione interna più curata che fa uso, per la processazione delle word del blocco, di entrambe quelle adiacenti. Se la dimensione del blocco è identica alla dimensione del messaggio, l'XXTEA ha la proprietà di non richiedere l'impostazione di una modalità di funzionamento: l'algoritmo può essere applicato direttamente all'intero messaggio. L'XXTEA risulta più efficiente dell'XTEA per operare su messaggi molto lunghi. Codice di riferimentoEcco una implementazione dell'XXTEA in linguaggio C, basata sull'originale pubblicata da David Wheeler e Roger Needham:[4] /* #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (key[p&3^e]^z) */
#define MX ( (((z>>5)^(y<<2))+((y>>3)^(z<<4)))^((sum^y)+(key[(p&3)^e]^z)) )
long btea(long* v, long length, long* key) {
unsigned long z /* = v[length-1] */, y=v[0], sum=0, e, DELTA=0x9e3779b9;
long p, q ;
if (length > 1) { /* Coding Part */
z=v[length-1]; /* Moved z=v[length-1] to here, else segmentation fault in decode when length < 0 */
q = 6 + 52/length;
while (q-- > 0) {
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<length-1; p++) y = v[p+1], z = v[p] += MX;
y = v[0];
z = v[length-1] += MX;
}
return 0 ;
} else if (length < -1) { /* Decoding Part */
length = -length;
q = 6 + 52/length;
sum = q*DELTA ;
while (sum != 0) {
e = (sum >> 2) & 3;
for (p=length-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
z = v[length-1];
y = v[0] -= MX;
sum -= DELTA;
}
return 0;
}
return 1;
}
Note
Voci correlate
|