如何選擇加密散列函式中使用的函式?
我正在學習加密雜湊函式,並且對壓縮函式中使用的函式有一些疑問。
MD5 使用以下函式:
$ f_{1}(B,C,D)=(B\wedge C)\lor(D\wedge \lnot B) $
$ f_{2}(B,C,D)=(B\wedge D)\lor(C\wedge\lnot D) $
$ f_{3}(B,C,D)=B\oplus C\oplus D $
$ f_{4}(B,C,D)=C\oplus(B\lor\lnot D) $
SHA-1 使用以下函式:
$ f_{1}(B,C,D)=(B\wedge C)\lor(D\wedge \lnot B) $
$ f_{2}(B,C,D)=B\oplus C\oplus D $
$ f_{3}(B,C,D)=(B\wedge C)\lor(B\wedge D)\lor(C\wedge D) $
$ f_{4}(B,C,D)=B\oplus C\oplus D $
SHA-2 使用以下函式:
$ f_{1}(B,C,D)=(B\wedge C)\lor(D\wedge \lnot B) $
$ f_{2}(B,C,D)=(B\wedge C)\oplus(B\wedge D)\oplus(C\wedge D) $
我想知道這些功能是如何選擇的。
我知道 XOR 在混合輸入位方面非常有效,但我不知道為什麼像這樣的函式 $ (B\wedge C)\oplus(B\wedge D)\oplus(C\wedge D) $ (SHA-2) 比 $ (B\wedge C)\lor(B\wedge D)\lor(C\wedge D) $ (SHA-1)。
有人可以澄清為什麼某些功能表現更好嗎?以及如何選擇特定功能。
所考慮的函式是 3 位到 1 位的二進制函式(擴展為位向量,即按位函式)。有 $ 2^{(2^3)}=256 $ 這樣的功能。
所有考慮的功能都是平衡的;也就是說,函式輸出 0 和函式輸出 1 的輸入組合數量相等。這將函式的數量減少到 $ 8!/(4!)^2=70 $ .
聚合相同的平衡函式 $ 3!=6 $ 訂單和 $ 2^3=8 $ 的極性 $ 3 $ 輸入只留下 $ 6 $ 類(見最後一節);在每個類中保持字典順序的第一個函式:
z y x g0 g1 g2 g3 g4 g5 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1
其中,它被排除在外
g0
,g4
因為它們的至少一個輸入對輸出沒有影響。其他四個函式表現出傾向於有利於擴散的特性:
- 對於固定為任一極性的任何輸入,當我們改變其他輸入時,輸出是非恆定的;
- 他們的任何輸入都會影響其他輸入的四種組合中的至少兩種的輸出。
這些倖存的功能是:
g1
多數,用於 $ f_3 $ SHA-1 和 $ f_2 $ SHA-2(結果是相同的)g2
選擇,用於 $ f_1 $ 和 $ f_2 $ MD5, $ f_1 $ SHA-1, $ f_1 $ SHA-2;此功能也稱為 Select,或Digital Multiplexer(輸入x
是1
or0
選擇哪個y
orz
是輸出);g3
,用於(在輸入的順序和反轉內) $ f_4 $ MD5;如評論中所述,該功能 $ (x\wedge y)\oplus z $ 也是Toffoli 門的第三個輸出;g5
奇偶校驗,用於 $ f_3 $ MD5, $ f_2 $ 和 $ f_4 $ SHA-1。每條評論的添加:
g1
並且g2
還具有任何輸入影響其他輸入的四種組合中的最多三種的輸出的屬性;或者,換句話說,它們的任何輸入都不是完全線性的。這在某種意義上是可取的,因為過多的線性會導致一些差分攻擊。這可能是SHA-2和在 SHA-2 中g1
更g2
受歡迎的原因。g3``g5
一條評論要求推導在輸入的順序和極性內相同的 3 位到 1 的平衡函式類別。我們將用 8 位值表示一個函式 $ b_{000},b_{001},b_{010},b_{011},b_{100},b_{101},b_{110},b_{111} $ 給出輸出 $ b_{zyx} $ 對於 3 個輸入的 8 種組合 $ z,y,x $ .
平衡函式有 $ b_{000}+b_{001}+b_{010}+b_{011}+b_{100}+b_{101}+b_{110}+b_{111}=4 $ . 我們按字典順序掃描它們(等效地,使用 big-endian 約定時的數字順序);如果不排除,那是代表一個新類的函式,我們排除了通過輸入排列或改變輸入極性可從中獲得的函式。我們可以通過考慮應用或不應用以下 6 種轉換中的任何一種來做到這一點(應用 64 種組合存在一些冗餘,並且許多功能被多次排除,但它沒有害處):
- 將輸出轉為 $ b_{000},b_{010},b_{001},b_{011},b_{100},b_{110},b_{101},b_{111} $ (交換 $ x $ 和 $ y $ )
- 將輸出轉為 $ b_{000},b_{001},b_{100},b_{101},b_{010},b_{011},b_{110},b_{111} $ (交換 $ y $ 和 $ z $ )
- 將輸出轉為 $ b_{000},b_{100},b_{010},b_{110},b_{001},b_{101},b_{011},b_{111} $ (交換 $ z $ 和 $ x $ )
- 將輸出轉為 $ b_{001},b_{000},b_{011},b_{010},b_{101},b_{100},b_{111},b_{110} $ (補充 $ x $ )
- 將輸出轉為 $ b_{010},b_{011},b_{000},b_{001},b_{110},b_{111},b_{100},b_{101} $ (補充 $ y $ )
- 將輸出轉為 $ b_{100},b_{101},b_{110},b_{111},b_{000},b_{001},b_{010},b_{011} $ (補充 $ z $ )
我們首先得到
00001111
=g0
,然後排除00110011
,01010101
,10101010
,11001100
,11110000
; 然後得到00010111
=g1
,並排除00101011
,01001101
,01110001
,10001110
,10110010
,11010100
,11101000
; 等等。最後只有6個班。