相当于C#中的X509EncodedKeySpec

问题描述 投票:2回答:1

我正在尝试将一段Java代码移植到.NET中,该代码采用Base64编码的字符串,将其转换为字节数组,然后使用它制作X.509证书以获取用于RSA加密的模数和指数。这是我要转换的Java代码:

byte[] externalPublicKey = Base64.decode("base 64 encoded string");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(externalPublicKey);
Key publicKey = keyFactory.generatePublic(publicKeySpec);
RSAPublicKey pbrtk = (java.security.interfaces.RSAPublicKey) publicKey;
BigInteger modulus = pbrtk.getModulus();
BigInteger pubExp = pbrtk.getPublicExponent();

我一直在尝试找出将其转换为.NET的最佳方法。到目前为止,我已经提出了:

byte[] bytes = Convert.FromBase64String("base 64 encoded string");
X509Certificate2 x509 = new X509Certificate2(bytes);
RSA rsa = (RSA)x509.PrivateKey;
RSAParameters rsaParams = rsa.ExportParameters(false);
byte[] modulus = rsaParams.Modulus;
byte[] exponent = rsaParams.Exponent;

对我来说,这似乎应该可以工作,但是当我使用Java代码中以base 64编码的字符串生成X509证书时,它将引发CryptographicException。我收到的确切消息是:

找不到请求的对象。

Java的X.509实现只是与.NET不兼容,还是我从Java转换为.NET时做错了什么?

c# .net encryption jwt x509certificate2
1个回答
0
投票

在.NET Core 3.0及更高版本中,有ImportSubjectPublicKeyInfo方法直接导入此类密钥。

代码如下:

var bytes = Convert.FromBase64String("encoded key");
var rsa = RSA.Create();
rsa.ImportSubjectPublicKeyInfo(bytes, out _);
var rsaParams = rsa.ExportParameters(false);
© www.soinside.com 2019 - 2024. All rights reserved.