Openssl 使用m2crypto进行RSACryptServiceProvider消息签名验证
我收到一封与.Net RSACryptServiceProvider签名的邮件,然后将该邮件发送到 Python软件,尝试使用m2crypto(基于openssl的lib)验证签名 我有一个公共证书,这是一对用于签名消息的私钥 在.Net软件发送sing之前,它会使用ByteArrayToString对其进行转换,因为该符号是由以下代码生成的:Openssl 使用m2crypto进行RSACryptServiceProvider消息签名验证,openssl,digital-signature,m2crypto,Openssl,Digital Signature,M2crypto,我收到一封与.Net RSACryptServiceProvider签名的邮件,然后将该邮件发送到 Python软件,尝试使用m2crypto(基于openssl的lib)验证签名 我有一个公共证书,这是一对用于签名消息的私钥 在.Net软件发送sing之前,它会使用ByteArrayToString对其进行转换,因为该符号是由以下代码生成的: //Convert plain text into a byte array to sign. byte[] data = new UTF8E
//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部分中的签名编码可能有问题,但也许有人可以在这里看到其他bug
当我使用我自己的证书(用openssl生成)并对来自Python本身的消息进行签名时,对签名进行编码,发送签名,然后解码并验证一切正常工作
如果您有任何意见,我将不胜感激 我无法保证我的答案,因为我从未使用过m2crypto,但我认为该消息被散列了两次。在 sha1.ComputeHash(数据) 及 SignData(hashBytes,CryptoConfig.MapNameToOID(“SHA1”)) about
SignData
指定:
使用
指定哈希算法,并对结果哈希值进行签名
因此,我认为您不应该在生成签名之前对消息进行预哈希处理。我无法保证我的答案,因为我从未使用过m2crypto,但我认为消息经过了两次哈希处理。在 sha1.ComputeHash(数据) 及 SignData(hashBytes,CryptoConfig.MapNameToOID(“SHA1”)) about
SignData
指定:
使用
指定哈希算法,并对结果哈希值进行签名
因此,我认为您不应该在生成签名之前预先散列消息。谢谢Jcs-我刚刚找到了您的答案。我的客户给我发了两次信。。。但是他的IT部门忘了告诉我这件事。谢谢Jcs,我刚刚找到了你的答案。我的客户给我发了两次信。。。但是他的IT部门忘了告诉我这件事。。