我一直在寻找MSDN,试图了解crytoapi。以下是关于事情如何运作的一些问题和猜测。任何答案或确认或反驳我的猜测都非常赞赏。
根据我在http://msdn.microsoft.com/en-us/library/ms867086.aspx找到的说明,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会替换现有公钥/私钥对的公钥吗?我假设没有。
答案 0 :(得分:4)
这是很多问题。让我试着回答一下:
CSP保留公钥私钥对 会议之间。 这是否意味着他们无限期地保留下来?
是的,直到通过使用CRYPT_DELETEKEYSET标志调用CryptAcquireContext显式删除它们。
这些容器和它们包含的任何密钥对的价值是什么?
它们是您可以重用的持久性密钥。如果您在私钥上获得证书,则需要保留私钥 - 如果可以避免,则不希望导出私钥:CSP可以比您更好地保护密钥。
有没有办法获得其中一个密钥对的处理?
CryptAcquireContext后跟CryptGetUserKey。
它看起来好像是一个钥匙容器 可以包含:1个签名密钥对,1个密钥交换密钥对,任意数量的签名或key_exchange类型的PUBLIC密钥,任意数量的会话密钥。这是对的吗?
是和否。导入的公钥和会话密钥在逻辑上不在任何特定的密钥容器中。
是不配对的 密钥在容器被破坏时被破坏 闭合?
是
通常的方法是什么? 创建/命名密钥容器?怎么样 一个人不会踩到某些人 其他应用容器?
大多数应用程序都使用GUID。
这意味着cryptsignkey会 找到创建的私钥 cryptkeygen与适当的 Alg_id参数(值CALG_RSA_KEYX 或CALG_RSA_SIGN)。
是
如果我导出一个密钥,那么就是keyblob 包含说明什么样的信息 关键是什么?
这取决于所选的blob类型,但大多数keyblobs都以包含密钥类型的BLOBHEADER开头。
如果我导出PUBLICKEYBLOB和 将它运送到其他人 环境。我必须导入它吗? 我之前在新环境中的blob 可以用它来验证签名吗?
是
导入一个 PUBLICKEYBLOB替换公钥 任何现存的公钥/私钥对?
没有