有弹性的城堡C#-从字节数组获取公钥对象

问题描述

我正在尝试从包含公钥的字节数组中获取BouncyCastle的asymmetricKeyParameter对象。我面临的特定示例是以最简单的方式编码的RSA公钥,即作为具有两个INTEGER对象(模数和公共指数)的DER序列;但是,我不能认为它总是要使用RSA(也可以是ECDSA)。

我在网上发现的示例建议使用PublicKeyFactory.CreateKey,我这样做是这样的:

Asn1InputStream ais = new Asn1InputStream(content);
Asn1Object publicKey = ais.Readobject();
var pubkeyParams = PublicKeyFactory.CreateKey(publicKey.GetEncoded());

不幸的是,这给了我一个异常“ GetInstance中的未知对象:Org.BouncyCastle.Asn1.DerInteger \ n参数名称:obj”

我想这与该字节数组中的密钥编码方式有关。不幸的是,这不是我可以控制的。但这也不是完全搞砸了,因为当我在具有关键数据的bin文件中运行openssl rsa -in publicKey.bin -RSAPublicKey_in -inform DER -text时,OpenSSL命令行实用程序不会抗议。

在此过程中,我将不胜感激。我正在考虑尝试将关键数据解析为RSA,如果这不起作用,则将其解析为ECDSA,然后在发生异常时折叠。我不确定如何用BC做...

解决方法

PublicKeyFactory用于X.509 ASN.1类型SubjectPublicKeyInfo的编码。如果您希望能够以通用方式使用公钥,则最好对公钥使用SubjectPublicKeyInfo(对私钥使用PKCS#8 PrivateKeyInfo)。

听起来您有ASN.1 RSAPublicKey编码,在这种情况下,您可以调整示例代码以使用:

var rsaKey = Org.BouncyCastle.Asn1.X509.RsaPublicKeyStructure.GetInstance(publicKey);

var pubkeyParams = new RsaKeyParameters(false,rsaKey.Modulus,rsaKey.PublicExponent);

ECDSA密钥同样可以采用几种可能的格式,因此最好将其作为一个单独的问题。