【问题标题】:CryptoAPI - how to extract RSA public key from privateCryptoAPI - 如何从私钥中提取 RSA 公钥
【发布时间】:2015-02-22 06:54:29
【问题描述】:

使用 windows CryptoAPI,是否可以从导入(未生成)的私钥获取公共 RSA 密钥?

如果我使用 CryptGenKey,我可以调用 CryptExportPublicKeyInfo 和 CryptImportPublicKeyInfo 来获取公钥句柄。但是,当我尝试使用从 PEM 解码并导入的私钥做同样的事情时:

CryptImportKey(hCSP, pKeyBuf, cbKeyBuf, 0, CRYPT_EXPORTABLE, &hPrivKey)

私钥导入成功并且我有一个有效的句柄,但随后对 CryptExportPublicKeyInfo 的调用失败并出现“密钥不存在”错误。看起来 CryptImportKey 和 CryptExportPublicKeyInfo 之间缺少另一个调用,但我找不到那个 API 调用。

【问题讨论】:

  • 您的CryptExportPublicKey 电话是什么样的?是签名密钥还是密钥加密密钥?
  • 被导入的 PEM 是通过调用 CryptExportKey(hKey, 0, PRIVATEKEYBLOB, 0, &buf, &size) 生成的,然后将 buf 编码为 DER -> PEM。我可以从 PEM 成功导入私钥,但不知道如何从中获取公钥。
  • 我说的是失败的“后续调用”,而不是私钥的来源。第二个出口看起来和原来的出口一样吗?我不熟悉 CryptoAPI,但我熟悉的其他 API 提供了一个 API,可以为您提供关键材料的“透明”视图。在 RSA 私钥的情况下,通常会为您提供一个以中国剩余定理形式 (CRT) 表示密钥的结构,该结构将具有许多大整数成员。我没有在 Windows CryptoAPI 文档中看到任何类似的内容。这会响铃吗?
  • 感谢您对这个问题感兴趣,我想通了(参见code),我可以继续工作,但我仍然不是 100% 清楚为什么 CryptExportPublicKeyInfo( )/CryptImportPublicKeyInfo() 不起作用。

标签: rsa public-key-encryption cryptoapi encryption-asymmetric


【解决方案1】:

导出/导入公钥的问题是因为私钥是使用 AT_SIGNATURE 而不是 AT_EXCHANGE 生成的。请参阅explanation 和 example code

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2018-11-27
    • 2012-01-02
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多