從其他幾個密鑰創建加密密鑰並使用散列函式
我想組合兩個或多個密鑰來創建一個依賴於所有密鑰的加密密鑰。這樣做的正確方法是什麼?簡單的異或?使用雜湊函式?還有什麼?
我個人使用這個:k = md5(key1 || key2)。注:|| 是串聯的意思。我使用 md5 是因為我使用 128 位加密,因此需要 128 位輸出密鑰。
我這裡還有一些其他問題:
- 為這個特定目的使用 MD5 安全嗎?
- 我不知道任何其他標準的 128 位輸出雜湊函式。似乎較新的加密雜湊函式都有 256 位和更多的輸出長度。那麼是否使用另一個具有 256/512 位輸出的散列函式,然後將結果截斷到 128 位,其安全程度與使用 MD5 相同或更高?
請注意,key1 和 key2 是隨機密鑰,而不是密碼,因此密鑰拉伸不相關或不適用。
如果相關,我生成了兩個密鑰,並且我知道這兩個密鑰都是加密隨機的。兩個密鑰都不是由不受信任的一方提供的。目前,兩個鍵的長度恰好相同,但如果可能的話,我更喜歡不依賴這個假設的更通用的解決方案。
如果密鑰具有恆定的已知長度,我會將它們連接起來,然後應用 SHA256。如果它們的長度可變,則應用一些分離機制可能會很有用。
截斷散列函式效果很好。如果原始散列函式良好,則截斷散列函式具有相同的屬性,儘管安全級別相應較低。截斷 SHA-256 肯定比使用 MD5 更好。
我推薦類似的東西:
截斷(SHA-256(輸出大小 || 鍵數 || sizeof(key1) || key1 || sizeof(key2) || key2 …), output-size) where output-size <= 256
如果我正確理解你的問題,你有 $ n $ 鍵: $ K_0 $ … $ K_{n-1} $ 你想派生一個密鑰, $ M $ 這樣:
- $ M $ 大小為 128 位(16 字節)。
- $ M $ 是使用確定性算法得出的。
- $ M $ 不能在每個人都不知情的情況下推導出來 $ K $ .
如果每個 $ K $ 大小為 128 位:
$ M = K_0 \oplus K_1 $ … $ \oplus K_{n-1} $
如果每個 $ K $ 小於 256 位:
$ K_x = K_x || [0x00 * (32 - length(K_x))] $
$ K_x = H_{SHA-256d}(K_x) $
$ K_x = truncate(K_x, 16) $
$ M = K_0 \oplus K_1 $ … $ \oplus K_{n-1} $
如果每個 $ K $ 大小大於 256 位:
$ K_x = H_{SHA-256d}(K_x) $
$ K_x = truncate(K_x, 16) $
$ M = K_0 \oplus K_1 $ … $ \oplus K_{n-1} $