AsnContentException:提供的数据标记有 'Universal' class 值“16”,但它应该是 'Universal' class 值“2”

AsnContentException: The provided data is tagged with 'Universal' class value '16', but it should have been 'Universal' class value '2'

我正在尝试使用 BouncyCastle 创建 RSA 密钥对,然后尝试导入生成的 public 密钥,但我收到以下错误

AsnContentException: The provided data is tagged with 'Universal' class value '16', but it should have been 'Universal' class value '2'.

代码如下

RsaKeyPairGenerator rsaKeyPairGenerator = new RsaKeyPairGenerator();
rsaKeyPairGenerator.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
    
AsymmetricCipherKeyPair keys = rsaKeyPairGenerator.GenerateKeyPair();
    
PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keys.Private);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded();
    
SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keys.Public);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
    
RSA publicRsaKey = RSA.Create();
publicRsaKey.ImportRSAPublicKey(serializedPublicBytes, out _);

有人知道我为什么会收到这个吗?

正如总统 James K. Polk 在评论中所述,导出的 public 密钥 serializedPublicBytes 是 X.509/SPKI 格式的 DER 编码密钥,可以使用 ImportSubjectPublicKeyInfo(),而 ImportRSAPublicKey() 需要 PKCS#1 格式的 DER 编码 public 密钥。

为了完整起见:PKCS#1 格式可以很容易地从 publicKeyInfo 派生,并在发布的代码中添加以下内容:

RsaPublicKeyStructure rsaPublicKey = RsaPublicKeyStructure.GetInstance(publicKeyInfo.ParsePublicKey());
byte[] pkcs1Der = rsaPublicKey.ToAsn1Object().GetDerEncoded();

以便也可以通过 ImportRSAPublicKey() 传递 pkcs1Der 来完成导入,或者如果需要 PKCS#1 格式的 public 密钥。