Aes

AES 256 中輸入與輸出相同的機率

  • August 4, 2016

注意:我假設在輸入密鑰和明文時,它們的格式與輸出 AES-256 加密文本的方式相同。

如果有的話,您輸入的密鑰最終與 AES-256 加密後的輸出完全相同的機率是多少?

或者:

如果有的話,您輸入的明文(預加密消息)最終與 AES-256 加密後的輸出完全相同的機率是多少?

通常您根本不輸入密鑰。也許您輸入密碼,然後將其轉換為密鑰。任何人通常輸入密鑰的唯一時間是在測試期間以及可能在密鑰管理期間(例如,在多個部分中備份密鑰,將其列印在紙上)。

即使 AES 確實輸出與密鑰相同的字節,只要字節是隨機的就沒有關係;攻擊者永遠不會知道它。因此,擔心這一點的唯一原因是當您想使用 AES 派生密鑰時。AES 的輸出是一個偽隨機排列,其中每個結果都與另一個結果一樣可能。AES 沒有輸出具有特殊屬性的“弱密鑰”,因此您不能錯誤地輸入弱密鑰。

如前所述,AES 的輸出為 128 位,因此它本身永遠不會輸出 256 位。您需要一種操作模式,例如 ECB、CBC 或 CTR 來執行此操作。具有操作模式的 AES 的輸出取決於協議和操作模式本身。


不過,要派生密鑰,您最好使用密鑰派生函式 (KDF)。基於密碼的 KDF 用於將密碼轉換為密鑰。眾所周知的是 scrypt、bcrypt、PBKDF2。如果要從主密鑰派生其他密鑰,可以使用基於密鑰的 KDF,例如HKDF。如果必須使用 AES,請使用NIST SP-800 108中指定的計數器模式 KDF 。

KDF 的優點之一是您可以將輸出大小指定為 256 位。還有其他屬性,例如具有標籤、執行密鑰拉伸和可選地使用鹽,這使得它們比普通雜湊或塊密碼更好地派生密鑰。


注意永遠不要混淆文本和二進制。所有現代密碼原語都對字節進行操作。您需要字元編碼(例如 UTF-8)和可能的編碼(例如 base 64)操作來在文本和二進制之間進行轉換。

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