AsnContentException:提供的数据标记为类值"16"'Universal'但它应该是类值'Universal' '2'



我试图使用BouncyCastle创建RSA对,然后尝试导入生成的公钥,我收到以下错误

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主席在评论中已经描述的那样,导出的公钥serializedPublicBytes是一个X.509/SPKI格式的DER编码密钥,可以用ImportSubjectPublicKeyInfo()导入,而ImportRSAPublicKey()期望一个pkcs# 1格式的DER编码公钥。

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

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

这样导入也可以在ImportRSAPublicKey()传递pkcs1Der时完成,或者如果需要pkcs# 1格式的公钥。

对于任何未来的搜索者来说,当您试图从Google的Tink加密库中导入公钥时,也可能会遇到此错误。

在这种情况下,公钥值实际上可能是一个base64编码的protobuf值,根据这些protobuf定义,需要将其反序列化以获得实际嵌入的公钥。

相关内容

  • 没有找到相关文章

最新更新