package com.moon.server.helper; import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.core.io.ClassPathResource; import javax.crypto.Cipher; import java.io.*; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; /** * RSA工具类 * @author WWW */ public class RsaHelper { /** * 私钥 */ private static String privateKey; /** * 公钥 */ private static String publicKey; /** * 密钥算法 */ private static final String KEY_ALGORITHM = "RSA"; /** * RSA密钥长度:1024 或 2048 */ private static final int DEFAULT_RSA_KEY_SIZE = 1024; /** * 日志 */ private final static Log log = LogFactory.getLog(RsaHelper.class); /** * 生成公私钥 */ public static void generate() { Map result = generateRsaKey(DEFAULT_RSA_KEY_SIZE); System.out.println("公钥为:" + result.get("publicKey")); System.out.println("私钥为:" + result.get("privateKey")); } /** * 获取RSA加密私钥 * * @return * @throws IOException */ public static String getPrivateKey() throws IOException { if (privateKey == null) { InputStream inPrivate = new ClassPathResource("config" + File.separator + "rsa_private_key.txt").getInputStream(); privateKey = inputStream2String(inPrivate); inPrivate.close(); } return privateKey; } /** * 获取RSA加密公钥 * * @return * @throws IOException */ public static String getPublicKey() throws IOException { if (publicKey == null) { InputStream inPrivate = new ClassPathResource("config" + File.separator + "rsa_public_key.txt").getInputStream(); publicKey = inputStream2String(inPrivate); inPrivate.close(); } return publicKey; } /** * 读取文本文件 * * @param fileName 文件路径 * @return * @throws IOException */ public static String readFile(String fileName) throws IOException { File file = new File(fileName); BufferedReader br = new BufferedReader(new FileReader(file)); StringBuilder result = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { result.append(System.lineSeparator() + line); } br.close(); return result.toString(); } /** * 把inputStream转成String * * @param is * @return * @throws IOException */ private static String inputStream2String(InputStream is) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int i = -1; while ((i = is.read()) != -1) { baos.write(i); } String str = baos.toString(); baos.close(); return str; } /** * 生成RSA的公私钥 * * @param keySize 1025 或 2048 * @return */ public static Map generateRsaKey(int keySize) { Map result = new HashMap<>(2); try { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); // 初始化密钥对生成器,密钥大小为1024 2048位 keyPairGen.initialize(keySize, new SecureRandom()); // 生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); // 得到公钥字符串 String pub = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded())); result.put("publicKey", pub); // 得到私钥字符串 String pri = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded())); result.put("privateKey", pri); } catch (Exception ex) { log.error(ex.getMessage(), ex); } return result; } /** * RSA私钥解密 * * @param str 加密的字符串 * @return 解密字符串 * @throws Exception 加密过程中的异常信息 */ public static String decrypt(String str) throws Exception { // 64位解码加密后的字符串 byte[] inputByte = Base64.decodeBase64(str.getBytes(StandardCharsets.UTF_8)); // Base64编码的私钥 byte[] decoded = Base64.decodeBase64(getPrivateKey()); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); // RSA解密:RSA/ECB/NoPadding Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; } /** * RSA公钥加密 * * @param str 需要加密的字符串 * @return 密文 * @throws Exception 加密过程中的异常信息 */ public static String encrypt(String str) throws Exception { // Base64编码的公钥 byte[] decoded = Base64.decodeBase64(getPublicKey()); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); // RSA加密:RSA/ECB/NoPadding Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8))); return outStr; } }