M2Crypto RSA.sign与OpenSSL rsautl -sign
问题内容:
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。
问题答案:
尝试这个:
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上一样,我真的不知道是否需要它。