我正试图从包含公钥的字节数组中获取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密钥也可以有几种可能的格式,所以最好将其作为一个单独的问题。