如果这不是正确的社区,我深表歉意。
我有一个字符串,我认为它是使用 RC2 密码加密的。我知道密钥和 IV,但我很难使用 OpenSSL 解密它。我知道纯文本应该是什么。
$ echo MY_CIPHER_TEXT | openssl enc -d -base64 -rc2 -iv MY_IV
我输入了解密密码,但总是收到回复
bad magic number
我相信这意味着 openssl 无法将 MY_CIPHER_TEXT 识别为加密文本,但我很难理解为什么。
有人可以帮助解释为什么我收到“Bad Magic Number”回复吗?
MY_CIPHER_TEXT = nKZQD6RKk9ozeGV5WOMVL9TDZTgg9mOZjDpBDqIocR8OGC+WcB4xAwDx7XTaJNv9v+Y3sEzNphtET6sXxBd0e/0Oh6g2d0LrKls2BFHGbaMynEVW2xy4xLP40se55zdawVLGImSxgiBtf9unfIJYN4EpdPlMiiB2TuvyEoUUtqQ=
MY_VI = jqn76XOl4To=
答案1
仅仅了解 RC2 算法还不够;还需要了解 RC2 算法。你还需要匹配操作模式以及某些模式的填充方案。 OpenSSL 命令行(以及大部分 EVP API)默认为 CBC 模式和“PKCS5”(技术上是 PKCS7)填充,这可能正确,也可能不正确。
openssl enc
默认情况下基于密码的加密和解密,即实际的密钥和四(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