【问题标题】:RSACryptoServiceProvider message signature verification with m2cryptoRSACryptoServiceProvider 使用 m2crypto 进行消息签名验证
【发布时间】: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


    【解决方案1】:

    我无法保证我的答案,因为我从未使用过 m2crypto,但我认为该消息被散列了两次。在

    sha1.ComputeHash(数据)

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

    关于SignDataMSDN documentation 指定:

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

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

    【讨论】:

    • 谢谢 Jcs - 我刚刚找到了你的答案。我的客户向我提供了一条消息,已经发送了两次……但他的 IT 部门忘记通知我了……
    猜你喜欢
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2017-04-12
    • 2011-03-28
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多