Cryptanalysis
微型加密算法 (TEA) 的弱點
維基百科指出,不同倍數的魔法常數用於防止基於回合對稱性的簡單攻擊。魔常數,
2654435769
或被0x9E3779B9
選為⌊ $ 2^{32} $ /φ⌋,其中 φ 是黃金比例。並根據wiki提供的程式碼。
void encrypt (uint32_t* v, uint32_t* k) { uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */ uint32_t delta=0x9e3779b9; /* a key schedule constant */ uint32_t 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; }
既然常數是已知的,那麼這個常數如何防止攻擊呢?我被困在描述中。
常數
delta
在這裡是為了sum
改變,所以使用不同的輪函式,這是Feistel結構安全的必要條件。如果
delta
為零,sum
將保持為零,並且循環內部將簡化為v0 += ((v1<<4) + k0) ^ v1 ^ ((v1>>5) + k1); v1 += ((v0<<4) + k2) ^ v0 ^ ((v0>>5) + k3);
它對所有奇數和所有偶數輪使用相同的輪函式 - 並且比原始輪更簡單。這是一些密碼分析攻擊的理想基礎,最值得注意的是滑動攻擊(如其他答案中所指出的那樣)。
魔術值的目標是
sum
32 個循環中的每一個循環的值都像任意(偽隨機)值一樣,每個循環都是唯一的(每個循環執行兩輪)。這個目標還沒有完全達到(特別是,位 $ i $ 之後的sum
重複次數 $ 2^{i+1} $ 循環,如下圖所示),但使用更複雜的 PRNG 生成sum
會減慢密碼。每個請求的插圖:
i sum (hex) sum (binary) 0 9e3779b9 10011110001101110111100110111001 1 3c6ef372 00111100011011101111001101110010 2 daa66d2b 11011010101001100110110100101011 3 78dde6e4 01111000110111011110011011100100 4 1715609d 00010111000101010110000010011101 5 b54cda56 10110101010011001101101001010110 6 5384540f 01010011100001000101010000001111 7 f1bbcdc8 11110001101110111100110111001000 8 8ff34781 10001111111100110100011110000001 9 2e2ac13a 00101110001010101100000100111010 10 cc623af3 11001100011000100011101011110011 11 6a99b4ac 01101010100110011011010010101100 12 08d12e65 00001000110100010010111001100101 13 a708a81e 10100111000010001010100000011110 14 454021d7 01000101010000000010000111010111 15 e3779b90 11100011011101111001101110010000 16 81af1549 10000001101011110001010101001001 17 1fe68f02 00011111111001101000111100000010 18 be1e08bb 10111110000111100000100010111011 19 5c558274 01011100010101011000001001110100 20 fa8cfc2d 11111010100011001111110000101101 21 98c475e6 10011000110001000111010111100110 22 36fbef9f 00110110111110111110111110011111 23 d5336958 11010101001100110110100101011000 24 736ae311 01110011011010101110001100010001 25 11a25cca 00010001101000100101110011001010 26 afd9d683 10101111110110011101011010000011 27 4e11503c 01001110000100010101000000111100 28 ec48c9f5 11101100010010001100100111110101 29 8a8043ae 10001010100000000100001110101110 30 28b7bd67 00101000101101111011110101100111 31 c6ef3720 11000110111011110011011100100000
(bit 0)的最右邊位
sum
交替為 0 或 1,並且該循環在 2 次循環後重複。更一般地說,位 $ i $ 之後的sum
重複次數 $ 2^{i+1} $ 循環,一些(以及其他弱點)在更好的 PRNG 生成時不會發生sum
。