在所有这一切中要记住的一件事是,CNG 可以通过 CNG 提供程序进行扩展,这可能是默认的 Microsoft 软件、智能卡或 HSM 等第 3 方提供程序。任何提供商都可以选择忽略或不支持任何这些格式。这最终归结为NCryptImportKey
被调用。CNG 支持的许多格式未在此处列出。那里的备注部分有很多关于数据结构的类型和链接的信息。
正如您在NCryptImportKey
文档中看到的,密钥格式是字符串。这CngKeyBlobFormat
只是这些字符串的包装。您可以查看参考源以了解这些属性如何映射到 Win32 字符串。例如,EccPrivateBlob
属性是"ECCPRIVATEBLOB"
字符串。
Pkcs8PrivateBlob
如您所述,此格式由PKCS#8标准指定。
不透明传输块
这个 Microsoft 无法真正记录,因为它是一个不透明的 blob,并且不能在提供程序之间移植。本质上,这意味着提供者选择的表示。
通用公共块
这将是BCRYPT_KEY_BLOB
结构的二进制表示。结构中的第一个字段决定了它是哪个具有魔法值的结构。例如,使用 RSA 公钥,它将是一个BCRYPT_RSAKEY_BLOB
.
GenericPrivateBlob
除了填写私有参数外,这与上面相同。
EccPublicBlob
这将是一个BCRYPT_ECCKEY_BLOB
结构。它与上面的相似之处在于魔法值将确定 blob 的实际内容。
EccPrivateBlob
除了填写私有参数外,这将与上面相同。
在 forBCRYPT_KEY_BLOB
和BCRYPT_ECCKEY_BLOB
结构的情况下,结构充当键的“标题”。实际的密钥材料将在结构之后的同一内存块中。密钥材料的“数量”将根据魔法值和标头中的其他值来知道。