2

我一直在浏览 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 将使用适当的 Alg_id 参数(值 CALG_RSA_KEYX 或 CALG_RSA_SIGN)找到由 cryptkeygen 创建的私钥。

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

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

4

1 回答 1

4

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

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

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

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

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

有什么方法可以处理其中一个密钥对?

CryptAcquireContext 后跟 CryptGetUserKey。

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

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

容器关闭时非配对键是否被破坏?

是的。

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

大多数应用程序使用 GUID。

这意味着 cryptsignkey 将使用适当的 Alg_id 参数(值 CALG_RSA_KEYX 或 CALG_RSA_SIGN)找到由 cryptkeygen 创建的私钥。

是的。

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

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

如果我导出 PUBLICKEYBLOB 并将其传输到其他环境。是否必须在新环境中导入该 blob 才能使用它来验证签名?

是的。

导入 PUBLICKEYBLOB 是否会替换任何现有公钥/私钥对的公钥?

不。

于 2009-09-23T11:59:13.023 回答