使用m2crypto进行RSACryptoServiceProvider消息签名验证

时间:2012-01-05 13:21:39

标签: openssl digital-signature m2crypto

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

感谢任何评论!

1 个答案:

答案 0 :(得分:0)

我无法保证我的答案,因为我从未使用m2crypto,但我认为该消息是两次哈希。在

  

sha1.ComputeHash(数据)

  

csp.SignData(hashBytes,CryptoConfig.MapNameToOID(“SHA1”))

关于SignData的{​​{3}}指定:

  

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

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