2010-03-28 32 views
4

我试图将一段Java代码移植到.NET中,该.NET使用Base64编码的字符串将其转换为字节数组,然后使用它来创建X. 509证书来获得RSA加密的模数&指数。将字节数组转换为X.509证书

这是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; 

这对我看起来像它应该工作,但它抛出一个CryptographicException当我使用base 64编码字符串从Java代码来生成X509证书。我收到的确切消息是:

找不到请求的对象。

Java的X.509实现是否与.NET不兼容,或者我在从Java到.NET的转换中做错了什么?

或者在这种情况下,是否存在从Java到.NET的转换?

+0

也许你可以发布证书的base64字符串,以便人们可以看看它? – dtb 2010-03-28 19:36:20

+0

这只是一个公钥,它不是* X509证书。 – 2010-03-29 22:31:59

回答

2

看来你的base64编码的数据并不代表X.509证书:

[该X509EncodedKeySpec class]表示公钥

导出整个X的ASN.1编码.509证书,或者尝试在.NET框架中找到等效的X509EncodedKeySpec类。

0

我遇到过类似的问题,在我的情况下,它归结为'endian'问题。

的解决方案是简单地扭转字节数组(Array.Reverse在.NET)

我没有在我面前的2个IDE来展示一个证明,但如果你卡住了,给它一试!

+0

我只是尝试颠倒我的字节数组,并得到了相同的异常: -/ – ddd 2010-03-28 19:24:13

+0

OK。另一张海报比我更彻底地阅读你的问题! 在Java中,您使用的是X509EncodedKeySpec,它表示证书的公钥部分(而不是整个证书)。 在C#中,您将数据视为整个证书。 X509Certificate2的公钥部分简称为PublicKey。也许你会成功构建一个PublicKey对象... http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.publickey.publickey.aspx – laher 2010-03-28 20:42:37