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

标签 c# cryptography standards cng

Microsoft 页面提供了关于 CngKey.Import 可以使用的格式的“最少”信息。 .哪些实际格式实际上由以下 CngKeyBlobFormat 表示属性?

  • EccPrivateBlob
  • EccPublicBlob
  • GenericPrivateBlob
  • GenericPublicBlob
  • OpaqueTransportBlob
  • Pkcs8PrivateBlob

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

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

最佳答案

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

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

Pkcs8PrivateBlob

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

OpaqueTransportBlob

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

GenericPublicBlob

这将是 BCRYPT_KEY_BLOB 的二进制表示结构体。结构中的第一个字段决定了它是哪个具有魔法值的结构。例如,对于 RSA 公钥,它将是 BCRYPT_RSAKEY_BLOB .

GenericPrivateBlob

除填写私有(private)参数外,同上。

EccPublicBlob

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

EccPrivateBlob

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

BCRYPT_KEY_BLOBBCRYPT_ECCKEY_BLOB 结构的情况下,这些结构充当 key 的“ header ”。实际的 key Material 将在同一 block 内存中,在结构之后。 key Material 的“数量”将根据魔法值和 header 中的其他值获知。

关于c# - CngKeyBlobFormat 支持的实际格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43160671/

相关文章:

c++ - vector 中允许的事件迭代器的数量

html - 自己写 "&"是不是无效HTML?为什么?

c# - Entity Framework 与 IBM DB2

c# - Thread.CurrentThread.Join() 什么时候有意义?

android - Android 12 keystore 用户 0 丢失文件夹

mysql - MySQL 中的加盐和散列密码

project-management - ISO 标准如何运作(尤其是 ISO 9126)

c# - NUnit:为代码编写单元测试需要使用物理文件

c# - 在 Xamarin 中绑定(bind) PayPalMobile iOS 库

cryptography - OpenSSL gost 引擎问题