Encryption

OpenSSL 用於解密字元串

  • December 24, 2016

如果這不是正確的社區,我深表歉意。

我有一個字元串,我相信它是使用 RC2 密碼加密的。我知道密鑰和 IV,但我正在努力使用 OpenSSL 解密它。我知道純文字應該是什麼。

$ echo MY_CIPHER_TEXT | openssl enc -d -base64 -rc2 -iv MY_IV

系統提示我輸入解密密碼,但我總是收到回复

bad magic number

我相信這意味著 openssl 不能將 MY_CIPHER_TEXT 辨識為密文,但我很難理解為什麼。

有人可以幫助解釋為什麼我收到“壞幻數”響應嗎?

MY_CIPHER_TEXT = nKZQD6RKk9ozeGV5WOMVL9TDZTgg9mOZjDpBDqIocR8OGC+WcB4xAwDx7XTaJNv9v+Y3sEzNphtET6sXxBd0e/0Oh6g2d0LrKls2BFHGbaMynEVW2xy4xLP40se55zdawVLGImSxgiBtf9unfIJYN4EpdPlMiiB2TuvyEoUUtqQ=

MY_VI = jqn76XOl4To=

知道算法 RC2 是不夠的;您還需要匹配操作模式和某些模式填充方案。OpenSSL 命令行(以及大部分 EVP API)預設為 CBC 模式和“PKCS5”(技術上是 PKCS7)填充,這可能正確也可能不正確。

openssl enc預設情況下進行基於密碼的加密和解密,這意味著用於密碼的實際密鑰和 IV(ECB 除外,它沒有 IV)是通過稱為基於密碼的密鑰派生函式 (PBKDF)的散列過程派生的 - 和一個非標準的啟動;您給出的任何論點都將-iv被忽略——這很好,因為您給出的論點無論如何都是無效的,見下文。OpenSSL PBKDF(與其他更好的一樣)使用隨機“鹽”,該鹽必須以特定於 OpenSSL 的格式儲存在密文的開頭,並且缺少該鹽會導致您的錯誤消息bad magic number。有關更多詳細資訊,請參閱https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/35614#35614 .

由於您擁有密鑰,而不是密碼和 IV,請將它們都轉換為十六進制(不是 base64)並使用:

openssl enc -base64 -d -rc2[-mode] -K $key_in_hex -iv $iv_in_hex
# note that's -K uppercase not -k lowercase 
# you can use -a as a synonym for -base64 
# For a block mode like CBC if standard PKCS5/7 padding wasn't used
# add -nopad and handle the last few bytes manually as needed.
# If your input is more than 76 chars per line (as your Q showed) 
# and OpenSSL version before 1.1.0 you also need -A (uppercase).

將 base64 轉換為十六進制的方法有很多,但一種方便的方法是:

somevar=$( echo some_base64 | openssl base64 -d | xxd -p )
# xxd -p outputs only the hex with no labels or ASCII etc
# and thus is suitable as an argument to openssl enc 
# without any processing by tools like sed, tr, awk 

引用自:https://unix.stackexchange.com/questions/332519