Symmetric

是否有正確的方法來生成對稱密鑰?

  • October 7, 2015

查看一些密碼算法,我意識到:明文的加密/解密方式總是被指定的,但是密鑰呢?我看到的每篇描述該算法的論文都從未展示過生成密鑰的方法,而是展示了可用的密鑰大小。

這引出了一個問題:作為正在實施算法的人,我應該如何生成密鑰?例如:Twofish 論文 ( https://www.schneier.com/paper-twofish-paper.pdf ) 說 Twofish 的可用密鑰大小為 128、192 和 256 位,但我應該如何創建 128 位密鑰?甚至我發現的參考實現也不包含似乎旨在成為密鑰生成算法的程式碼(再次談到 Twofish)。

對於大學工作,我將在 C# 中編寫 Twofish 的簡單實現,我需要一種創建密鑰的方法,但我不知道該怎麼做,或者即使有正確的方法來做到這一點,這就是為什麼我問這個問題。

一個真實的例子:當我使用 GnuPG ( https://www.gnupg.org/ ) 使用對稱密鑰加密任何東西時,它不會生成任何密鑰等,它只是要求輸入密碼並執行。幕後發生了什麼?GPG 如何使用此密碼以及它與密鑰生成有何關係?

對稱密鑰不需要採用任何特定格式——它們只是一個(偽)隨機位序列。

大多數程式環境都提供某種“安全隨機”機制(CSPRNG)。您可以使用它來獲取適當長度的字節數組(例如 AES256 的 32 字節),它可以用作密鑰。確保傳入原始字節,而不是例如十六進制編碼的字元串。

或者,您可能希望從其他來源派生密鑰。密鑰派生函式 (KDF) 是將某些輸入轉換為密鑰的函式。GPG 使用基於密碼的 KDF(PBKDF,也稱為“密碼雜湊”)將密碼轉換為對稱密鑰。

許多 PBKDF 使用迭代散列方法;您可能有興趣查看“PBKDF2”的設計,或者查看scrypt以獲得更現代的設計。不過,一般來說,作為開發人員,您可以使用現有的實現,而不必特別關注底層細節。

為了完整起見,還有一些基於密鑰的 KDF,例如 HKDF 可以從其他密鑰派生對稱密鑰,但我懷疑這不是您所追求的。

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