CryptoAPI 中的 CryptImportKey 接受 hPubKey 为 0 来导入加密的会话密钥

Posted

技术标签:

【中文标题】CryptoAPI 中的 CryptImportKey 接受 hPubKey 为 0 来导入加密的会话密钥【英文标题】:CryptImportKey in CryptoAPI accepts hPubKey of 0 to import encrypted session key 【发布时间】:2011-03-11 06:05:40 【问题描述】:

谁能解释为什么 CryptImportKey 函数在从另一台计算机导入加密的会话类型密钥 blob 时接受 0 的 hPubKey(解密密钥句柄)?

环境是这样的:

PC #1:在本地密钥容器(CryptGenKey w/AT_KEYEXCHANGE)中生成密钥交换密钥对(公共/私有),然后将公共部分导出为 PUBLICKEYBLOB 并将其发送到 PC #2

PC #2:从 PC #1 获取公钥 blob 并将其导入本地密钥容器。在同一本地密钥容器中创建会话密钥。使用从客户端密钥 blob 导入的公钥(用于加密会话密钥)将本地密钥容器会话密钥导出到 SIMPLOBOB (CryptExportKey)。

PC #1:从 PC #2 获取加密的会话密钥 blob 并调用 CryptImportKey,提供本地密钥容器 hProv、密钥 blob 缓冲区指针和长度、0(零)用于 hPubKey 和标志,以及指向 HCRYPTKEY 句柄的指针。

完成上述操作后,我得到了一个有效的句柄,并且可以使用我得到的句柄调用CryptEncryptCryptDecrypt。是的,如果我在 CryptImportKey 上指定从 PC #1 上的第一步生成的密钥交换密钥对的句柄,那也可以。我只是不明白为什么 hPubKey 的 0 有效,就好像 CryptoAPI“知道”私钥是什么来加密数据一样。

谢谢。

【问题讨论】:

【参考方案1】:

我唯一能想到的是你在会话中使用它(它有上下文,因此知道私钥),或者你实际上并没有加密数据。请注意,实际上可以使用模数作为唯一密钥来查找私钥,但我无法理解他们会在不告诉用户的情况下使用这种方法。

PS 抱歉,我不能直接(还)回答你的问题,所以我发布了这个,因为时间很长。

【讨论】:

以上是关于CryptoAPI 中的 CryptImportKey 接受 hPubKey 为 0 来导入加密的会话密钥的主要内容,如果未能解决你的问题,请参考以下文章

[加密解密]CryptoAPI简介

Cryptoapi 签名/验证在 Windows 8.1 上不起作用

CryptoAPI C++ 使用 AES 与 Java 互操作

农业银行上网银里CryptoAPI私钥是啥东西啊

将 PEM 编码的 X.509 证书加载到 Windows CryptoAPI

Window CryptoAPI:我可以在生成 RSA 密钥对时选择公共指数吗?