Openssl 使用m2crypto进行RSACryptServiceProvider消息签名验证

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

我收到一封与.Net RSACryptServiceProvider签名的邮件,然后将该邮件发送到 Python软件,尝试使用m2crypto(基于openssl的lib)验证签名

我有一个公共证书,这是一对用于签名消息的私钥

在.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部分中的签名编码可能有问题,但也许有人可以在这里看到其他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部门忘了告诉我这件事。。