Sha-1

計算 SHA1 迭代的最快方法

  • June 27, 2018

眾所周知,並行計算大量雜湊函式(如 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 上,有特殊說明;請參閱這份英特爾白皮書參考程式碼


為了達到極致的速度,有FPGAASIC會更快,但很浪費。

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