【问题标题】:Bad Magic Number error when trying to Decrypt file in OpenSSL尝试在 OpenSSL 中解密文件时出现错误的幻数错误
【发布时间】:2013-10-03 14:19:49
【问题描述】:

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

des -d -in Encrypted.txt -out normal.txt

输入密码后我收到错误的幻数错误:通过

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

我在堆栈溢出中搜索了所有帖子,没有找到可以解决我问题的文章,请帮助解决这个问题。

【问题讨论】:

    标签: openssl


    【解决方案1】:

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

    最简单的解决方案是在解密之前base64 --decode

    例如,考虑这个 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
    

    【讨论】:

    • 好点。您希望您的示例 openssl 显示什么?我从echo -n 'Zm9vCg==' | base64 --decode 得到foo,不管macos 上的openssl 命令。
    • 感谢@rustyMagnet,我的回答有点混乱,现在改进示例!
    【解决方案2】:

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

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

    我得到正确的输出:

    hello world

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

    【讨论】:

    • 在解密之前是否必须将消息编码为base64?
    • 没有。 base64 只是一种表示不可打印字符的便捷方式。如果加密消息是 base64 格式,则必须在解密之前对其进行解码。事实上,openssl 的des 命令有一个内置的base64 编码/解码选项(-a)。所以,你需要做的就是openssl des -d -a -in Encrypted.txt -out normal.txt
    • 是的,执行了该命令,但我仍然收到“Bad Magic Number error”
    • 它只包含这个“U2FsdGVkX18ztmw81FTK/c+jAf8xtcZdIpesuV2PLDM=”
    • 我什至在 Windows 上尝试了上述命令,它可以工作。在这一点上我唯一的建议是确保Encrypted.txt 的末尾有一个换行符。如果没有,那么 OpenSSL 将给出 "error reading input file" 错误。 OpenSSL 给出"bad magic number" 错误的唯一方法是base64 解码的输出不是以字符串Salted__ 开头,或者您没有在命令行中指定-a。我验证了如果您在上面粘贴的字符串是 base64 解码的,那么前 8 个字符确实是 Salted__。因此,请确保您确实提供了 -a
    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多