我一直在浏览 MSDN 试图理解 cryptoapi。以下是一些关于事情如何运作的问题和猜测。非常感谢任何答案或确认或反驳我的猜测。

根据我发现的注释 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)创建的私钥。

如果我导出密钥,密钥块是否包含表明密钥类型的信息?

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

有帮助吗?

解决方案

这是很多问题。让我尝试回答一下他们:

CSP在会话之间保持公共私人密钥对。这是否意味着它们会无限期保留?

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

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

它们是您可以重复使用的持久密钥。如果您获得私钥上的证书,您希望保留私钥 - 并且如果可以避免的话,您不想导出私钥:CSP 可以比您更好地保护密钥。

有什么方法可以获取其中一对密钥的句柄吗?

CryptAcquireContext 后面是 CryptGetUserKey。

在我看来,关键容器可以包含:1 个签名密钥对、1 个密钥交换密钥对、任意数量的签名或 key_exchange 类型的公共密钥、任意数量的会话密钥。它是否正确?

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

关闭容器时,非配对键是否销毁?

是的。

创建/命名密钥容器的通常方法是什么?如何避免在其他某些应用程序容器上踩踏?

大多数应用程序都使用 GUID。

这意味着CryptSignKey将找到使用适当的Alg_ID Parmeter(值CALG_RSA_KEYX或CALG_RSA_SIGN)创建的CryptKeygen创建的私钥。

是的。

如果我导出一个键,密钥库是否包含信息告诉它是什么样的键?

这取决于所选的 blob 类型,但大多数 keyblob 都以 块头 包含密钥类型。

如果我导出一个publicKeyblob并将其运送到其他环境中。在新环境中,我是否必须在新环境中导入该斑点,然后才能使用它来验证签名?

是的。

导入publicKeyBlob是否替换了任何现有的公共/私钥对的公钥?

不。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top