Des

OPENSSL中的DES算法是隨機的嗎?

  • May 6, 2014

查看 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 如何完全不同。什麼時候encrypted1encrypted2被解密他們給我同樣的純文字?

使用該-k選項,您可以指定密碼。密碼並不是真正的加密密鑰,因此 OpenSSL 使用密鑰派生過程將密碼轉換為加密密鑰。事實證明,預設情況下 OpenSSL 在該派生過程中使用鹽(這就是您Salted__在輸出中看到的原因,這很神奇,表明接下來的 8 個字節是隨機生成的鹽)。密文僅從字節 16 開始。

如果鹽值改變,加密密鑰也會改變。如果加密密鑰發生變化,密文也會發生變化。預設情況下,OpenSSL 每次執行都會生成一個新的隨機鹽。這就是為什麼您會看到不斷變化的密文。

要關閉它,您可以添加-nosalt. 這對於測試目的來說很好。如OpenSSL 文件中所述,“除了測試目的或與 OpenSSL 和 SSLeay 的舊版本兼容之外,不應使用選項”。否則,您的密文是確定性的,可能導緻密碼分析和損壞(即不安全)系統。

或者-K,讓您直接以十六進制指定密鑰值,完全跳過(OpenSSL 特定的)密碼密鑰派生 - 因此鹽生成 - 完全。在這種情況下,您還需要指定使用的 IV -iv。如果密鑰被重用,IV 應該是隨機的,以實現 CBC 模式的安全性,但 IV 的生成留給使用者。

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