Sha-1
計算 SHA1 迭代的最快方法
眾所周知,並行計算大量雜湊函式(如 SHA1)在大多數情況下都需要使用 GPU。但是,在串列執行某些操作時,例如計算
sha1(sha1(sha1(...sha1(x))))
並行性似乎沒有那麼有用。我最近遇到了這個問題,我開始使用 python 在我的 Mac 筆記型電腦上以大約 270k 雜湊/秒的速度執行一個程序。轉向 C 實現,我能夠獲得 750k 雜湊/秒。奇怪的是,使用帶有 Kali 的 VirtualBox 和相同的 C 實現,大約 1.3m 雜湊/秒。
(網上可以找到一些關於為什麼 SHA1 程式碼的 Linux 版本可能比 Mac OS 版本更快的討論,即使前者是通過虛擬化層,但這超出了我的問題範圍。)
***問題:***如果我想盡可能快地計算 SHA1 並且並行性沒有幫助,那麼最快的方法是什麼?我想答案涉及特殊硬體?還是購買具有良好 CPU 和超頻的台式機?
沒有已知的數學技巧來計算 SHA-1 的迭代。在軟體中獲得高吞吐量包括:
盡可能使用並行性;也就是說,如果從多個點開始。取決於為什麼計算可能的 SHA-1 迭代。
將程式碼專門用於計算作為雜湊獲得的 20 字節消息的雜湊,在主迭代中刪除字節順序轉換和填充。也就是說,計算一個 $ n $ - 迭代每個 SHA-1 的消息:
按照普通 SHA-1 對消息進行雜湊處理;
將 (bytestring) 結果轉換為 5 個 native-endian 32 位字,產生目前迭代;
重複 $ n-1 $ 次:
- 執行單個 SHA-1 輪次,從 SHA-1 初始化向量 0x67452301 0xEFCDAB89 0x98BADCFE 0x10325476 0xC3D2E1F0 開始,散列由目前迭代的 5 個字、9 個零字、字 0x000000A0 組成的 16 字塊(對於 160 位) , 和一個零字; 產生目前迭代的新值,僅操作 32 位(或更寬)量;
將目前迭代轉換為(字節串)結果。
仔細編碼和微優化,也許是在組裝中。僅通過更改編譯器就可以實現 73% 的吞吐量增加,這很重要。在可能有幫助的技術中:
- 完全展開 80 輪
- 利用 IV 中的常量字和 16 字塊散列
(b&c)|((~b)&d)
是((b^c)&d)^c
,這可能對第 0..19 輪有幫助(或沒有幫助)(b&c)|(c&d)|(d&b)
是((d|b)&c)|(d&b)
並且通常有助於第 40..59 輪- 明智地安排並選擇要註冊的內容。
更新:在選定的 CPU 上,有特殊說明;請參閱這份英特爾白皮書和參考程式碼。