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

2023-11-21

我正在尝试移植水族总理Mac 到 Windows 的框架。

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

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

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

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

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

  1. 从 CryptAcquireContext(ctx, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) 开始
  2. 在以下工具的帮助下使用 CryptImportKeythis发布,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 错误呢?我已经验证哈希值是正确的,并且密钥似乎也被接受。而“sig”参数只是一个指向签名128字节的指针,sigLen为128。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名 的相关文章

随机推荐

  • 如何更改搜索结果中的“使用 create-react-app 创建”?

    我试图将我的投资组合的链接发布到 linkedin 上 但它总是显示 使用 React 应用程序创建的网站 作为描述 这绝对不会使它看起来很专业 它部署在我的域上 但有什么方法可以摆脱我的域链接上的所有 create react app 默
  • 如何实现词性 (POS) 标注器

    我正在寻找基于 PHP 的最佳方法来扫描大量文本条目 分类 并提取关键字 有人知道词性标记吗 有 PHP 风格的方法来做到这一点吗 我扫描了很多在线分类广告 但没有一个有类别 为了加快分类过程 我希望安装词性标注器 http en wiki
  • Laravel Fluent Query Builder 与子查询连接

    好吧 经过几个小时的研究并仍在使用 DB select 我必须问这个问题 因为我正准备扔掉我的电脑 我想获取用户的最后一个输入 基于时间戳 我可以用原始 sql 来做到这一点 SELECT c p FROM users c INNER JO
  • SSRS 计数 IF 多个值

    我正在创建一份教育报告 我有很多成绩 我想将 A C 的成绩数量相加 类似于 SUM WHERE Grades IN A B C 我如何在表达式中执行此操作 我可以对 Choose 语句进行 SUM 或其他操作吗 我试过 SUM Choos
  • 使用 OUT 参数从函数返回列表

    我想创建一个 CMake 函数 function test src list dst list do something endfunction usage test my list chg list 它的意思是 my list是一个包含多
  • SQL Server 中默认的锁定粒度是多少?

    我已彻底阅读MSDN 关于表格提示而且我似乎没有找到默认的锁定粒度 假设我有以下查询 SELECT TOP 1 FROM MyTable WITH UPDLOCK READPAST ORDER BY SomeColumn ASC 你看 我指
  • 通过哈希值比较长字符串

    为了提高比较字符串的函数的性能 我决定通过比较它们的哈希值来比较它们 那么 如果两个非常长的字符串的哈希值彼此相等 那么是否可以保证这些字符串也彼此相等 虽然可以保证 2 个相同的字符串会给您相同的哈希值 但反之则不然 对于给定的哈希值 总
  • Android获取布局父id

    我想知道 View 和 ViewParent 之间有什么区别 我正在尝试获取父级的 IDImageView但这我做不到 myImageView getParent getId 那么还有其他方法可以获取这个id吗 我想知道 View 和 Vi
  • 对 matplotlib 中的不同子图使用相同的颜色条

    我使用以下过程在子图中绘制不同的图形 fig figure figsize 10 11 subplots adjust wspace 0 5 hspace 0 2 iplot 330 for i in range 9 iplot 1 ax
  • Windows.Web.Http.HttpClient 超时选项

    由于 SSL 证书问题 我们在应用程序服务层中使用 Windows Web Http HttpClient API 我为我的项目引用了以下示例 http code msdn microsoft com windowsapps HttpCli
  • 如何从 WCF REST 方法返回自定义 HTTP 状态代码?

    如果 WCF REST 调用中出现问题 例如找不到请求的资源 我如何在我的 OperationContract 方法中使用 HTTP 响应代码 例如 将其设置为 HTTP 404 之类的代码 有一个WebOperationContext您可
  • 如何在 C# 中通过 XML 序列化输出十六进制数字?

    我有一些类和结构 我使用 XML 序列化来保存和调用数据 但我想要的一个功能是以十六进制表示形式输出整数 我可以在这些结构上添加任何属性来实现这一点吗 有一点代码味道 但以下内容will work public class ViewAsHe
  • C# Windows 窗体中的状态栏

    我找不到用于实现状态栏的控件 我怎样才能手动完成呢 我认为您正在寻找 StatusStrip 控件 这是一篇关于它的文章 这是一个MSDN 文章
  • 如何在 Nuxt 中使路由区分大小写

    我使用 nuxt js vue js 我需要创建路由器区分大小写 我发现以下属性 caseSensitive 我试图将其放入 nuxt config 但它不起作用 可以通过大写的链接进行转换 如果我直接更改文件 project nuxt r
  • 如何在R中用多边形裁剪世界地图?

    我导入了世界地图数据集www GADM org使用 R 包栅格 我想将其剪切到我创建的多边形中以减小地图的大小 我可以检索数据并且可以毫无问题地创建多边形 但是当我使用 gIntersection 命令时 我收到一条晦涩的错误消息 关于如何
  • JavaMail 与 Gmail:535-5.7.1 用户名和密码不被接受

    当我尝试使用 JavaMail API 发送邮件时收到错误 并且我确信用户名和密码 100 正确 我连接的 Gmail 帐户是一个较旧的帐户 因为他们说它需要时间才能与新帐户一起使用 收到错误 DEBUG SMTP RCVD 535 5 7
  • 无法初始化类 com.amazonaws.partitions.PartitionsLoader

    使用 Eclipse Mars 我已经通过帮助安装软件添加了 aws java sdk 1 11 123 现在 当我运行 Tomcat Server 7 时 出现此错误 May 02 2017 11 57 32 PM org apache
  • C++内部如何实现多态性?

    尊敬的先生 我应该告诉你关于所提出的问题我知道什么和不知道什么 以便你可以解决我理解的薄弱环节 我知道c 通过使用Vtable 指针数组 来实现多态性 每个指针都指向类的虚函数 层次结构中的每个类都有一个虚函数表 现在假设我有以下课程 cl
  • Erlang 函数的返回值

    下面的函数会返回什么 好的原子还是Cmd function test gt Cmd os cmd ls io format The result of ls is p n Cmd 如果它返回 ok 那么应该如何改写以返回 Cmd 同时仍然使
  • CryptoAPI:使用 CryptVerifySignature 使用公钥验证来自 openssl 的签名

    我正在尝试移植水族总理Mac 到 Windows 的框架 在 Mac 上 它使用 openssl 库 我尝试了解如何将其移植到 Windows 我猜我必须使用 CryptoAPI 我主要需要使用给定的公钥验证生成的签名的代码 以下是使用 o