-->

M2Crypto RSA.sign VS OpenSSL的rsautl -sign(M2Crypto

2019-09-18 14:48发布

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和反之亦然生成的签名。

有什么在我的代码丢失,使它们互相不兼容?

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

Answer 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"))

现在你SIGS应该是相同的。

要查看签名文件是实际上可以,你可以使用:

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



文章来源: M2Crypto RSA.sign vs OpenSSL rsautl -sign