【问题标题】:M2Crypto RSA.sign vs OpenSSL rsautl -signM2Crypto RSA.sign 与 OpenSSL rsautl -sign
【发布时间】:2012-06-28 15:08:08
【问题描述】:

M2Crypto 和 OpenSSL CLI 似乎没有创建相同的数字签名。这是我在 Python 中使用的代码:

import M2Crypto
rsa = M2Crypto.RSA.load_key("privkey.pem")
open("sig_m2crypto", "w").write(rsa.sign("md5-digest", "md5"))

这里是 OpenSSL 的命令行:

echo "md5-digest" | openssl rsautl -sign -inkey privkey.pem > sig_openssl

同样的输入,sig_m2cryptosig_openssl 的结果总是不同的。意义在于我无法验证使用 M2Crypto 和 OpenSSL 生成的签名,反之亦然。

我的代码中是否缺少任何使它们彼此不兼容的内容?

附加信息:我在 Windows 7 下使用 M2Crypto 0.21.1 和 OpenSSL 1.0.0。

【问题讨论】:

    标签: python openssl digital-signature pki m2crypto


    【解决方案1】:

    试试这个:

    echo -n "test" | openssl md5 -sign privkey.pem > sig_openssel
    

    -n 很重要,因此不会在字符串后添加额外的换行符)*

    在 python 方面:

    import M2Crypto
    import hashlib
    rsa = M2Crypto.RSA.load_key("privkey.pem")
    digest = hashlib.new('md5', 'test').digest()
    open("sig_m2crypto", "w").write(rsa.sign(digest, "md5"))
    

    现在你的签名应该是相同的。

    要查看签名文件中的实际内容,您可以使用:

    openssl rsautl -inkey privkey.pem -verify -in sig_m2crypto -asn1parse
    

    openssl rsautl -inkey privkey.pem -verify -in sig_m2crypto -raw -hexdump
    

    正确的签名包含有关所用摘要的信息,如果您只使用openssl rsautl -sign ...,则不包含该信息

    *编辑:至少在linux上,因为你在windows上,我真的不知道你是否需要它。

    【讨论】:

    • 有效!我还需要提醒自己在 Windows 中打开文件时使用"wb",因为它区分文本模式和二进制模式。 -n 的好电话,差点忘了。我在 Windows 下使用 MinGW。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多