gpt4 book ai didi

openssl - CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名

转载 作者:行者123 更新时间:2023-12-01 17:43:28 32 4
gpt4 key购买 nike

我正在尝试移植 AquaticPrime适用于 Mac 到 Windows 的框架。

在 Mac 上,它使用 opensll 库,我尝试了解如何将其移植到 Windows,我猜我必须在 Windows 上使用 CryptoAPI。

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

以下是使用 openssl 完成验证的方式:

  1. 输入:许可证数据、公钥和签名,均为 128 字节长。
  2. SHA1 摘要是根据许可证数据计算得出的。
  3. 使用公钥数据设置 RSA 上下文
  4. 在给定 RSA key 和签名的情况下,调用 RSA_public_decrypt(),该方法返回 20 字节长的 SHA1 摘要 - 如果此摘要等于步骤 2 中的摘要,则签名有效。

那么,我该如何使用 CryptoAPI 来做到这一点?我已经走到这一步了:

  1. 从 CryptAcquireContext(ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) 开始
  2. this 的帮助下使用 CryptImportKey发布,pubexp=3 和 bitlen=1024。这一切都有效,即我没有收到任何错误,并且我查看了二进制数据以验证它是否与 MSDN 文章显示的内容相匹配。
  3. 根据许可证数据创建 SHA1 摘要。我检索了生成的 20 字节哈希值,发现它与我在 Mac 上使用 openssl 得到的值相匹配。

此时,我调用:

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

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

奇怪的是,当我第一次不小心将两倍大的公钥存储到 PUBLICKEYBLOB 结构中时,我收到了 NTE_BAD_SIGNATURE 错误。这可能表明现在我传递的公钥是正确的。

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

那么,我在这里缺少什么?

最佳答案

好的,经过多次尝试和错误,我解决了这个问题。

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

关于openssl - CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926276/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com