CryptoAPI:使用CryptVerifySignature通过公钥验证openssl的签名

时间:2011-02-07 20:38:16

标签: openssl rsa cryptoapi aquaticprime

我正在尝试将Mac的AquaticPrime框架移植到Windows。

在Mac上,它使用的是opensll库,我试着了解如何将它移植到Windows,我想在那里我必须使用CryptoAPI。

我主要需要使用给定公钥验证生成的签名的代码。

以下是使用openssl进行验证的方法:

  1. 输入:许可证数据,公钥和签名,长度均为128个字节。
  2. 根据许可证数据计算SHA1摘要。
  3. 使用公钥数据
  4. 设置RSA上下文
  5. 在给定RSA密钥和签名的情况下调用RSA_public_decrypt(),该签名返回20字节长的SHA1摘要 - 此摘要等于步骤2中的摘要,签名有效。
  6. 那么,我如何使用CryptoAPI执行此操作?我已经走到了这一步:

    1. 从CryptAcquireContext开始(ctx,0,0,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)
    2. this发布的帮助下使用CryptImportKey,pubexp = 3,bitlen = 1024。一切正常,即我没有错误,我查看了二进制数据,以验证它与MSDN文章所显示的相符。
    3. 从许可证数据创建SHA1摘要。我检索了生成的20字节哈希值,看到它与Mac上的openssl相匹配。
    4. 此时,我打电话给:

      CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)
      

      此操作失败,错误代码为ERROR_INVALID_PARAMETER。

      奇怪的是,当我第一次意外地将两倍大的公钥存储到PUBLICKEYBLOB结构中时,我收到了一个N​​TE_BAD_SIGNATURE错误。这可能表明我现在传递的公钥是正确的。

      为什么现在出现ERROR_INVALID_PARAMETER错误?我已经验证了哈希值是正确的,并且密钥似乎也被接受了。并且“sig”参数只是指向签名的128个字节的指针,而sigLen是128.

      那么,我在这里错过了什么?

2 个答案:

答案 0 :(得分:9)

好的,经过大量的反复试验,我解决了这个问题。

签名和公钥数据在处于纯字节字符串形式时都需要反转,即第一个字节到最后一个位置,依此类推。 然后上面的工作。

答案 1 :(得分:-3)

静态编译并链接OpenSSL libCrypto。可以这样做,我在前雇主那里看到了这一点。