123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- package com.fdkankan.common.util;
- import org.apache.commons.codec.binary.Base64;
- import org.springframework.util.ResourceUtils;
- import sun.misc.BASE64Decoder;
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.NoSuchPaddingException;
- import java.io.*;
- import java.security.*;
- import java.security.interfaces.RSAPrivateKey;
- import java.security.interfaces.RSAPublicKey;
- import java.security.spec.InvalidKeySpecException;
- import java.security.spec.PKCS8EncodedKeySpec;
- import java.security.spec.X509EncodedKeySpec;
- public class RSAEncrypt {
- /**
- * 字节数据转字符串专用集合
- */
- private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6',
- '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
- private static final String PRIVATE_KEY = "classpath:key/private_pkcs8.pem";
- private static final String PUBLIC_KEY = "classpath:key/public.pem";
- /**
- * RSA最大解密密文大小
- */
- private static final int MAX_DECRYPT_BLOCK = 128;
- /**
- * 随机生成密钥对
- */
- public static void genKeyPair(String filePath) {
- // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
- KeyPairGenerator keyPairGen = null;
- try {
- keyPairGen = KeyPairGenerator.getInstance("RSA");
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- // 初始化密钥对生成器,密钥大小为96-1024位
- keyPairGen.initialize(1024, new SecureRandom());
- // 生成一个密钥对,保存在keyPair中
- KeyPair keyPair = keyPairGen.generateKeyPair();
- // 得到私钥
- RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
- // 得到公钥
- RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
- try {
- // 得到公钥字符串
- Base64 base64 = new Base64();
- String publicKeyString = new String(base64.encode(publicKey.getEncoded()));
- // 得到私钥字符串
- String privateKeyString = new String(base64.encode(privateKey.getEncoded()));
- // 将密钥对写入到文件
- FileWriter pubfw = new FileWriter(filePath + PUBLIC_KEY);
- FileWriter prifw = new FileWriter(filePath + PRIVATE_KEY);
- BufferedWriter pubbw = new BufferedWriter(pubfw);
- BufferedWriter pribw = new BufferedWriter(prifw);
- pubbw.write(publicKeyString);
- pribw.write(privateKeyString);
- pubbw.flush();
- pubbw.close();
- pubfw.close();
- pribw.flush();
- pribw.close();
- prifw.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 从文件中输入流中加载公钥
- *
- * @throws Exception 加载公钥时产生的异常
- */
- public static String loadPublicKeyByFile() throws Exception {
- try {
- BufferedReader br = new BufferedReader(new FileReader(ResourceUtils.getFile(PUBLIC_KEY)));
- String readLine = null;
- StringBuilder sb = new StringBuilder();
- while ((readLine = br.readLine()) != null) {
- if (readLine.charAt(0) == '-') {
- continue;
- } else {
- sb.append(readLine);
- sb.append('\r');
- }
- }
- br.close();
- return sb.toString();
- } catch (IOException e) {
- throw new Exception("公钥数据流读取错误");
- } catch (NullPointerException e) {
- throw new Exception("公钥输入流为空");
- }
- }
- /**
- * 从文件中输入流中加载公钥
- *
- * @throws Exception 加载公钥时产生的异常
- */
- public static String loadPublicKeyByFile(String publicKy) throws Exception {
- try {
- BufferedReader br = new BufferedReader(new FileReader(new File(publicKy)));
- String readLine = null;
- StringBuilder sb = new StringBuilder();
- while ((readLine = br.readLine()) != null) {
- if (readLine.charAt(0) == '-') {
- continue;
- } else {
- sb.append(readLine);
- sb.append('\r');
- }
- }
- br.close();
- return sb.toString();
- } catch (IOException e) {
- throw new Exception("公钥数据流读取错误");
- } catch (NullPointerException e) {
- throw new Exception("公钥输入流为空");
- }
- }
- /**
- * 从字符串中加载公钥
- *
- * @param publicKeyStr 公钥数据字符串
- * @throws Exception 加载公钥时产生的异常
- */
- public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr)
- throws Exception {
- try {
- BASE64Decoder base64 = new BASE64Decoder();
- byte[] buffer = base64.decodeBuffer(publicKeyStr);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
- return (RSAPublicKey) keyFactory.generatePublic(keySpec);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此算法");
- } catch (InvalidKeySpecException e) {
- throw new Exception("公钥非法");
- } catch (NullPointerException e) {
- throw new Exception("公钥数据为空");
- }
- }
- /**
- * 从文件中加载私钥
- *
- * @return 是否成功
- * @throws Exception
- */
- public static String loadPrivateKeyByFile() throws Exception {
- try {
- InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("key/private_pkcs8.pem");
- StringBuilder builder = new StringBuilder();
- InputStreamReader reader = new InputStreamReader(inputStream , "UTF-8" );
- BufferedReader bfReader = new BufferedReader( reader );
- String tmpContent = null;
- while ((tmpContent = bfReader.readLine()) != null) {
- if (tmpContent.charAt(0) == '-') {
- continue;
- } else {
- builder.append(tmpContent);
- builder.append('\r');
- }
- }
- bfReader.close();
- return builder.toString();
- // BufferedReader br = new BufferedReader(new FileReader(ResourceUtils.getFile(PRIVATE_KEY)));
- // String readLine = null;
- // StringBuilder sb = new StringBuilder();
- // while ((readLine = br.readLine()) != null) {
- // if (readLine.charAt(0) == '-') {
- // continue;
- // } else {
- // sb.append(readLine);
- // sb.append('\r');
- // }
- // }
- // br.close();
- // return sb.toString();
- } catch (IOException e) {
- throw new Exception("私钥数据读取错误");
- } catch (NullPointerException e) {
- throw new Exception("私钥输入流为空");
- }
- }
- /**
- * 从文件中加载私钥
- *
- * @return 是否成功
- * @throws Exception
- */
- public static String loadPrivateKeyByFile(String filePath) throws Exception {
- try {
- InputStream inputStream = new FileInputStream(filePath);
- StringBuilder builder = new StringBuilder();
- InputStreamReader reader = new InputStreamReader(inputStream , "UTF-8" );
- BufferedReader bfReader = new BufferedReader( reader );
- String tmpContent = null;
- while ((tmpContent = bfReader.readLine()) != null) {
- if (tmpContent.charAt(0) == '-') {
- continue;
- } else {
- builder.append(tmpContent);
- builder.append('\r');
- }
- }
- bfReader.close();
- return builder.toString();
- // BufferedReader br = new BufferedReader(new FileReader(ResourceUtils.getFile(PRIVATE_KEY)));
- // String readLine = null;
- // StringBuilder sb = new StringBuilder();
- // while ((readLine = br.readLine()) != null) {
- // if (readLine.charAt(0) == '-') {
- // continue;
- // } else {
- // sb.append(readLine);
- // sb.append('\r');
- // }
- // }
- // br.close();
- // return sb.toString();
- } catch (IOException e) {
- throw new Exception("私钥数据读取错误");
- } catch (NullPointerException e) {
- throw new Exception("私钥输入流为空");
- }
- }
- public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)
- throws Exception {
- try {
- BASE64Decoder base64Decoder = new BASE64Decoder();
- byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr);
- PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
- KeyFactory keyFactory = KeyFactory.getInstance("RSA");
- return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此算法");
- } catch (InvalidKeySpecException e) {
- throw new Exception("私钥非法");
- } catch (NullPointerException e) {
- throw new Exception("私钥数据为空");
- }
- }
- /**
- * 公钥加密过程
- *
- * @param publicKey 公钥
- * @param plainTextData 明文数据
- * @return
- * @throws Exception 加密过程中的异常信息
- */
- public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)
- throws Exception {
- if (publicKey == null) {
- throw new Exception("加密公钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
- byte[] output = cipher.doFinal(plainTextData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此加密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("加密公钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("明文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("明文数据已损坏");
- }
- }
- /**
- * 私钥加密过程
- *
- * @param privateKey 私钥
- * @param plainTextData 明文数据
- * @return
- * @throws Exception 加密过程中的异常信息
- */
- public static byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData)
- throws Exception {
- if (privateKey == null) {
- throw new Exception("加密私钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.ENCRYPT_MODE, privateKey);
- byte[] output = cipher.doFinal(plainTextData);
- return output;
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此加密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("加密私钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("明文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("明文数据已损坏");
- }
- }
- /**
- * 私钥解密过程
- *
- * @param privateKey 私钥
- * @param cipherData 密文数据
- * @return 明文
- * @throws Exception 解密过程中的异常信息
- */
- public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)
- throws Exception {
- if (privateKey == null) {
- throw new Exception("解密私钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.DECRYPT_MODE, privateKey);
- /*byte[] output = cipher.doFinal(cipherData);
- return output;*/
- return getDecrytedData(cipherData, cipher);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此解密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("解密私钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("密文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("密文数据已损坏");
- }
- }
- /**
- * 公钥解密过程
- *
- * @param publicKey 公钥
- * @param cipherData 密文数据
- * @return 明文
- * @throws Exception 解密过程中的异常信息
- */
- public static byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)
- throws Exception {
- if (publicKey == null) {
- throw new Exception("解密公钥为空, 请设置");
- }
- Cipher cipher = null;
- try {
- // 使用默认RSA
- cipher = Cipher.getInstance("RSA");
- // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
- cipher.init(Cipher.DECRYPT_MODE, publicKey);
- /*byte[] output = cipher.doFinal(cipherData);
- return output;*/
- return getDecrytedData(cipherData, cipher);
- } catch (NoSuchAlgorithmException e) {
- throw new Exception("无此解密算法");
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- return null;
- } catch (InvalidKeyException e) {
- throw new Exception("解密公钥非法,请检查");
- } catch (IllegalBlockSizeException e) {
- throw new Exception("密文长度非法");
- } catch (BadPaddingException e) {
- throw new Exception("密文数据已损坏");
- }
- }
- private static byte[] getDecrytedData(byte[] cipherData, Cipher cipher) throws IllegalBlockSizeException, BadPaddingException, IOException {
- // int inputLen = cipherData.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(cipherData, offSet, MAX_DECRYPT_BLOCK);
- //// } else {
- //// cache = cipher.doFinal(cipherData, offSet, inputLen - offSet);
- //// }
- //// out.write(cache, 0, cache.length);
- //// i++;
- //// offSet = i * MAX_DECRYPT_BLOCK;
- //// }
- //// byte[] decryptedData = out.toByteArray();
- //// out.close();
- //// return decryptedData;
- int inputLen = cipherData.length;
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- int offSet = 0;
- for(int i = 0; inputLen - offSet > 0; offSet = i * 256) {
- byte[] cache;
- if(inputLen - offSet > 256) {
- cache = cipher.doFinal(cipherData, offSet, 256);
- } else {
- cache = cipher.doFinal(cipherData, offSet, inputLen - offSet);
- }
- out.write(cache, 0, cache.length);
- ++i;
- }
- byte[] decryptedData = out.toByteArray();
- out.close();
- return decryptedData;
- }
- /**
- * 字节数据转十六进制字符串
- *
- * @param data 输入数据
- * @return 十六进制内容
- */
- public static String byteArrayToString(byte[] data) {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < data.length; i++) {
- // 取出字节的高四位 作为索引得到相应的十六进制标识符 注意无符号右移
- stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
- // 取出字节的低四位 作为索引得到相应的十六进制标识符
- stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
- if (i < data.length - 1) {
- stringBuilder.append(' ');
- }
- }
- return stringBuilder.toString();
- }
- public static void main(String[] args) throws Exception {
- }
- }
|