RSA加密解密方式

package com.un.ussp.component.secure.util;


import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;


import javax.crypto.Cipher;


import org.apache.commons.codec.binary.Base64;


/**
 * 加密解密工具类
 * @author WGW
 *
 */
public class RSAUtil {

public static final String Charsets_UTF_8 = "UTF-8";


public static final String KEY_ALGORITHM = "RSA";


public static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGWYC5zRWsSRZtPaZNd76gscrVih8C4ASArPEVQBaRfHGgEKl5QR5oGOkeH9vQ56RRetRU0PnVwt5MdsO/LXJJiKNajkq2dIe7PtUlA2DlzZp2ZUDInwf5x+gV3XscDClzoUHla1ng+NKmLCGuGycULH+/jPmy5FzdJpAUdrN6dwIDAQAB";


public static final String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMZZgLnNFaxJFm09pk13vqCxytWKHwLgBICs8RVAFpF8caAQqXlBHmgY6R4f29DnpFF61FTQ+dXC3kx2w78tckmIo1qOSrZ0h7s+1SUDYOXNmnZlQMifB/nH6BXdexwMKXOhQeVrWeD40qYsIa4bJxQsf7+M+bLkXN0mkBR2s3p3AgMBAAECgYBtBxWzDAA1y5cARTr8qi2mtxP/fQS+19Shxm5ed/Pv1K/AhGgjtp+4KLk7TdfOZQX1o8bDOHub/Jmk/kNq+tguijY9BHwcHynXZKNuUf2cVR/tAW10syhpxQLN/JN1FV7RXrQcl2nQ/PtmcO0I9N0O3+htUbQAeD1b814jPlm7QQJBAPsamK52vB4jLtySggqdA1B4UOTda+ze4nkIAPnABy/JszZgvPMu+cV0W3OMZuYJDYaVF2Qdbz8X9X2YcKG0bJMCQQDKN5RfyqZm82zXozSV35VEBlTKu1LpyALqumzJHUBYkNKvLOrC0wI2om6QMbf8ggATMG7IJcHTG0Kdz0kfb40NAkEAkKCB/kKPGUCkdhDAa8KBrTCPTzKlPdomURWmEjNjMEgZO6G+Usbkv7DEF6pvfeEK9FAdF+HIOGvhToSlos2blwJALfpHJSSZgyzz4W+9RBprAOWDn/jJmFgeuaobk/qvp7N+A9BtrFB33149T1HOqH4ScEqB1cYn9Mzs756y3I/rfQJALeIZ0yFI5K1FxGaDTR24f99rUSS8bPrHC54AsCfyKd13Xi0ihmuk/WfMc4viZxqfPnIbLclA9D1pfSMvfqPnBQ==";


/**
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {


byte[] keyBytes = Base64.decodeBase64(key);




X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);


Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
int len = publicKey.getModulus().bitLength() / 8 - 11;
List<byte[]> splitString = splitBytes(data, len);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
for (byte[] s : splitString) {
byte[] doFinal = cipher.doFinal(s);
bao.write(doFinal);
}
return bao.toByteArray();
}


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


byte[] dataBytes = data.getBytes(Charsets_UTF_8);
byte[] encrypt = encryptByPublicKey(dataBytes, key);
return Base64.encodeBase64String(encrypt);
}


;


/**
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {


byte[] keyBytes = Base64.decodeBase64(key);




PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
/*System.out.println("privateKey.getEncoded()::" + privateKey.getEncoded());
System.out.println("privateKey.getFormat()::" + privateKey.getFormat());
System.out.println("privateKey.getAlgorithm()::" + privateKey.getAlgorithm());
System.out.println("privateKey.getModulus()::" + privateKey.getModulus().bitLength() / 8);
System.out.println("privateKey.getPrivateExponent()::" + privateKey.getPrivateExponent());*/


Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
int len = privateKey.getModulus().bitLength() / 8;
List<byte[]> splitString = splitBytes(data, len);
ByteArrayOutputStream bao = new ByteArrayOutputStream();


for (byte[] s : splitString) {


byte[] doFinal = cipher.doFinal(s);
bao.write(doFinal);
}
return bao.toByteArray();
}


public static List<byte[]> splitBytes(byte[] src, int len) {


List<byte[]> dest = new ArrayList<>();


for (int i = 0; i < src.length; i += len) {
byte[] temp;
if (i + len <= src.length) {
temp = new byte[len];


} else {
temp = new byte[src.length - i];
}
for (int j = 0; j < temp.length; j++) {
temp[j] = src[i + j];
}
dest.add(temp);
}
return dest;
}
    

/**
* 私钥解密方法
* @param data
* @param key
* @return
* @throws Exception
*/
public static String decryptByPrivateKey(String data, String key) throws Exception {
byte[] dataBytes = Base64.decodeBase64(data);
byte[] decrypt = decryptByPrivateKey(dataBytes, key);
return new String(decrypt,Charsets_UTF_8);
}

}

其中 Base64 主要实现网络传输编码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值