我在pem文件中有一个ASN.1编码的RSA私钥,格式如下:
-----BEGIN RSA PRIVATE KEY-----
base64 encoded pkcs8 key
-----END RSA PRIVATE KEY-----现在,要将它导入到我的RSACng对象中,我需要遵循以下步骤:
base64转换为字节以获取pkcs8键的byte[]byte[]从ASN.1 (DER)解码为密钥信息(模数、指数等)。RSACng对象中我有两个问题:
1.为什么 CngKeyBlobFormat.Pkcs8PrivateBlob 不允许您将PKCS8 byte[] 密钥自动导入 RSACng E 125对象?E 226
例如,为什么它不能以这种方式工作:
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)使用对象标识符(我对此还不熟悉),但它似乎仍然采用更好的格式
发布于 2018-07-26 16:34:11
因为BEGIN RSA PRIVATE KEY表示的是PKCS#1 RSAPrivateKey,而不是PKCS#8 PrivateKeyInfo。一个PKCS#8非加密的私钥会说BEGIN PRIVATE KEY。
RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)的ASN.1编码格式是什么?PKCS#8 PrivateKeyInfo.https://www.rfc-editor.org/rfc/rfc5208#section-5。
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL }
Version ::= INTEGER
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
PrivateKey ::= OCTET STRING
Attributes ::= SET OF AttributeRSA密钥的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等等。
https://stackoverflow.com/questions/51535018
复制相似问题