尝试在OpenSSL中解密文件时出现错误的幻数错误

尝试在OpenSSL中解密文件时出现错误的幻数错误,openssl,Openssl,我正在使用最新版本的OpenSSL for Windows,我正在尝试解密一条消息U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=使用DES加密(密码为:pass),我正在使用以下命令 des -d -in Encrypted.txt -out normal.txt 在输入密码:pass后,我收到了错误的幻数错误 Encrypted.txt包含加密消息U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM= 并且norma

我正在使用最新版本的OpenSSL for Windows,我正在尝试解密一条消息
U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=
使用DES加密(密码为:
pass
),我正在使用以下命令

des -d -in Encrypted.txt -out normal.txt
在输入密码:pass后,我收到了错误的幻数错误

Encrypted.txt包含加密消息
U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=
并且normal.txt为空


我在stack overflow中搜索了所有帖子,没有找到可以解决我问题的文章,请帮助解决此问题。

des命令的输入不应在base64中。相反,您需要首先对base64输出进行解码,然后将其提供给OpenSSL
des
命令。例如,当我在Linux上运行以下操作时:

echo U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=| openssl enc-base64-d | openssl des-d

我得到了正确的输出:

hello world


由于Windows不适合使用管道,因此必须将输出重定向到中间文件,然后运行单个的
openssl
命令。

openssl可以使用
-a
-base64
开关在同一步骤中对base64进行解码和解密。但是openssl的base64处理中有一个bug,它希望base64编码数据的末尾有一个换行符

最简单的解决方案是在解密之前对
base64进行解码

例如,考虑这个Base64加密输出:

# echo foo | openssl enc -aes256 -md sha512 -pass pass:pass -e -base64

U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw=
如果用换行符发送,效果很好。但如果没有,它就失败了

# echo 'U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw=' | openssl enc -aes256 -md sha512 -pass pass:pass -d -base64

foo

# echo -n 'U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw=' | openssl enc -aes256 -md sha512 -pass pass:pass -d -base64

error reading input file
您可以先使用cat插入换行符,或使用其他实用程序解码base64:

# echo -n 'U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw=' | cat - <(echo "") | openssl enc -aes256 -md sha512 -pass pass:pass -d -base64

foo

# echo -n 'U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw=' | base64 --decode | openssl enc -aes256 -md sha512 -pass pass:pass -d

foo

——echo-n'U2FsdGVkX182tdJx07S5YoPzi9XhyONdR8Xbc6V1jiw='——cat-在解密之前必须将消息编码到base64吗?不。base64只是表示不可打印字符的一种方便方式。如果加密的消息是base64格式,则必须在解密之前对其进行解码。事实上,openssl的
des
命令有一个内置的base64编码/解码选项(
-a
)。所以,你所需要做的就是
openssl des-d-a-in Encrypted.txt-out normal.txt
yes执行了这个命令,我仍然得到了“坏的幻数错误”,它只包含了这个“U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=”我甚至在Windows上尝试了上面的命令,它仍然有效。此时我唯一的建议是确保在
Encrypted.txt
的末尾有一个换行符。如果没有,那么OpenSSL将给出一个
“读取输入文件时出错”
错误。OpenSSL给出“坏幻数”错误的唯一方法是base64解码输出不是以字符串
Salted\uuuuuuuuuuuu
开头,或者您没有在命令行中指定
-a
。我验证了如果您上面粘贴的字符串是base64解码的,那么前8个字符确实是
Salted_u
。因此,请确保您确实提供了一个
-a
。很好。您希望您的示例openssl显示什么?我从
echo-n'Zm9vCg='| base64--decode
获得
foo
,而不管macos上的
openssl
命令。谢谢@rustyMagnet,我的答案有点混乱,现在改进了示例!