我正在尝试移植水族总理Mac 到 Windows 的框架。
在 Mac 上,它使用 openssl 库,我尝试了解如何将其移植到 Windows,我猜我必须使用 CryptoAPI。
我主要需要使用给定的公钥验证生成的签名的代码。
以下是使用 openssl 进行验证的方式:
- 输入:许可证数据、公钥和签名,均为 128 字节长。
- SHA1 摘要是根据许可证数据计算得出的。
- 使用公钥数据设置 RSA 上下文
- 给定 RSA 密钥和签名,调用 RSA_public_decrypt(),它返回 20 字节长的 SHA1 摘要 - 如果该摘要等于步骤 2 中的摘要,则签名有效。
那么,我该如何使用 CryptoAPI 来做到这一点呢?我已经走到这一步了:
- 从 CryptAcquireContext(ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) 开始
- 在以下工具的帮助下使用 CryptImportKeythis发布,pubexp=3 和 bitlen=1024。这一切都有效,即我没有收到任何错误,并且我查看了二进制数据以验证它是否与 MSDN 文章显示的内容相匹配。
- 从许可证数据创建 SHA1 摘要。我检索了生成的 20 字节哈希值,发现它与我在 Mac 上使用 openssl 得到的值相匹配。
此时,我调用:
CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)
此操作失败,并显示错误代码 ERROR_INVALID_PARAMETER。
奇怪的是,当我第一次不小心将两倍大的公钥存储到 PUBLICKEYBLOB 结构中时,我收到了 NTE_BAD_SIGNATURE 错误。这可能表明现在我传递的公钥是正确的。
那么为什么现在会出现 ERROR_INVALID_PARAMETER 错误呢?我已经验证哈希值是正确的,并且密钥似乎也被接受。而“sig”参数只是一个指向签名128字节的指针,sigLen为128。
那么,我在这里缺少什么?
好的,经过多次尝试和错误,我解决了这个问题。
签名和公钥数据在采用纯字节字符串形式时都需要反转,即第一个字节到最后一个位置,依此类推。
然后上面的工作就完成了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)