BouncyCastle C#-从字节数组中获取公钥对象



我正试图从包含公钥的字节数组中获取BouncyCastle的AsymmetricKeyParameter对象。我面临的一个特殊例子是以最简单的方式编码的RSA公钥,即作为具有两个INTEGER对象(模数和公共指数(的DER序列;然而,我不能假设它总是RSA(也可能是ECDSA(。

我在网上找到的例子建议使用PublicKeyFactoryCreateKey,我这样做:

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

不幸的是,这给了我一个例外"GetInstance中的未知对象:Org.BuncyCastle.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#8PrivateKeyInfo作为私钥(。

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

var rsaKey = Org.BouncyCastle.Asn1.X509.RsaPublicKeyStructure.GetInstance(publicKey);
var pubkeyParams = new RsaKeyParameters(false, rsaKey.Modulus, rsaKey.PublicExponent);

ECDSA密钥也可以有几种可能的格式,所以最好将其作为一个单独的问题。

最新更新