【发布时间】:2012-02-03 07:39:54
【问题描述】:
我收到了一条使用 .Net RSACryptoServiceProvider 签名的消息,然后将消息发送到 尝试使用 m2crypto(基于 openssl 的库)验证签名的 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 本身签署消息时,对签名进行编码、发送,然后解码并验证一切正常......
我会很感激任何 cmets!
【问题讨论】:
标签: openssl digital-signature m2crypto