Cryptanalysis

微型加密算法 (TEA) 的弱點

  • September 13, 2018

維基百科指出,不同倍數的魔法常數用於防止基於回合對稱性的簡單攻擊。魔常數,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);

它對所有奇數和所有偶數輪使用相同的輪函式 - 並且比原始輪更簡單。這是一些密碼分析攻擊的理想基礎,最值得注意的是滑動攻擊(如其他答案中所指出的那樣)。

魔術值的目標是sum32 個循環中的每一個循環的值都像任意(偽隨機)值一樣,每個循環都是唯一的(每個循環執行兩輪)。這個目標還沒有完全達到(特別是,位 $ 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

引用自:https://crypto.stackexchange.com/questions/62283