Encryption
OpenSSL 用於解密字元串
如果這不是正確的社區,我深表歉意。
我有一個字元串,我相信它是使用 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