我收到了一条使用 .Net RSACryptoServiceProvider 签名的消息,然后将消息发送到 Python 软件,该软件尝试使用 m2crypto(基于 openssl 的库)验证签名。
我有公共证书,它是签名消息的私钥对。
在 .Net 软件发送 sing 之前,它使用 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 本身对消息进行签名时,对签名进行编码、发送,然后解码并验证一切正常......
我将不胜感激任何评论!