為什麼 SHA-384 吞吐量可能低於 hashcat 中的 SHA-512 吞吐量並且更安全?
我在網上找到了一個 hashcat 基準測試結果:hashcat results :
- SHA-384 為17065.4 MH/s
- SHA-512 為17280.3 MH/s
為什麼 SHA-512 花費的時間更少?SHA-512 更長,我認為因此需要更多時間和計算資源來計算雜湊?
計算中的唯一區別是初始值和輸出大小。來自NIST FIPS 180-4
- 初始雜湊值, $ H^{(0)} $ , 應按 Sec 中的規定設置。5.3.4;和
- 384位消息摘要通過截斷最終雜湊值得到 $ H ^{(N)} $ , 到它最左邊的 384 位: $$ H_0^{(N)} \mathbin|H_1^{(N)} \mathbin|H_2^{(N)} \mathbin|H_3^{(N)} \mathbin|H_4^{(N)} \mathbin| H_5^{(N)} $$
比較兩個原始碼inc_hash_sha384.cl和inc_hash_sha512.cl可以看出,實際上 SHA-384 的工作量比 SHA-512 少。它沒有編碼,只是用不同的初始值截斷 SHA-512。對於微小的速度差異,一種解釋可能是在最終計算期間有助於 SHA-512 的矢量化。
在密碼保護的情況下,微小的差異並沒有太大的區別。實際上,在密碼散列中,我們使用了專門設計的密碼機制,例如 PBKDF2 和 Argon2,它們是密碼散列競賽的獲勝者。
從安全形度來看,SHA384 對長度擴展攻擊具有抵抗力,而 SHA512 則沒有。SHA384 對長度擴展攻擊具有 128 位的抵抗力,因為攻擊者需要猜測 128 位來執行攻擊。這是由於截斷。
不同的初始值提供**域分離**。帶域分離 $$ \operatorname{SHA384}(m) \neq \operatorname{SHA512}(m)|{384} $$在哪裡 $ |{384} $ 是截斷。
在通用攻擊中的原像、二次原像和抗碰撞性的情況下,我們有;
$$ \begin{array}{|c|c|c|c|}\hline & \text{pre-image resistance} & \text{2. pre-image resistance} & \text{collision resistance} \\hline \operatorname{SHA-384} & \mathcal{O}(2^{384}) & \mathcal{O}(2^{384}) & \mathcal{O}(2^{192}) \\hline \operatorname{SHA-512} & \mathcal{O}(2^{512}) & \mathcal{O}(2^{512}) & \mathcal{O}(2^{256}) \\hline \end{array} $$
碰撞阻力為 $ \mathcal{O}(\sqrt{2^{n}}) = \mathcal{O}(2^{n/2}) $ 由於一般的生日攻擊。
所以; SHA-512在原像、二次原像、抗碰撞等方面表現更好。SHA-512 唯一的弱點是它容易受到長度擴展攻擊。
為什麼 SHA-512 花費的時間更少?
不是出於密碼相關的原因。只有檢查程式碼(原始碼,也許是對象)才能知道。本質上,SHA-384 是具有不同起始常數的 SHA-512,然後刪除了 128 位結果。一種可能性是這種刪除是在單獨的程式碼中使用 SHA-512 的程式碼作為子程序。這也可能是一個程式碼對齊問題,一個分支被採用還是沒有被採用……不管是什麼原因,它在 crypto.SE 上是題外話。
SHA-512 更長,因此我認為它需要更多的時間和計算資源來計算雜湊
是的,SHA-512 更長;但是不,它不需要更多的時間,因為在內部它對最終被截斷的 512 位結果進行操作。不計算額外的 128 位幾乎沒有什麼可節省的:大約 1/4 的 80 位(即 0.32%)和兩個 64 位加法(即 0.4%)。