OpenSSL 用于解密字符串

OpenSSL 用于解密字符串

如果这不是正确的社区,我深表歉意。

我有一个字符串,我认为它是使用 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 

相关内容