Md5

MD5算法中的函式公式

  • February 27, 2020

當我閱讀 MD5 時,有許多複雜的公式,例如:

$ k_i := \lfloor \space| \sin(i + 1) \times 2^{32}| \space\rfloor $

我的問題是為什麼使用 sin(),cos() 或 tan() 或類似的東西怎麼樣。使用 sin() 有什麼意義嗎?或者只是為了更複雜的公式導致更安全的算法?

在 MD5 中,浮點運算公式的使用僅限於建構 64 個nothing-up-my-sleeves 32 位常量。大多數實現使用預先計算的表,以提高啟動效率和可移植性。

改變 $ \sin $ 至 $ \cos $ 會改變常數,但據我們所知,這會使算法既不弱也不強。這就是無所事事的常量的本質。

使用會有問題 $ \tan $ , 因為 $ \tan(11)\approx-225.95 $ ,因此 floor 的輸入將是 40 位。我們需要一個至少有 40 位結果的下限變數,保留結果的低 32 位部分,並確保 $ \tan $ 對於從一個實現到另一個實現的可移植值,在尾數中被評估為至少 40 位精度。


MD5 有其他看起來任意的公式,對同化為 32 位向量的 32 位無符號整數進行操作。這些已針對其加密屬性進行了優化,隨意更改它們會導致削弱算法的高風險(更重要的是:未滿足其抗碰撞的安全目標)。


¹順便說一句:使用 Arduino 中的內置浮點算法計算 MD5 常數將無法生成正確的表,因為那裡的雙精度類型不足(不一致),並會導致低位 8 位有嚴重的偏見,可能帶來負面的加密後果。同樣的效果會導致許多使用 GPS 的 Arduino 程式碼的準確度明顯低於應有的準確度。但我離題了。

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