问题描述
我正在尝试从包含公钥的字节数组中获取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密钥同样可以采用几种可能的格式,因此最好将其作为一个单独的问题。