ras私钥c#转java_关于RSA 加解密 java生成秘钥对 传给 C#进行加密,c#生成的密文如何转换格式能在JAVA上用私钥解密...

本文主要讨论了在JAVA和C#之间如何进行RSA加解密,特别是如何处理由JAVA生成的密钥对在C#中加密后,再在JAVA中使用私钥解密的问题。内容涉及到密钥对的格式转换,以及在转换过程中可能遇到的编码问题。解决方案包括使用Bouncy Castle Crypto APIs进行密钥格式转换。
摘要由CSDN通过智能技术生成

关于RSA 加解密 java生成秘钥对 传给 C#进行加密,c#生成的密文怎么转换格式能在JAVA上用私钥解密

java生成秘钥对  经过转换格式后传给 C#进行加密,C#生成的密文怎么转换格式能在JAVA上用私钥解密

tes是在C#生成的密文经过BASE64转码存到.txt文件,然后再JAVA中读出来

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

BASE64Decoder decoder = new BASE64Decoder();

byte[] b1 = decoder.decodeBuffer(tes);

/** 执行解密操作 */

byte[] b = cipher.doFinal(b1);←这行代码解析出错,网上查原因是因为C#加密后得到的格式不正确

求大神解答

------解决思路----------------------

c# 本身就可以算出来。或者c#调用js也可以算出来。

------解决思路----------------------

首先RSA加密算法是统一的,和在JAVA中实现和C#实现无关。你生成的秘钥需要为C#去提供,在这个环节中加密的行为应该是统一的,只是在转化Base64的过程中出现问题就需要你跟踪下在JAVA中和C#中对加密后的byte数组的二次编码行为是否出现不同了。

------解决思路----------------------

对称加密嘛。在密钥没错的情况下无非就是编码问题了

------解决思路----------------------

http://www.codeproject.com/Articles/6623/Porting-Java-Public-Key-Hash-to-C-NET

------解决思路----------------------

http://www.cnblogs.com/datous/p/RSAKeyConvert.html#

格式转换要用到一个开源加密库Bouncy Castle Crypto APIs,官网地址: http://www.bouncycastle.org/csharp/

/// 

/// RSA密钥格式转换

/// 

public class RSAKeyConvert

{

/// 

/// RSA私钥格式转换,java->.net

/// 

/// java生成的RSA私钥

/// 

public static string RSAPrivateKeyJava2DotNet(string privateKey)

{

RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));

return string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}",

Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));

}

/// 

/// RSA私钥格式转换,.net->java

/// 

/// .net生成的私钥

/// 

public static string RSAPrivateKeyDotNet2Java(string privateKey)

{

XmlDocument doc = new XmlDocument();

doc.LoadXml(privateKey);

BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));

BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));

BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));

BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));

BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));

BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));

BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));

BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));

RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);

PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);

byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();

return Convert.ToBase64String(serializedPrivateBytes);

}

/// 

/// RSA公钥格式转换,java->.net

/// 

/// java生成的公钥

/// 

public static string RSAPublicKeyJava2DotNet(string publicKey)

{

RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));

return string.Format("{0}{1}",

Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),

Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));

}

/// 

/// RSA公钥格式转换,.net->java

/// 

/// .net生成的公钥

/// 

public static string RSAPublicKeyDotNet2Java(string publicKey)

{

XmlDocument doc = new XmlDocument();

doc.LoadXml(publicKey);

BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));

BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));

RsaKeyParameters pub = new RsaKeyParameters(false, m, p);

SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);

byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();

return Convert.ToBase64String(serializedPublicBytes);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值