【发布时间】: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