Des

DES 對輸入的 1 位更改:為什麼當我將兩個輸入僅更改一位時,我會得到可預測的結果?

  • October 21, 2016

我預計兩個輸入(相同鍵)的 1 位更改將提供 50% 的輸出位(平均)的差異。但是當我測試它時,情況並非如此。但是,對於兩個“相同”的輸入,但密鑰相差一位,差異“是”如預期的那樣。為什麼會這樣?

範例 1(相同的密鑰,兩個輸入僅相差 1 位)

Key:    0123456789ABCDEF
Input:  0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
Output: 56CC09E7CFDC4CEF56CC09E7CFDC4CEF56CC09E7CFDC4CEF

Key:    0123456789ABCDEF
Input:  1123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
Output: 236617CA247292D156CC09E7CFDC4CEF56CC09E7CFDC4CEF

從第 17 個字元開始,這兩個輸出是相同的。

範例 2:(密鑰相差 1 位,輸入相同)

Key:    0123456789ABCDEF
Input:  0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
Output: 56CC09E7CFDC4CEF56CC09E7CFDC4CEF56CC09E7CFDC4CEF

Key:    1123456789ABCDEF
Input:  0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
Output: 472C14ED890C7CB5472C14ED890C7CB5472C14ED890C7CB5

這裡的輸出完全不同。正如人們所期望的那樣。

DES 塊大小為 64 位,您的輸入是 3 個 DES 塊,您僅在第一個輸入塊中更改 1 位,並在 ECB 模式下加密整個輸入而無需填充;更改後的第一個輸出塊完全不同,第二個和第三個塊是相同的,應該是。

這是歐洲央行的運作模式:

在此處輸入圖像描述

DES 確實具有雪崩效應,並且在您的實驗中可見。

Key:    0123456789ABCDEF
Input:  0123456789ABCDEF
Output: 56CC09E7CFDC4CEF

Key:    0123456789ABCDEF
Input:  1123456789ABCDEF
Output: 236617CA247292D1

這改變了 64 位中的 38 位,這足夠接近 32 位的平均值。

你的第一個實驗的問題是你沒有執行 DES——你執行了一個基於 DES 的算法。DES是一種塊密碼,塊大小為 64 位:加密函式將 56 位密鑰¹和 64 位輸入(一個輸入塊)映射到 64 位輸出(一個輸出塊)。如果你想加密或解密一個比一個塊更短或更長的字元串,那麼單獨的 DES 是做不到的。要建構可以處理​​任意大小消息的密碼,您需要將分組密碼插入**操作模式**。

您使用了ECB操作模式,該模式僅適用於塊大小的倍數的輸入,並獨立加密每個塊。ECB 沒有雪崩效應——這應該是顯而易見的,因為通過構造一個輸入塊的內容只會影響相應輸出塊的內容。

ECB 不是一種適合安全的操作模式,除非在極少數情況下您需要加密大小正好是一個塊的數據。它僅由加密庫提供,因為建構庫不支持的操作模式有時很有用,但是您應該傳遞由單個塊組成的輸入。

最常見的數據機密性操作模式(即有效的加密)是帶有一些填充的CBC(CBC 本身需要輸入是塊大小的倍數,填充模式指定如何處理不是某些輸入的倍數塊大小)和點擊率。DES-CBC-PKCS#7、DES-CBC-X.923 和 DES-CTR 是三個可以處理任意³消息大小的密碼範例,它們都具有雪崩效應。

¹由於歷史原因,此 56 位密鑰的標準表示使用 64 位,每個字節中有一個奇偶校驗位。這沒有密碼學原因²,這只是一個歷史事故。

²事實上,DES 很有可能被縮減為 56 位,而不是原來的 64 位設計,專門為了使其更弱於暴力攻擊。

³更準確地說,任意數量的字節(甚至是 CTR 的任意數量的位),最大不超過略小於 $ 2^{2^n} \cdot 2^n $ 位在哪裡 $ n $ 是以位為單位的塊大小 - 基本上,您需要能夠適應一個塊中的塊數。這在實踐中不是問題。

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