Encryption

從其他幾個密鑰創建加密密鑰並使用散列函式

  • January 10, 2013

我想組合兩個或多個密鑰來創建一個依賴於所有密鑰的加密密鑰。這樣做的正確方法是什麼?簡單的異或?使用雜湊函式?還有什麼?

我個人使用這個:k = md5(key1 || key2)。注:|| 是串聯的意思。我使用 md5 是因為我使用 128 位加密,因此需要 128 位輸出密鑰。

我這裡還有一些其他問題:

  1. 為這個特定目的使用 MD5 安全嗎?
  2. 我不知道任何其他標準的 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} $

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