CngKeyBlobFormat 支持的实际格式是什么?

What are the actual formats supported by CngKeyBlobFormat?

Microsoft 页面提供了有关 CngKey.Import. Which actual formats are actually represented by the following CngKeyBlobFormat 属性可以使用的格式的 "minimal" 信息?

只有 PKCS#8 私钥格式稍微暗示了密钥的格式,但它没有指定是否需要包装私钥,或者是否只接受内部 PKCS#8 结构。

关于这些格式的信息越多越好。

在所有这一切中要记住的一点是,CNG 可以通过 CNG 提供程序进行扩展,这些提供程序可能是默认的 Microsoft 软件、智能卡或像 HSM 这样的第三方提供程序。任何提供商都可以选择忽略或不支持这些格式中的任何一种。这最终归结为 NCryptImportKey 被调用。这里没有列出 CNG 支持的多种格式。那里的备注部分有很多关于数据结构的类型和链接的信息。

如您在 NCryptImportKey 文档中所见,密钥格式是字符串。 CngKeyBlobFormat 只是这些字符串的包装器。您可以在 reference source 中查看这些属性如何映射到 Win32 字符串。例如,EccPrivateBlob 属性 是 "ECCPRIVATEBLOB" 字符串。

Pkcs8PrivateBlob

如您所述,此格式由 PKCS#8 标准指定。

OpaqueTransportBlob

Microsoft 无法真正记录这个,因为它是一个不透明的 blob,并且不能在提供商之间移植。本质上,这意味着提供者选择的表示。

GenericPublicBlob

这将是 BCRYPT_KEY_BLOB structure. The first field in the structure determines which structure it is with magic values. For example, with RSA public key, it will be a BCRYPT_RSAKEY_BLOB 的二进制表示。

GenericPrivateBlob

同上,只是填写了私有参数

EccPublicBlob

这将是一个 BCRYPT_ECCKEY_BLOB 结构。它与上面的相似之处在于一个魔法值将决定 blob 的实际内容。

EccPrivateBlob

这将与上面相同,只是填写了私有参数。

BCRYPT_KEY_BLOBBCRYPT_ECCKEY_BLOB 结构的情况下,这些结构充当键的 "header"。实际的键 material 将在同一个内存块中,在结构之后。 key material 的 "amount" 将根据 magic value 知道,而 header.

中的其他值