Encryption

生成加密安全、多次使用的對稱加密密鑰

  • July 23, 2012

我需要生成標題中形容詞所描述的 256 位加密密鑰。目前我打算使用這個RNG創建密鑰。

這是一種創建密鑰的安全方式,因為它具有以下屬性:

  • 用於對稱加密的私鑰
  • 多次使用(當然使用獨特的 IV)

並給出以下事實:

  • 我只會讓 RNG 產生 32 個隨機字節
  • 不做任何事情 (1) SALT (2) 迭代 (3) 其他任何事情

請注意,我只是詢問生成後直接生成的密鑰是否安全。謝謝

**短篇小說:**最終,您的問題歸結為 Windows RNG 的質量問題。如果您的 RNG 很好,您的方法很好,但您相信很大程度上不透明的 Windows RNG 可以為您提供完美的 32 字節熵。我建議生成更多字節,然後使用散列或 KDF 將其壓縮為 32 個字節。

**稍長一點的故事:**所有好的隨機密鑰都是根據相同的原理生成的: $ n $ 位密鑰是從提供的源生成的 $ m $ 輸出位 $ n $ 一點點的熵。如果源是高質量的熵輸出,那麼充其量 $ n = m $ 直接輸出可以作為key使用。否則,您將使用雜湊或 KDF 之類的東西來壓縮 $ m $ 熵位 $ n $ 位鍵。選擇一個好的熵源,它輸出的隨機字節將是一個好的密鑰。

在您的情況下,您使用的是主機作業系統提供的推薦加密 RNG。這似乎是一個相當安全的 RNG 源,但總的來說,我們喜歡對這些事情保持謹慎,因為有很多實際的事情可能會出錯。由於微軟沒有公佈細節,預設情況下我們傾向於對此持懷疑態度。可能會輸出一系列低熵字節,RNG 可能構造錯誤,並且我們的密鑰的妥協可能導致系統的 RNG 狀態以及未來或過去密鑰的妥協,以及其他此類問題。為了減輕這些故障,通常好的做法是在將 RNG 輸出轉換為密鑰之前將其通過雜湊或 KDF 傳遞(即使 $ n = m $ ).

Windows CryptGenRandom API 是 Windows RNG 的另一個入口,我認為它的工作方式與您引用的 .NET 呼叫非常相似。請注意,它至少部分被逆向工程並對其進行了一些攻擊,儘管我不認為低熵本身就是其中之一。

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