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

poilkjasd 2015-06-15 04:27:31
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#加密后得到的格式不正确

求大神解答
...全文
320 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42284754 2018-08-03
  • 打赏
  • 举报
回复
再次研究了两个小时。发现。有种办法可以让摄像头更稳定: // SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
CloseHandle(hWndC); //这一句有如神助;;; [DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hWnd); 方法还是上面的调用两遍。。。犹如神助。。。基本上和正常的一模一样。偶然要点击下确认。。。。无语了。只能回复3次。。贴到博主的任意一贴。。。让方法聚拢。。。。
  • 打赏
  • 举报
回复 1
http://www.cnblogs.com/datous/p/RSAKeyConvert.html# 格式转换要用到一个开源加密库Bouncy Castle Crypto APIs,官网地址: http://www.bouncycastle.org/csharp/

/// <summary>
/// RSA密钥格式转换
/// </summary>
public class RSAKeyConvert
{
    /// <summary>
    /// RSA私钥格式转换,java->.net
    /// </summary>
    /// <param name="privateKey">java生成的RSA私钥</param>
    /// <returns></returns>
    public static string RSAPrivateKeyJava2DotNet(string privateKey)
    {
        RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
 
        return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
            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()));
    }
 
    /// <summary>
    /// RSA私钥格式转换,.net->java
    /// </summary>
    /// <param name="privateKey">.net生成的私钥</param>
    /// <returns></returns>
    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);
    }
 
    /// <summary>
    /// RSA公钥格式转换,java->.net
    /// </summary>
    /// <param name="publicKey">java生成的公钥</param>
    /// <returns></returns>
    public static string RSAPublicKeyJava2DotNet(string publicKey)
    {
        RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
        return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
            Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
            Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
    }
 
    /// <summary>
    /// RSA公钥格式转换,.net->java
    /// </summary>
    /// <param name="publicKey">.net生成的公钥</param>
    /// <returns></returns>
    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);
    }
}
poilkjasd 2015-06-16
  • 打赏
  • 举报
回复
谢谢各位,最后发现C#加密后的格式是可以用的,是自己导入的私钥有问题,谢谢。
Imcx 2015-06-15
  • 打赏
  • 举报
回复
对称加密嘛。在密钥没错的情况下无非就是编码问题了
poilkjasd 2015-06-15
  • 打赏
  • 举报
回复
引用 3 楼 wthwinner2003 的回复:
首先RSA加密算法是统一的,和在JAVA中实现和C#实现无关。你生成的秘钥需要为C#去提供,在这个环节中加密的行为应该是统一的,只是在转化Base64的过程中出现问题就需要你跟踪下在JAVA中和C#中对加密后的byte数组的二次编码行为是否出现不同了。
JAVA生成的公钥经过转换,能在C#里面进行加密
poilkjasd 2015-06-15
  • 打赏
  • 举报
回复
引用 4 楼 wthwinner2003 的回复:
tes 是C#传递回来的字串?? 你需要在服务端通过JAVA用公钥加密后转换为BASE64字符串看下C#传递回来的tes有什么不同,必须要保证行为一致才能通过解码Base64后进行私钥解密。如果行为不同需要跟踪下C#加密过程中或者是传输获取过程中是否存在了其它的转码行为。
利用BASE64解密后发现经过C#加密得到byte数组里面的数据都是正数,而JAVA读取出来的有正有负,将负数加上256就是c#里面数据对应的数据
wthwinner2003 2015-06-15
  • 打赏
  • 举报
回复
tes 是C#传递回来的字串?? 你需要在服务端通过JAVA用公钥加密后转换为BASE64字符串看下C#传递回来的tes有什么不同,必须要保证行为一致才能通过解码Base64后进行私钥解密。如果行为不同需要跟踪下C#加密过程中或者是传输获取过程中是否存在了其它的转码行为。
wthwinner2003 2015-06-15
  • 打赏
  • 举报
回复
首先RSA加密算法是统一的,和在JAVA中实现和C#实现无关。你生成的秘钥需要为C#去提供,在这个环节中加密的行为应该是统一的,只是在转化Base64的过程中出现问题就需要你跟踪下在JAVA中和C#中对加密后的byte数组的二次编码行为是否出现不同了。
poilkjasd 2015-06-15
  • 打赏
  • 举报
回复
引用 1 楼 wawd74520 的回复:
c# 本身就可以算出来。或者c#调用js也可以算出来。
我现在是想用JAVA作为服务器,C#为客户端,现在C#传回经过加密的文件,经过JAVA解密。 所以想要把C#生成的密文转换格式能让JAVA读出来
失落的神庙 2015-06-15
  • 打赏
  • 举报
回复
c# 本身就可以算出来。或者c#调用js也可以算出来。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧