C# RSA和Java RSA互通
来源:互联网 发布:听国学的软件 编辑:程序博客网 时间:2024/05/19 00:51
方法1:
源码:http://download.csdn.net/detail/kith002/4192327#comment
Java中有很好的rsa加密与解密类库,同样这些类库也被迁移到了Android的api中,但稍有不同,在java中的base64编码和解码api与Android稍有不同,Android只是简化了一部分操作。如下就将Android中常用的加密和解密的方法总结如下:
因为每次生成密钥需要的时间较长,所以密钥经过base64进行编码按照字符串保存了,上面的Android程序中的公钥和私钥转化后的字符串如下: 根据以上的编码,可以放到其他的平台和语言中去,进行解码后得到对应的公钥和私钥,要发送消息只需要得到公钥即可,要解密消息得到私钥即可。此外,如果两个人互相发消息,需要设置两组不同的公钥和私钥,同一组公钥和私钥不能放在同一个设备中。
base64decode(key)编码是一个自定义的函数,大家完全可以自己写,我就不列出了。以上代码是我研究在java中进行加密与解密的方法,后来测试与c#通信有问题,因为c#的公钥和私钥与java的组成方式不同,需要用函数转换。自己又不太清楚如何转换,后使用一些开源的类,稍加修改,便可以与c#和java服务器互通了。附件中的公钥和私钥是c#中的公钥和私钥,大家也可以通过RSAHelper里的函数转化成自己需要的java的公钥私钥,或者可以用函数自己生成。具体不多讲,我在RSAHelper.java中的api写的很明白,若不明白的请留言。详细代码见附件:
方法2:
C# RSA和Java RSA互通
今天调查了C# RSA和Java RSA,网上很多人说,C#加密或者java加密 ,Java不能解密或者C#不能解密
但是我尝试了一下,发现是可以的,下面就是我尝试的代码,如果您有什么问题,我想看看,他们为什么不能互通?
<pre name="code" class="html">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;public class RSATest { 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(Base64Helper.encode(en)); byte[] enTest = null; enTest = Base64Helper.decode(encryptString); 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 = Base64Helper.decode(module); byte[] exponentBytes = Base64Helper.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 = Base64Helper.decode(delement); byte[] modBytes = Base64Helper.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);
- }
- }
- }
package com.example.rsatest;import java.io.UnsupportedEncodingException;/** * 自定义Base64转换算法 * @author pengxiangxiang * */public class Base64Helper { private static char[] base64EncodeChars = new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; private static byte[] base64DecodeChars = new byte[]{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1}; public static String encode(byte[] data) { StringBuffer sb = new StringBuffer(); int len = data.length; int i = 0; int b1, b2, b3; while (i < len) { b1 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[(b1 & 0x3) << 4]); sb.append("=="); break; } b2 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); sb.append("="); break; } b3 = data[i++] & 0xff; sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); sb.append(base64EncodeChars[b3 & 0x3f]); } return sb.toString(); } public static byte[] decode(String str){ try {return decodePrivate(str);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return new byte[]{}; } private static byte[] decodePrivate(String str) throws UnsupportedEncodingException{ StringBuffer sb = new StringBuffer(); byte[] data = null;data = str.getBytes("US-ASCII"); int len = data.length; int i = 0; int b1, b2, b3, b4; while (i < len) { do { b1 = base64DecodeChars[data[i++]]; } while (i < len && b1 == -1); if (b1 == -1) break; do { b2 = base64DecodeChars [data[i++]]; } while (i < len && b2 == -1); if (b2 == -1) break; sb.append((char) ((b1 << 2) | ((b2 & 0x30) >>> 4))); do { b3 = data[i++]; if (b3 == 61) return sb.toString().getBytes("iso8859-1"); b3 = base64DecodeChars[b3]; } while (i < len && b3 == -1); if (b3 == -1) break; sb.append((char) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); do { b4 = data[i++]; if (b4 == 61) return sb.toString().getBytes("iso8859-1"); b4 = base64DecodeChars[b4]; } while (i < len && b4 == -1); if (b4 == -1) break; sb.append((char) (((b3 & 0x03) << 6) | b4)); } return sb.toString().getBytes("iso8859-1"); } public static void main(String[] args) throws UnsupportedEncodingException { String s = "abcd"; System.out.println("加密前:" + s); String x = encode(s.getBytes()); System.out.println("加密后:" + x); String x1 = new String(decode(x)); System.out.println("解密后:" + x1); }}
有什么问题 请给我留言
下面是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;
- }
1 0
- C# RSA和Java RSA互通
- android c# rsa互通
- .NET和java的RSA互通,仅此而已
- Java和.net加密解密互通RSA
- java和php实现RSA加密互通
- NET和java的RSA互通,仅此而已
- php和java之间rsa加密互通
- C#和Java实现互通的RSA&DES加解密算法(一)
- C#和Java实现互通的RSA&DES加解密算法(二)
- RSA加密算法实现以及C#与java互通加解密
- php 和 java RSA 对称加密互通的问题
- AES+RSA加密解密(js和java互通)
- 和NET互通的RSA加密算法
- C#和android 端互通 RSA算法 解决不能私钥解密问题。
- Android平台和java平台 DES、3DES、RSA加密解密互通程序及其不能互通的原因
- java和python的SHA-1形式RSA加密方式代码互通
- Java和C# RSA加密密钥互通以及密文字节信息大于117位或128位的终极解决办法
- Android RSA加密与解密开发总结(可以与c#的RSA加密解密互通)
- Maximum Product Subarray
- 3、mysql数据库双机同步开源软件otter的配置
- 欧盟玩具EN71
- TF-IDF算法及应用实例
- tomcat启动Java.Lang.NoClassDefFoundError: Org/Apache/Commons/Logging/LogFactory异常
- C# RSA和Java RSA互通
- 【PyQt4 实例29】利用QDataStream对文件进行存取
- WPF Silverlight 附加属性(AttachedProperty)
- Android中的Shape使用总结—圆角的按钮
- 排序算法
- 【LeetCode】Reorder List
- NSThread详解
- 《网络协议》TCP 四种定时器
- QB/T 2155-2010拉杆箱检测