RSACng 和 CngKeyBlobFormat 导入导出格式

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

-----BEGIN RSA PRIVATE KEY-----
base64 encoded pkcs8 key
-----END RSA PRIVATE KEY-----

现在,要将其导入到我的RSACng对象中,我需要执行以下步骤:

  1. 读取文件并提取编码的密钥

  2. 转换base64为字节以获取byte[]for pkcs8 密钥

  3. byte[]ASN.1 (DER)解码为关键信息(模数、指数等)

  4. 将这些参数加载到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 编码的密钥导入RSACngCngKeyBlobFormat.Pkcs8PrivateBlob具有不同 ASN.1 编码格式并且它不是 DER 的原因吗?潜在的解决方法是将原始 RSA 私钥编码为另一种 ASN.1 格式,因为这正是导出密钥的方式?

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


海绵宝宝撒
浏览 311回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP