Key-Derivation

當我已經從“加密安全的 RNG”中獲得足夠的字節時,是否有必要拉伸/派生 AES 密鑰?

  • May 13, 2020

我正在使用帶有 PKCS#7 兼容填充的 AES-CBC-256。我已經有 32 個字節來自“加密安全隨機數生成器”。在這種情況下,使用 PBKDF2 派生最終用於加密/解密的密鑰是否有意義?

我的情況是我需要將舊程式碼移植到新堆棧。一切正常,但我還沒有實現密鑰派生。在舊庫中,輸入是 32 個隨機字節 + 32 個字節鹽(全部使用https://www.cryptopp.com/docs/ref/class_auto_seed_random_pool.html生成初始隨機字節),被視為“密碼” , 並且使用 65536 次迭代的 PBKDF2 來導出最終密鑰。

我認為 PBKDF2 應該從短使用者密碼中派生出更大的秘密,但在這裡它用於從 2 * 32 字節塊中派生出 32 字節的秘密。

我從被認為是“密碼安全的隨機數生成器”的東西中獲得了 32 個字節,這意味著我已經有足夠的熵。我需要派生密鑰嗎?是否添加任何安全性?

你是對的。除非軟體做了一些非常奇特的事情,在閱讀程式碼和文件時應該很明顯,我無法想像它會是什麼,否則鹽生成和 PBKDF2 的應用是不必要的。

如果您有來自加密安全隨機生成器的 32 個字節,則可以將這 32 個字節用作 AES-256 密鑰。CSRNG 盡其所能:它是一致隨機且不可猜測的。

您將使用(“普通”,非拉伸)密鑰推導從一些不一定均勻隨機但具有足夠熵的輸入中確定性地獲取密鑰。需要密鑰推導步驟的典型情況是 Diffie-Hellman密鑰交換算法的輸出:它需要是確定性的,以便雙方計算相同的密鑰,並且不能直接使用 DH 計算的輸出,因為它是一個具有一些數學屬性的數字,因此它不是均勻分佈的。另一種需要密鑰派生的情況是,當您有一些長度有限的秘密材料(但足以使暴力無法找到它:至少 128 位),並且您想要構造總長度超過秘密材料。

CSRNG 將源作為輸入並應用偽隨機計算(CSPRNG:密碼安全偽隨機數生成器)來產生隨機輸出。密鑰推導函式 (KDF) 接受輸入並應用偽隨機計算以產生偽隨機輸出。CSPRNG 和密鑰派生函式具有非常相似的安全屬性:只要攻擊者沒有看到秘密輸入,即使攻擊者看到了輸出的一部分,他們也無法弄清楚輸出的一部分沒有給他們。僅僅這樣做是沒有意義的把它們鎖起來。將它們與第三件事結合起來可能是有意義的,例如使用 CSRNG 生成公共鹽和 KDF 將此公共鹽與密鑰組合以生成另一個密鑰,或使用 KDF 生成種子對於 CSRNG,然後它會被不再有權訪問原始 KDF 的子系統使用。

當輸入具有低熵時,拉伸密鑰推導函式(例如 PBKDF2)很有用。“低熵”意味著輸入可以通過蠻力合理猜測。CSRNG 輸出的長度具有最大熵,128 位(16 字節)足以將其置於蠻力猜測範圍之外。(量子密碼分析可能會在未來將標準提高到 256 位。)密鑰拉伸用於足夠短以便記憶的秘密,通常是密碼或密碼片語。您需要對 CSRNG 的輸出應用密鑰拉伸的唯一原因是,如果此輸出故意保持簡短以便作為密碼記憶(大概以適合人類的編碼形式,例如一串可列印字元或單詞列表)。

從 CSRNG 獲取 64 個字節並通過 PBKDF2 傳遞它們沒有任何意義。只需使用 CSRNG 輸出作為鍵。使用 PBKDF2 不是直接的安全風險,但它會損害性能並增加攻擊面。請注意,如果目前軟體這樣做,則表明作者不了解他們在做什麼,並且可能存在其他實際上是安全漏洞的問題。

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