首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSACng和CngKeyBlobFormat导入和导出格式

RSACng和CngKeyBlobFormat导入和导出格式
EN

Stack Overflow用户
提问于 2018-07-26 09:04:51
回答 1查看 1.5K关注 0票数 1

我在pem文件中有一个ASN.1编码的RSA私钥,格式如下:

代码语言:javascript
复制
-----BEGIN RSA PRIVATE KEY-----
base64 encoded pkcs8 key
-----END RSA PRIVATE KEY-----

现在,要将它导入到我的RSACng对象中,我需要遵循以下步骤:

  1. 读取文件并解压编码的密钥。
  2. base64转换为字节以获取pkcs8键的byte[]
  3. byte[]从ASN.1 (DER)解码为密钥信息(模数、指数等)。
  4. 将这些参数加载到RSACng对象中

我有两个问题:

1.为什么 CngKeyBlobFormat.Pkcs8PrivateBlob 不允许您将PKCS8 byte[] 密钥自动导入 RSACng E 125对象?E 226

例如,为什么它不能以这种方式工作:

代码语言:javascript
复制
var keyData = GetBytesFromPEM(pemstring); // Get the bytes for key that is ASN.1 DER encoded
CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob);

CngKeyBlobFormat明确指定它是一个PKCS8私有blob。

RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob) 2. 的ASN.1编码格式是什么?

我注意到,如果像上面描述的那样将密钥加载到RSACng中,然后使用上面的代码导出相同的密钥,我就会得到BLOB,BLOB是以不同的ASN.1格式编码的,其中包含ASN.1 DER编码的密钥。基本上,要从导出的密钥中获取信息,我需要再次从ASN.1格式中解码它,以获得存储在其中的原始密钥参数,这些参数再次以ASN.1 DER编码。

为什么这么乱?为什么不能将ASN.1 DER编码的密钥导入RSACng,是因为CngKeyBlobFormat.Pkcs8PrivateBlob有不同的ASN.1编码格式,而不是DER?那么,可能的解决办法是将原始RSA私钥编码为另一种ASN.1格式,因为这正是导出密钥的方式吗?

编辑:显然,RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)使用对象标识符(我对此还不熟悉),但它似乎仍然采用更好的格式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 16:34:11

  1. 为什么CngKeyBlobFormat.Pkcs8PrivateBlob不允许您自动将PKCS8 byte[]键导入RSACng对象?

因为BEGIN RSA PRIVATE KEY表示的是PKCS#1 RSAPrivateKey,而不是PKCS#8 PrivateKeyInfo。一个PKCS#8非加密的私钥会说BEGIN PRIVATE KEY

  1. RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)的ASN.1编码格式是什么?

PKCS#8 PrivateKeyInfo.https://www.rfc-editor.org/rfc/rfc5208#section-5

代码语言:javascript
复制
  PrivateKeyInfo ::= SEQUENCE {
    version                   Version,
    privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
    privateKey                PrivateKey,
    attributes           [0]  IMPLICIT Attributes OPTIONAL }

  Version ::= INTEGER

  PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier

  PrivateKey ::= OCTET STRING

  Attributes ::= SET OF Attribute

RSA密钥的PrivateKey值是PKCS#1 RSAPrivateKey值。

为什么这么乱..。对象标识符..。

PKCS#8 PrivateKeyInfo格式是任何类型私钥的容器。对象标识符(OID)告诉读者有效负载是什么类型的。如果OID是rsaEncryption (1.2.840.113549.1.1.1),那么有效载荷是RSAPrivateKey,如果它是id-dsa (1.2.840.10040.4.1),那么有效载荷是一个表示私钥的整数(并且上下文参数在privateKeyAlgorithm.Parameters中),如果它是id-ecPublicKey (1.2.840.10045.2.1) (是“公共”,‘因为名称’),那么有效载荷就是ECPrivateKey等等。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51535018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档