Security Microsoft CryptoAPI的基本问题

Security Microsoft CryptoAPI的基本问题,security,cryptography,cryptoapi,mscapi,Security,Cryptography,Cryptoapi,Mscapi,我一直在看MSDN试图理解crytoapi。下面是一些关于事情如何运作的问题和猜测。非常感谢您对我猜测的任何回答、确认或反驳 根据我在上找到的注释,CSP在会话之间保留公钥-私钥对 * Does that mean they are kept indefinitely? If so, whatever signature or exchange key pairs are extant when the CSP is closed remain. * Of what value are the

我一直在看MSDN试图理解crytoapi。下面是一些关于事情如何运作的问题和猜测。非常感谢您对我猜测的任何回答、确认或反驳

根据我在上找到的注释,CSP在会话之间保留公钥-私钥对

* Does that mean they are kept indefinitely? If so, whatever signature or exchange key pairs are extant when the CSP is closed remain. 
* Of what value are these containers and any key pairs they contain?  I guess they could be used to sign things without obtaining a handle to a key pair. 
* Is there any way to get a handle to one of the key pairs?
在我看来,密钥容器似乎可以包含:

* 1 signature key pair
* 1 key exchange key pair
* any number of PUBLIC keys of either signature or key_exchange type
* any number of session keys
这是正确的吗?容器关闭时,非配对钥匙是否已销毁

创建/命名密钥容器的常用方法是什么?如何避免踩在其他应用程序容器上?我需要一个带有公钥/私钥的容器,因此cryptacquirecontext备注部分中提到的临时容器不适用。 可能使用由固定部分和序列号组成的创建名称。完成后无法删除容器

cryptsignhash指定签名或密钥交换私钥用于对哈希进行签名。我猜这意味着cryptsignkey将找到cryptkeygen创建的具有适当Alg_id参数(值CALG_RSA_KEYX或CALG_RSA_SIGN)的私钥

如果我导出一个密钥,keyblob是否包含告诉它是哪种密钥的信息


如果我导出PUBLICKEYBLOB并将其传输到其他环境。我是否必须在新环境中导入该blob,然后才能使用它来验证签名?cryptverifysignature需要密钥句柄,因此看起来必须首先导入密钥。导入PUBLICKEYBLOB是否替换任何现有公钥/私钥对的公钥?我想不会。

那是很多问题。让我试着回答他们:

CSP保留公钥-私钥对 课间休息。 这是否意味着它们被无限期地保留

是,直到通过使用CRYPT_DELETEKEYSET标志调用CryptAcquireContext显式删除它们

这些容器及其包含的任何密钥对有什么价值

它们是可以重用的持久密钥。如果您获得私钥证书,您希望保留私钥—如果可以避免,您不希望导出私钥:CSP可能比您更好地保护密钥

有没有办法得到其中一个密钥对的句柄

CryptAcquireContext后跟CryptGetUserKey

在我看来,它就像一个钥匙盒 可以包含:1个签名密钥对、1个密钥交换密钥对、任意数量的签名或密钥交换类型的公钥、任意数量的会话密钥。这是正确的吗

是和否。导入的公钥和会话密钥在逻辑上不在任何特定密钥容器中

这是非配对的吗 当容器被打开时,密钥被销毁 关门了

通常的治疗方法是什么 创建/命名密钥容器?怎么 一个人是否能避免踩到一些东西 其他应用程序容器

大多数应用程序使用GUID

这意味着cryptsignkey将 查找由创建的私钥 使用适当的 Alg_id参数(值计算RSA_KEYX 或计算符号)

如果我导出一个密钥,keyblob 包含说明什么类型的信息 这是什么钥匙

这取决于选定的blob类型,但大多数keyblob都以包含该键类型的开始

如果我导出PUBLICKEYBLOB并 把它送到别的地方去 环境我必须进口吗 新环境中的水滴在我之前 可以使用它来验证签名吗

导入一个 PUBLICKEYBLOB替换公钥 任何现存的公钥/私钥对


不需要。

谢谢,这很有帮助。我对某些事情还是有点模糊。1) 假设我有某人的公钥和交换密钥。我可以使用它来加密一些数据(可能是密钥交换数据),并将这些数据发送给密钥的所有者。他可以打开相应的密钥容器,使用crptygetuserkey()获取密钥交换对的句柄并解密数据。对吗?2) 唯一永久保存在密钥容器中的东西是一个签名密钥对和一个密钥交换对吗?或者是否有其他类型的钥匙永久保存?3) 我在MSDN中找不到任何cryptdeletekey()函数。1)是。2) 是的,只有一两个钥匙对。3) 抱歉,我的错误:您通过使用CRYPT_DELETEKEYSET标志调用CryptAcquireContext来删除密钥(我修复了答案)-