2

我收到了一条使用 .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 本身对消息进行签名时,对签名进行编码、发送,然后解码并验证一切正常......

我将不胜感激任何评论!

4

1 回答 1

0

我不能保证我的答案,因为我从未使用过 m2crypto,但我认为该消息被哈希了两次。在

sha1.ComputeHash(数据)

csp.SignData(hashBytes, CryptoConfig.MapNameToOID("SHA1"))

MSDN 文档关于SignData指定:

使用指定的散列算法计算指定字节数组的散列值,并对生成的散列值进行签名。

因此,我认为您不应该在生成签名之前对消息进行预散列。

于 2012-01-06T18:03:51.123 回答