我收到了一条用.Net RSACryptoServiceProvider签名的消息,然后将消息发送给 尝试使用m2crypto(基于openssl的lib)验证符号的Python软件。
我已经获得了公共证书,这是与邮件签名的私钥对。
在.Net软件发送之前,它会使用ByteArrayToString对其进行转换,因为该符号是使用以下代码生成的:
//Convert plain text into a byte array to sign.
byte[] data = new UTF8Encoding().GetBytes(phrase);
SHA1Managed sha1 = new SHA1Managed();
byte[] hashBytes = sha1.ComputeHash(data);
byte[] sig = csp.SignData(hashBytes, CryptoConfig.MapNameToOID("SHA1"));
因此发送给接收者的签名是
ByteArrayToString(sig)
Python部分是:
def verify(message, signature, cert_path):
msg = hashlib.sha1(message).hexdigest()
certificate = M2Crypto.X509.load_cert(cert_path)
pubkey = certificate.get_pubkey()
pubkey.reset_context(md='sha1')
pubkey.verify_init()
pubkey.verify_update(msg)
sgn = signature.decode('base64')
is_verified = pubkey.verify_final(sgn)
我无法得到验证...我认为Python部分中的签名编码可能存在问题,但也许有人可以看到其他任何错误?
当我使用我自己的证书(使用openssl生成)并签署来自Python本身的消息时,对签名进行编码,发送,然后解码并验证一切正常......
感谢任何评论!
答案 0 :(得分:0)
我无法保证我的答案,因为我从未使用m2crypto,但我认为该消息是两次哈希。在
sha1.ComputeHash(数据)
和
csp.SignData(hashBytes,CryptoConfig.MapNameToOID(“SHA1”))
关于SignData
的{{3}}指定:
使用。计算指定字节数组的哈希值 指定的哈希算法,并对生成的哈希值进行签名。
因此,我不认为您应该在生成签名之前预先散列消息。