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 句柄的指针。
完成上述操作后,我得到了一个有效的句柄,并且可以使用我得到的句柄调用CryptEncrypt
和CryptDecrypt
。是的,如果我在 CryptImportKey 上指定从 PC #1 上的第一步生成的密钥交换密钥对的句柄,那也可以。我只是不明白为什么 hPubKey 的 0 有效,就好像 CryptoAPI“知道”私钥是什么来加密数据一样。
谢谢。
【问题讨论】:
【参考方案1】:我唯一能想到的是你在会话中使用它(它有上下文,因此知道私钥),或者你实际上并没有加密数据。请注意,实际上可以使用模数作为唯一密钥来查找私钥,但我无法理解他们会在不告诉用户的情况下使用这种方法。
PS 抱歉,我不能直接(还)回答你的问题,所以我发布了这个,因为时间很长。
【讨论】:
以上是关于CryptoAPI 中的 CryptImportKey 接受 hPubKey 为 0 来导入加密的会话密钥的主要内容,如果未能解决你的问题,请参考以下文章
Cryptoapi 签名/验证在 Windows 8.1 上不起作用
CryptoAPI C++ 使用 AES 与 Java 互操作