我在 pem 文件中有一个 ASN.1 编码的 RSA 私钥,格式如下:
-----BEGIN RSA PRIVATE KEY----- base64 encoded pkcs8 key -----END RSA PRIVATE KEY-----
现在,要将其导入到我的RSACng
对象中,我需要执行以下步骤:
读取文件并提取编码的密钥
转换base64
为字节以获取byte[]
for pkcs8 密钥
将byte[]
ASN.1 (DER)解码为关键信息(模数、指数等)
将这些参数加载到RSACng
对象中
我有以下两个问题:
1.为什么 CngKeyBlobFormat.Pkcs8PrivateBlob
不允许你自动将PKCS8 byte[]
密钥导入 RSACng
对象?
例如,为什么它不能以这种方式工作:
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。
2. 的ASN.1编码格式是 RSACng.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)
什么?
我注意到,如果我RSACng
按照上面描述的那样将密钥加载到 中,然后使用上面的代码导出相同的密钥,我会得到以不同 ASN.1 格式编码的 BLOB,并且在它的 INSIDE 中包含 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)
使用对象标识符(我还不熟悉),但它似乎仍然是 DER 格式
相关分类