2

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_m2crypto总是sig_openssl不同的。意义在于我无法验证使用 M2Crypto 和 OpenSSL 生成的签名,反之亦然。

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

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

4

1 回答 1

5

试试这个:

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上,我真的不知道你是否需要它。

于 2012-06-27T13:12:34.880 回答