Microsoft CryptoAPI:如何将 PUBLICKEYBLOB 转换为 DER/PEM?

2023-12-01

我有一个生成的 RSA 密钥对,存储为 PRIVATEKEYBLOB 和 PUBLICKEYBLOB,并且我需要能够将这些密钥转换为 DER 或 PEM 格式,以便我可以在 PHP 或 Python 中使用它。我发现我可以使用 CryptEncodeObject 函数将 PRIVATEKEYBLOB 转换为 DER。为了做到这一点,我需要使用 PKCS_RSA_PRIVATE_KEY 编码标志。但我找不到任何关于如何将 PUBLICKEYBLOB 转换为 DER 的线索。

这是我的 PRIVATE KEY BLOB 转换代码:

LPCSTR type = PKCS_RSA_PRIVATE_KEY;
DWORD  encd = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;

DWORD dlen = 0;
if(!CryptEncodeObject(encd, type, key, null, &dlen))
{ LOG_ERROR(); return false; }

// Buffer allocation (der variable)

if(!CryptEncodeObject(encd, type, key, der, &dlen))
{ LOG_ERROR(); return false; }

我通过将密钥与 openssl 工具的输出进行比较来测试我的密钥:

openssl rsa -pubin -inform MS\ PUBLICKEYBLOB -in pub.ms -outform DER -out pub.der
openssl rsa -inform MS\ PRIVATEKEYBLOB -in pri.ms -outform DER -out pri.der

添加:我尝试使用 X509_ASN_ENCODING 进行 RSA_CSP_PUBLICKEYBLOB,但结果与 openssl 工具的输出不同,并且密钥导入失败。 openssl 导出的 DER 长了 25 个字节,并且两个密钥中只有前 3 个字节相等。关键对比图如下:

Side-by-side key comparison

如果我们仔细观察这张图片,我们可以看到 openssl 的密钥版本在第 3 个字节之后有某种额外的 24 字节标头。到目前为止还没有弄清楚它是什么,但如果我将这个硬编码标头与从 CryptEncodeObject 和 RSA_CSP_PUBLICKEYBLOB 获得的输出连接起来,一切都可以正常工作。但不确定该标头是否始终相同。


使用 RSA_CSP_PUBLICKEYBLOB,如中所述https://msdn.microsoft.com/en-us/library/windows/desktop/aa378145(v=vs.85).aspx

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

Microsoft CryptoAPI:如何将 PUBLICKEYBLOB 转换为 DER/PEM? 的相关文章

随机推荐

  • 显然缺少 getline() 的重载,在 GCC 4.7.2 和 Clang 3.2 中将 RRef 传输到流

    我在尝试使用时遇到了意外的编译错误getline 使用临时流对象 include
  • mysqli 中的输出 Inserted.row

    我有以下sql表 ID 电子邮件 fbid 当我执行查询时 INSERT INTO users email fbid VALUES randomvalue otherrandomvalue 我想获取插入行的 id 为此 我尝试像这样编辑查询
  • NodeJS:智能 JSON 转换为 Excel 文件

    我正在使用 NodeJS 我想将 JSON 格式的对象导出到 Excel 文件 我很清楚有 至少 三个 npm 包用于此目的 但到目前为止 这些包都没有给我我梦想的输出 这是我的 javascript 对象 var myObject has
  • System.Text.Json.JsonSerializer.Deserialize() 的 .net 5.0 签名更改

    我正在尝试从 NET Core 3 1 到 NET 5 0 并在使用时收到一堆可空性警告Deserialize
  • java中从HTML中删除css信息

    是否有任何库或预先编写的代码可以从 HTML 代码中删除 css 属性 要求是 Java 代码必须解析输入的 html 文档 并删除 css 属性并生成输出 html 文档 例如 如果输入 html 文档具有此元素 p class abc
  • CasperJS/PhantomJS .then 在 do/while 循环中不起作用

    像这样的事情对我来说似乎很合乎逻辑 但导致幻像 wtfcrash 这就是它在日志中的名称 但没有提供有用的信息 do casper then function var targetFound false links this evaluat
  • Java 反射:创建一个实现类

    Class someInterface Class fromName some package SomeInterface 我现在如何创建一个新类来实现someInterface 我需要创建一个新类 并将其传递给需要的函数SomeInter
  • 如何在 android 中的 EditText 上显示数字键盘?

    我基本上只是想在某个 EditText 获得焦点后立即切换到数字键盘模式 您可以配置一个inputType为您EditText
  • 从另一个类方法更新 UI - Cocoa

    我想从 AppDelegate 更新应用程序中的 UI 但每当我这样调用它时 Controller object Controller alloc init object methodHere 好像没有更新UI 我在这里做错了什么 我已经放
  • 如何在flutter图表中显示json数据

    我对 flutter 还很陌生 我一直在尝试在条形图中显示来自 http 请求的一些数据 我找不到任何这方面的例子 我希望你们中的一些人能够提供帮助 我想用这个Chart来自在线画廊 我刚刚更改了我的应用程序的类名称 import pack
  • Sitecore 站点/项目发布在初始化时挂起

    我们的核心数据库出现问题 该数据库已由前一天的备份数据库恢复 之后 该网站工作正常 但我们在发布任何更改时遇到问题 一旦点击发布按钮 发布正在初始化 消息就会持续很长时间 截至 发布开始 结束 的事件日志中也未捕获到这一点 因此 当我们尝试
  • 如何重新启用 event.preventDefault?

    我有一个网页 已阻止所有提交按钮上的默认操作 但是我想重新启用按钮上的默认提交操作 我该如何执行此操作 我目前正在使用以下方法阻止默认操作 form bind submit function e e preventDefault 我已经使用
  • Android SwitchCompat风格

    我在我的新设备上使用 Android 5 1 1 测试了我的应用程序 在我的 SettingsActivity 中我有一个开关 我已经阅读了一些帖子并将其更改为android support v7 widget SwitchCompat但问
  • C中父进程向子进程发送信号

    我的子进程无法开始工作 我需要传递信号并执行readUsual功能 这是一小段代码 int main pid t pid2 fork if pid2 lt 0 printf Can t create child process n else
  • Julia 变量范围

    我试图在 while 循环中使用一些全局变量 m n r 但 Julia 1 0 0 告诉我这些变量未定义 该代码适用于 julia 0 7 0 但有一些警告 这是我正在使用的代码 是的 写得不好 我希望这不是问题 我删除了一个printl
  • Zend 框架和 Wordpress 集成

    这是我的问题 我有 require once application bootstrap php 在我的 zf 网站根文件夹中的 index php 中 我将 WordPress 博客放入 public html blog 中 我需要将 W
  • 在 Java Applet 中单击后 JButton“保持按下状态”

    我的 Java Applet 中有一个 JButton 按下按钮后 ActionListener 必须执行大量操作 因此 正因为如此 当用户单击按钮时 它会 保持按下 一段时间 有时甚至 5 分钟 而不是立即禁用自身 它会在这 5 分钟后自
  • 谷歌云存储访问的公共URL被拒绝

    我有这个 URL 但访问被拒绝 需要任何权限 https storage googleapis com BUCKET Artboard 4 png 出现此错误 匿名调用者没有 storage objects get 访问 Google Cl
  • 从所有子集中恢复原始数组

    给定一个数组的所有子集和 然后 您应该从提供的子集和中恢复原始数组 原始数组中的每个元素都保证为非负且小于 10 5 原始数组中的元素不超过 20 个 原数组也已排序 保证输入有效 实施例1 如果提供的子集总和是这样的 0 1 5 6 6
  • Microsoft CryptoAPI:如何将 PUBLICKEYBLOB 转换为 DER/PEM?

    我有一个生成的 RSA 密钥对 存储为 PRIVATEKEYBLOB 和 PUBLICKEYBLOB 并且我需要能够将这些密钥转换为 DER 或 PEM 格式 以便我可以在 PHP 或 Python 中使用它 我发现我可以使用 CryptE