`

C# RSA和Java RSA互通

    博客分类:
  • C#
 
阅读更多

今天调查了C# RSA和Java RSA,网上很多人说,C#加密或者java加密 ,Java不能解密或者C#不能解密

但是我尝试了一下,发现是可以的,下面就是我尝试的代码,如果您有什么问题,我想看看,他们为什么不能互通?

package rsa;

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;

import javax.crypto.Cipher;

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;


/**
 * @author cnchenhl
 * Jul 8, 2011
 */
public class RSAMain {

    private static String module = "5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=";
    private static String exponentString = "AQAB";
    private static String delement = "vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=";
    private static String encryptString = "Vx/dGjS1YWKRubsoDgiShiwLgqyNE2z/eM65U7HZx+RogwaiZimNBxjuOS6acEhKZx66cMYEAd1fc6oewbEvDIfP44GaN9dCjKE/BkkQlwEg6aTO5q+yqy+nEGe1kvLY9EyXS/Kv1LDh3e/2xAk5FNj8Zp6oU2kq4ewL8kK/ai4=";
    /**
     * @param args
     */
    public static void main(String[] args) {
        byte[] en = encrypt();
        System.out.println(Base64.encode(en));
        byte[] enTest = null;
        try {
            enTest = Base64.decode(encryptString);
        } catch (Base64DecodingException e) {
            e.printStackTrace();
        }
        System.out.println(enTest.length);
        System.out.println(en.length);
        System.out.println(new String(Dencrypt(en)));
        System.out.println(new String(Dencrypt(enTest)));
    }

    public static byte[] encrypt() {
        try {
            byte[] modulusBytes = Base64.decode(module);
            byte[] exponentBytes = Base64.decode(exponentString);
            BigInteger modulus = new BigInteger(1, modulusBytes);
            BigInteger exponent = new BigInteger(1, exponentBytes);

            RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
            KeyFactory fact = KeyFactory.getInstance("RSA");
            PublicKey pubKey = fact.generatePublic(rsaPubKey);

            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);

            byte[] cipherData = cipher.doFinal(new String("chenhailong").getBytes());
            return cipherData;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    public static byte[] Dencrypt(byte[] encrypted) {
        try {
            byte[] expBytes = Base64.decode(delement);
            byte[] modBytes = Base64.decode(module);

            BigInteger modules = new BigInteger(1, modBytes);
            BigInteger exponent = new BigInteger(1, expBytes);

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

            RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, exponent);
            PrivateKey privKey = factory.generatePrivate(privSpec);
            cipher.init(Cipher.DECRYPT_MODE, privKey);
            byte[] decrypted = cipher.doFinal(encrypted);
            return decrypted;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace RSA
{
    class Program
    {
        static void Main(string[] args)
        {
            string de  = "iBILuPJFgPMxgpbgN3F2JjD6XjcqRSApjVVbvBBEBDV21Pjj7lTrfhEjSVnJX/MVoZrmX0lxsvoXTMvvVwVF7K7W5hs7Qo+aMN96yWke7wiLEM9M4pPz60A/KSckskiona67tXcqOLXb8N18TKaNCKHv0Ce+GyEKK5+MT7e1vao=";
            //string encrypt = RSAEncrypt("", "chenhailong");
            byte[] encrypt = RSAEncrypt("chenhailong");
            //string name = RSADecrypt(encrypt);
            string name = RSADecrypt(Convert.FromBase64String(de));
            Console.WriteLine(encrypt.Length);
            Console.WriteLine(Convert.ToBase64String(encrypt));
            Console.WriteLine(name);
            Console.ReadKey();
        }
        /// <summary>
        /// RSA encrypt
        /// </summary>
        /// <param name="publickey"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public static byte[] RSAEncrypt(string content)
        {
            string publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            byte[] cipherbytes;
            rsa.FromXmlString(publickey);
            cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);

            //return Convert.ToBase64String(cipherbytes);
            return cipherbytes;
        }

        /// <summary>
        /// RSA decrypt
        /// </summary>
        /// <param name="privatekey"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public static string RSADecrypt(byte[] content)
        {
            string privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            byte[] cipherbytes;
            rsa.FromXmlString(privatekey);
            cipherbytes = rsa.Decrypt(content, false);

            return Encoding.UTF8.GetString(cipherbytes);
        }


    }

}

 有什么问题 请给我留言

下面是Key的互通代码

  private byte[] removeMSZero(byte[] data) {
        byte[] data1;
        int len = data.length;
        if (data[0] == 0) {
            data1 = new byte[data.length - 1];
            System.arraycopy(data, 1, data1, 0, len - 1);
        } else
            data1 = data;

        return data1;
    }
 
0
0
分享到:
评论
14 楼 wilsonchen 2014-06-06  
chenhailong 写道
wilsonchen 写道
chenhailong 写道
wangxiaolin3333 写道
我有一个java的公钥文件,在C#里如何解析


查看我文章下面的方法,你就知道什么原因了。。。很简单的


楼主,我也遇到同样的问题,请问文章下面的方法是指哪一篇文章呢?


就是这篇文章,下面有个方法。C#比Java多了一位,去掉就行了,我记得好像是这样的。
这篇文章都写了快2年了,有点忘记了


好的 非常感激你
13 楼 chenhailong 2014-06-06  
wilsonchen 写道
chenhailong 写道
wangxiaolin3333 写道
我有一个java的公钥文件,在C#里如何解析


查看我文章下面的方法,你就知道什么原因了。。。很简单的


楼主,我也遇到同样的问题,请问文章下面的方法是指哪一篇文章呢?


就是这篇文章,下面有个方法。C#比Java多了一位,去掉就行了,我记得好像是这样的。
这篇文章都写了快2年了,有点忘记了
12 楼 wilsonchen 2014-06-06  
chenhailong 写道
wangxiaolin3333 写道
我有一个java的公钥文件,在C#里如何解析


查看我文章下面的方法,你就知道什么原因了。。。很简单的


楼主,我也遇到同样的问题,请问文章下面的方法是指哪一篇文章呢?
11 楼 chenhailong 2014-04-24  
wangxiaolin3333 写道
我有一个java的公钥文件,在C#里如何解析


查看我文章下面的方法,你就知道什么原因了。。。很简单的
10 楼 wangxiaolin3333 2014-04-23  
我有一个java的公钥文件,在C#里如何解析
9 楼 chenhailong 2011-12-27  
piziqie 写道
楼主,我遇到个问题。 C#端提供的公钥,我要在java端加密,然后再到C#端验证。 C#端的公钥怎样转换为java端公钥啊?毫无头绪.费力. 5555555  


嘿嘿,别担心
我下面给你的方法就可以解决的
你仔细看看就知道了
在说公钥怎么能互相转化那?
这个我就不太清楚了
我想能可供给你一个建议
1.先在C#中加密,在将加密字段提供给java,java进行一些操作
2.然后java出来,进到C#中,将加密字段中给C#解密就OK了
3.必要点:C#公钥,C#私钥 即可,至于java只是做传输作用罢了
8 楼 piziqie 2011-12-27  
楼主,我遇到个问题。 C#端提供的公钥,我要在java端加密,然后再到C#端验证。 C#端的公钥怎样转换为java端公钥啊?毫无头绪.费力. 5555555  
7 楼 chenhailong 2011-11-04  
ltcszk 写道
C#的加密算法有长度限制的超过110就会报错

请在仔细研究一下,c#可以最大是128位的。
6 楼 ltcszk 2011-11-03  
C#的加密算法有长度限制的超过110就会报错
5 楼 leemans 2011-09-09  
polim 写道
@"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>

这段字符串 怎么生成的?


同问, 这个字符串到底怎么生成的?
4 楼 polim 2011-08-15  
@"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>

这段字符串 怎么生成的?
3 楼 chenhailong 2011-07-11  
bzaxhj 写道
正准备尝试这按你说的这个试试,却出现了这样的问题,导入语句报错。Base64不认识

应该不会吧,我是没导入包的,你在尝试一下,看看基本上sun的包,应该没问题的
2 楼 bzaxhj 2011-07-11  
正准备尝试这按你说的这个试试,却出现了这样的问题,导入语句报错。Base64不认识
1 楼 bzaxhj 2011-07-11  
你好,
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;  
import com.sun.org.apache.xml.internal.security.utils.Base64;

我的internal下面没有security,请问是否需要额外导入什么jar包?

相关推荐

Global site tag (gtag.js) - Google Analytics