Tiny Encryption Algorithm
Der TEA (Tiny Encryption Algorithm) ist eine Blockchiffre, die für ihre einfache Beschreibung und Implementierung bekannt ist (normalerweise einige Zeilen Code). Er wurde von David Wheeler und Roger Needham an der Universität Cambridge entwickelt und das erste Mal im Rahmen eines Workshops zu schneller Verschlüsselung im Jahr 1994 vorgestellt. Er ist frei von Patenten. EigenschaftenTEA arbeitet auf 64-bit großen Blöcken und benutzt einen 128-bit langen Schlüssel. Er stellt eine Feistelchiffre mit einer vorgeschlagenen Rundenanzahl von 64 dar. Normalerweise wird er so implementiert, dass zwei Runden einen Zyklus darstellen. Er hat einen sehr einfachen Mechanismus zur Erzeugung des jeweiligen Rundenschlüssels. Das Einbringen eines sogenannten Deltas, das als definiert ist, verhindert einen Angriff, der die Symmetrie der einzelnen Runden ausnutzt. TEA hat einige Schwächen. Die meisten rühren daher, dass es zu jedem Schlüssel drei äquivalente Schlüssel gibt. Deswegen ist die effektive Schlüssellänge nur 126-bit (Kelsey et al., 1996, und Vikram Andem, 2003). Diese Schwäche wurde beim Hacken von Microsofts Spielekonsole Xbox ausgenutzt, da diese TEA als Hash-Funktion verwendete. TEA ist auch anfällig für eine verwandte Schlüssel-Attacke, die 223 gewählte Klartexte bei verwandten Schlüsseln braucht. Wegen dieser Schwächen gibt es eine große Anzahl von Verbesserungsvorschlägen, darunter auch XTEA. ReferenzcodeEs folgt die Adaptierung der Referenzimplementierung der Ver- und Entschlüsselungsroutinen in C, die als Public Domain von David Wheeler und Roger Needham veröffentlicht wurde: void encrypt(unsigned long v[2], unsigned long k[4]) {
unsigned long v0 = v[0], v1 = v[1], sum = 0, i; /* set up */
unsigned long delta = 0x9E3779B9; /* a key schedule constant */
unsigned long k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* 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[0] = v0; v[1] = v1;
}
void decrypt(unsigned long v[2], unsigned long k[4]) {
unsigned long v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i; /* set up; sum is 32*delta */
unsigned long delta = 0x9E3779B9; /* a key schedule constant */
unsigned long k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3]; /* 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[0] = v0; v[1] = v1;
}
Literatur
Weblinks
|
Portal di Ensiklopedia Dunia