我正在尝试将一段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时出错?
在这种情况下,是否只是没有从Java转换为.NET?
答案 0 :(得分:2)
您的base64编码数据似乎不代表X.509证书:
[X509EncodedKeySpec class]表示公钥的ASN.1编码
用Java导出整个X.509证书,或尝试在.NET框架中找到等效的X509EncodedKeySpec类。
答案 1 :(得分:0)
我遇到了类似的问题,在我的情况下,它归结为'endian'问题。
解决方案只是反转字节数组(.NET中的Array.Reverse)
我面前没有2个IDE可以显示证据,但如果你遇到困难,请试一试!