Md5
MD5 實現
作為個人項目,我想在 FPGA 上實現 MD5,但我對實現的細節有些疑問。我如何實現算法的第一個來源是 RFC 1321,其中有一個虛擬碼解釋了第 1 輪將按以下方式執行:
/* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */ [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
行。很公平。能夠並行化算法打破了我的夢想,因為在每一步中都會更新一個變數(A、B、C 或 D),並且每一步都需要先前的值。
因此,為了尋找某種方法來並行化算法的某些部分,我發現了一本書的這一章:
第 31(5) 頁的表 2.1 給出了該算法的另一個公式。當然,它是相似的,但不一樣。根據這本書,唯一更新的值是 B。顯然,這與RFC 1321 中的原始實現不同。
我的問題是:
- 這是具有完全相同結果的原始實現的另一種形式嗎?(我想是這樣,但由於這本書沒有解釋導致方程的步驟,我想確定一下)
- 這些新方程是如何推導出來的?
RFC 1321中的描述是正確的。本書樣本中的那個也是如此。差異相當於符號。書中提到的 ABCD 相當於第一個、第二個、第三個和第四個參數
$$ abcd k s i $$RFC 1321 中的符號和問題。 本書在每一輪訪問相同的變數。RFC 的變數訪問模式不同,每輪節省三個 32 位分配,這將在軟體方面產生可觀的成本。詳細說明(以下評論):
- 從書本開始 $ A,B,C,D $ 匹配 RFC 的
A
,B
,C
,D
, 第一步[ABCD 0 7 1]
(在 RFC 中)
- 這本書移動了前者 $ D $ 對新 $ A $ , 前者 $ C $ 對新 $ D $ , 前者 $ B $ 對新 $ C $ , 計算 $ B_\text{new} $ 並將其分配給新的 $ B $ .
- RFC 計算相同的值 $ B_\text{new} $ RFC 註釋
a
,將其分配給A
,並保留B
,C
並且未D
更改。
- 現在有了這本書 $ A,B,C,D $ 在 RFC 中註明的第二步中匹配 RFC 的
D
,A
,B
, ,C``[DABC 1 12 2]
- 這本書移動了前者 $ D $ 對新 $ A $ , 前者 $ C $ 對新 $ D $ , 前者 $ B $ 對新 $ C $ , 計算 $ B_\text{new} $ 並將其分配給新的 $ B $ .
- RFC 計算相同的值 $ B_\text{new} $ RFC 註釋
a
,將其分配給D
,並保留A
,B
並且未C
更改。那時書的 $ A,B,C,D $ 匹配 RFC 的C
,D
,A
,B
.這種每一步的輪換繼續進行。步驟後 $ i $ 和 $ i $ 倍數 $ 4 $ ,包括在最後一輪之後,這本書的 $ A,B,C,D $ 匹配 RFC 的
A
,B
,C
,D
.我在 MD5 中知道的唯一變化是 32 位字中的字節順序錯誤。這發生在第一個給出 MD5 碰撞的出版物中,並迅速得到糾正。