Des
OPENSSL中的DES算法是隨機的嗎?
查看 encrypted1.bin 和 encrypted2.bin 的十六進制轉儲。他們都有相同的密碼 A 用於加密 sampletext
[achilles:~/Arena/crypto] $ openssl enc -e -des -in plaintext -out encrypted1.bin enter des-cbc encryption password: Verifying - enter des-cbc encryption password: [achilles:~/Arena/crypto] $ openssl enc -e -des -in plaintext -out encrypted2.bin enter des-cbc encryption password: Verifying - enter des-cbc encryption password:
因此,兩者都使用相同的密碼加密相同的文本。現在,當我對它們進行 hexdump 時,我得到了
[achilles:~/Arena/crypto] $ hd encrypted1.bin 00000000 53 61 6c 74 65 64 5f 5f 50 cc a6 a8 6f 52 cf 53 |Salted__P...oR.S| 00000010 c7 8e 71 ea 98 4b 2a 8c a1 4d bd 0f d0 90 62 cb |..q..K*..M....b.| 00000020 b1 a0 7a ef b5 a8 c1 14 |..z.....| 00000028 [achilles:~/Arena/crypto] $ hd encrypted2.bin 00000000 53 61 6c 74 65 64 5f 5f 0c c2 44 d0 19 bb a9 5e |Salted__..D....^| 00000010 af 56 24 ce b3 b4 30 4f 61 1c f4 ba bd fc 1d a7 |.V$...0Oa.......| 00000020 b4 99 77 b9 1c 15 8a 42 |..w....B| 00000028
這怎麼可能?對於具有相同密碼和相同算法 (DES) 的相同純文字的加密,hexdump 如何完全不同。什麼時候
encrypted1
和encrypted2
被解密他們給我同樣的純文字?
使用該
-k
選項,您可以指定密碼。密碼並不是真正的加密密鑰,因此 OpenSSL 使用密鑰派生過程將密碼轉換為加密密鑰。事實證明,預設情況下 OpenSSL 在該派生過程中使用鹽(這就是您Salted__
在輸出中看到的原因,這很神奇,表明接下來的 8 個字節是隨機生成的鹽)。密文僅從字節 16 開始。如果鹽值改變,加密密鑰也會改變。如果加密密鑰發生變化,密文也會發生變化。預設情況下,OpenSSL 每次執行都會生成一個新的隨機鹽。這就是為什麼您會看到不斷變化的密文。
要關閉它,您可以添加
-nosalt
. 這對於測試目的來說很好。如OpenSSL 文件中所述,“除了測試目的或與 OpenSSL 和 SSLeay 的舊版本兼容之外,不應使用此選項”。否則,您的密文是確定性的,可能導緻密碼分析和損壞(即不安全)系統。或者
-K
,讓您直接以十六進制指定密鑰值,完全跳過(OpenSSL 特定的)密碼密鑰派生 - 因此鹽生成 - 完全。在這種情況下,您還需要指定使用的 IV-iv
。如果密鑰被重用,IV 應該是隨機的,以實現 CBC 模式的安全性,但 IV 的生成留給使用者。