java rsa 互相加解密

package com.isg.util;

import java.io.ByteArrayOutputStream;

import java.security.Key;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.Base64;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

@SuppressWarnings("restriction")

public abstract class RSAUtil {

/**

* RSA

*/

public static final String KEY_ALGORITHM = "RSA";

/**

* RSA/ECB/PKCS1Padding

*/

public static final String RSA_model = "RSA/ECB/PKCS1Padding";

/**

* RSA最大加密明文大小

*/

private static final int MAX_ENCRYPT_BLOCK = 117;

/**

* RSA最大解密密文大小

*/

private static final int MAX_DECRYPT_BLOCK = 128;

public static BASE64Decoder dec = new BASE64Decoder();

public static BASE64Encoder enc = new BASE64Encoder();

// 私钥解密

public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

// 对数据分段解密

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_DECRYPT_BLOCK;

}

byte[] decryptedData = out.toByteArray();

out.close();

return decryptedData;

}

// 私钥解密2

public static String decryptByPrivateKey(String data, String key) throws Exception {

return new String(decryptByPrivateKey(dec.decodeBuffer(data), dec.decodeBuffer(key)), "UTF-8");

}

// 公钥解密

public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, publicKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

// 对数据分段解密

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_DECRYPT_BLOCK;

}

byte[] decryptedData = out.toByteArray();

out.close();

return decryptedData;

}

// 公钥解密2

public static String decryptByPublicKey(String data, String key) throws Exception {

return new String(decryptByPublicKey(dec.decodeBuffer(data), dec.decodeBuffer(key)), "UTF-8");

}

// 公钥加密

public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_ENCRYPT_BLOCK;

}

byte[] encryptedData = out.toByteArray();

out.close();

return encryptedData;

}

// 公钥加密2

public static String encryptByPublicKey(String data, String key) throws Exception {

byte[] signByte = encryptByPublicKey(data.getBytes("UTF-8"), dec.decodeBuffer(key));

return enc.encode(signByte);

}

// 私钥加密

public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_ENCRYPT_BLOCK;

}

byte[] encryptedData = out.toByteArray();

out.close();

return encryptedData;

}

// 私钥加密2

public static String encryptByPrivateKey(String data, String key) throws Exception {

BASE64Decoder dec = new BASE64Decoder();

BASE64Encoder enc = new BASE64Encoder();

byte[] signByte = encryptByPrivateKey(data.getBytes("UTF-8"), dec.decodeBuffer(key));

return enc.encode(signByte);

}

// 私钥加密 RSA使用 RSA/ECB/PKCS1Padding 组合模式补位。

public static byte[] encryptByPrivateKeyIss(byte[] data, String key) throws Exception {

// 对密钥解密

byte[] keyBytes = Base64.getDecoder().decode(key);

// 取得私钥

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey = keyFactory.generatePrivate(keySpec);

// 对数据加密

Cipher cipher = Cipher.getInstance(RSA_model);

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

// 私钥验证公钥密文

public static boolean checkPublicEncrypt(String data, String sign, String pvKey) throws Exception {

return data.equals(decryptByPrivateKey(sign, pvKey));

}

public static boolean checkPrivateEncrypt(String data, String sign, String pbKey) throws Exception {

return data.equals(decryptByPublicKey(sign, pbKey));

}

// int blockSize = (true == Cipher.ENCRYPT_MODE) ? RsaConst.ENCRYPT_KEYSIZE

// : RsaConst.DECRYPT_KEYSIZE;

public static void main(String[] args) {

/*String pub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs76FIXTlWF3YeD5VCuGra1pAvPDqOKjRXGj7h2ZR7svya8uQuT8co4Pt2H7gAudQA4Kp2C82YUn0JpTCyBF2W1FjSgu9RlPJSxNz8+DeQn+4mYhJcd3wR1KrH9gxlv7SY+YudhQdwTfjjmh8KafapND4bYwxXBI3lSjWZqiYlWaVBIbFyHyoSOKN+I9zsJZ2ctEd0V9TRUywmCOq3wVJbR4fOeumLcaqIHyD7KdE5gLH0MXFhnHdInQ5JttOQZmGGdD2DqG6Mv4SeuzRPFuWoerJMzLjDvlTdl9Pha6G8gEUFQgY0QkyGStwhj0AoUb5bf1ww1rSreZTVym9CQgDbQIDAQAB";

String pri = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzvoUhdOVYXdh4PlUK4atrWkC88Oo4qNFcaPuHZlHuy/Jry5C5Pxyjg+3YfuAC51ADgqnYLzZhSfQmlMLIEXZbUWNKC71GU8lLE3Pz4N5Cf7iZiElx3fBHUqsf2DGW/tJj5i52FB3BN+OOaHwpp9qk0PhtjDFcEjeVKNZmqJiVZpUEhsXIfKhI4o34j3OwlnZy0R3RX1NFTLCYI6rfBUltHh8566YtxqogfIPsp0TmAsfQxcWGcd0idDkm205BmYYZ0PYOoboy/hJ67NE8W5ah6skzMuMO+VN2X0+FrobyARQVCBjRCTIZK3CGPQChRvlt/XDDWtKt5lNXKb0JCANtAgMBAAECggEAC+cuAc0v8u4kC7J1B0dyhqVvbBO4LxBe7PO21HyeKGYxI5pTdzEKwHlYIuIkC40t602X2c0mmMLA/F0VmRIu+FUnchvc6O9bgTFEmH3nuhejLeeslXHRG6gJ1Q4IGqu9Wwg/Q2qJneYJl8CrmEaZYBjGmtqR2jsKm0IdEKdRk3MfLcO8fyG31R0vOaHAxTTnzJEImG7gmqSPvbSZ2IaYx8I8FlmmqblVNuChirWTr3yJVtS7UHrdin8P1RjlrZoeLiKmNh4qmugoIdtncOYRn6bmOK5sxE7TtP9Ki97Tm/jrSutzupxRO0qKvxz9WUHnqEsz4Bxcyw3T7pKH/2BdMQKBgQDjTMnOB3di3stVL4yyibAjx9IHRrYKVFTrxuPS94u3BI+YOFoTx56HSlO8gGWBYXz0g0sWVd9jM6dAc39epHvcSCpQcwJekNeOTh12PwbT6mu2hK2YkpA/eCr5tdobJ1iP5jfbpz09/GRPVnju29J3CKhMP8ppQFdkJRIaudWoWwKBgQDKcIv+bV2TWFW6JxhR2PBowoqy4u+JB1BX6cR4hB22XngfJ+zSnOVtJZBVgCDTf8pvxXPzis93fjgwX8qqkgnbWjbJ5ew7t7HHxbrAbY09EhF78BM+hw1Lc0rG4PkF7zLSww+NQ0andBc7CvldnOqp56Qsk5glCdXHD7wr/REN1wKBgQCWVel7vXB3EkiGFScHxw2a/MSrT1eDyXdJYoi4tkXQTNH0qgDZ6EOv07dCi+GXCzWsO1JkeXOAl19dv4ZUwJGzhn+GKis9BKutUXknBlSrwPZxB5wRt450jDRQaLjTENkAhBIZ06kr4E0wNE9UHEw9spotpFtp9cZXVDV/O75W1QKBgDFH6KyNTyRZcrUYY1E5cHzwLveRSyKehy5/l/aGov0MTk23WG2FCEzjwhkuUc9q4osHFE0LU6oRLfiIuTuAxamCcqf/stxuwXaSaf4CLUnapir3rJeiJNhjPqbfiX+qVUL9fUG0SPTmy+jxqPbjBjVKUKsRWw5ZMJN+/x3uQ0KNAoGAMz+zTfGQYqhOklKFlnTFeaSOyHLHlhbvCEl5hBDu7TAsFrQU3MDxBSsoe5aZBIAXu2EMM5bhlXymXXdSKU7a1D745rXkqu7IpWiIMfaeA889W2jWyPARjXE2+xGQ1qDRXMB6NMj+DmRqc0bfh/7K9rIFN8cX22cV8q5t1H/zGKQ=";*/

String pub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAifSPkbqi6xNZq04Iran0EKePGNJrVC5CDjVZCKlV2AXtv/Oq9oqYruUIaUjbycu3DWNefi9PC7GQ63sXCHKvXu+ASqFo0eo2qrIppjw6h9WoeIAcoYuAQ5mjQqyNYCMPzfO4BwJQE8S80wNeEAUbV9l5f4K8vLiGx0ijaDtHrQIDAQAB";

String pri = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMCJ9I+RuqLrE1mrTgitqfQQp48Y0mtULkIONVkIqVXYBe2/86r2ipiu5QhpSNvJy7cNY15+L08LsZDrexcIcq9e74BKoWjR6jaqsimmPDqH1ah4gByhi4BDmaNCrI1gIw/N87gHAlATxLzTA14QBRtX2Xl/gry8uIbHSKNoO0etAgMBAAECgYB+eaCmtoms/1JEstydosZjRpVq0FlYm4GPbpnolGH3u+GZHWBIy46bYTed4Ns1VUd2RVsi9SzKddn8YlMG/Euodevdh89HjbcO4yOMOvXk0GW0AMyKN8XQdGj7DJ9a7bd5qghcfaRuwWhZfGkRwu5PTSzSwgPy3PDVgN4do4+6GQJBAPg2rSNDLM8GR8js7HqIsgQqGLzan+cxuER3lljft5tkmoQjUKKHKJ2eeta+1w0XmucJTFGtH+x49/9jrYf+BnMCQQDGlCxj1wZnKGkJBvPMgf/obQNU1r4aSuPA/qLH/EqWquK+cClSeCea7aozV2+8jjluBH6tg9qUyMpFqqtLwdFfAkEAuPP0+2uYvgLOBrgUVhH5pATCPiciM6Hmzo3VqA+7vryuLnwqH5FbAGgQ3GeD0yudrz5Mcifwu8I/+TuLGOR+ZQJAXdurH4WCgT+YZavjj8XiLvlXmcHmGIdNHus8BUo59vzOLzTUUyZ3kcLDr4CkT3rpqhZ1yY2Iwsok0MjaLfRuAQJBALu1qyeGHiYS0RA/VtR2HQe/upNQ/j7ahCaAUAYpva+tOOMPK8Pok3X8Nsc0iee1iChcAf8yEpBqUH5LTkQBm6w=";

String data = "加密密文不能保证正确。 也就是说,你在java端将信息加密后,也许你的密文在C#端不能被正确解密。这个时候就可能是加密密加密密文不能保证正确。 也就是说,你在java端将信息加密后,也许你的密文在C#端不能被正确解密。这个时候就可能是加密密文不正确导致的错误。这个时候你得看看你在加密时,有没有用一种C#里面没用到的东西,我一开始的时候文不正确导致的错误。这个时候你得看看你在加密时,有没有用一种C#里面没用到的东西,我一开始的时候";

try {

String result = encryptByPublicKey(data, pub);

System.out.println("公钥加密的结果=" + result);

System.out.println();

System.out.println("私钥解密的结果=" + decryptByPrivateKey(result, pri));

System.out.println();

String result1 = encryptByPrivateKey(data, pri);

System.out.println("私钥加密的结果=" + result1);

System.out.println();

System.out.println("公钥解密的结果=" + decryptByPublicKey(result1, pub));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

猜你喜欢

转载自wangjx123.iteye.com/blog/2379110