|  | @ -0,0 +1,332 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.care.service.hz;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.crypto.Cipher;
 | 
	
		
			
				|  |  | import java.io.ByteArrayOutputStream;
 | 
	
		
			
				|  |  | 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.Base64;
 | 
	
		
			
				|  |  | import java.util.HashMap;
 | 
	
		
			
				|  |  | import java.util.Map;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | public class RSAUtils {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * 加密算法RSA
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static final String KEY_ALGORITHM = "RSA";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * 签名算法
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * 获取公钥的key
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static final String PUBLIC_KEY = "RSAPublicKey";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * 获取私钥的key
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static final String PRIVATE_KEY = "RSAPrivateKey";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * RSA最大加密明文大小
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static final int MAX_ENCRYPT_BLOCK = 117;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * RSA最大解密密文大小
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private static final int MAX_DECRYPT_BLOCK = 128;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 生成密钥对(公钥和私钥)
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static Map<String, Object> genKeyPair() throws Exception {
 | 
	
		
			
				|  |  |         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         keyPairGen.initialize(1024);
 | 
	
		
			
				|  |  |         KeyPair keyPair = keyPairGen.generateKeyPair();
 | 
	
		
			
				|  |  |         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
 | 
	
		
			
				|  |  |         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
 | 
	
		
			
				|  |  |         Map<String, Object> keyMap = new HashMap<String, Object>(2);
 | 
	
		
			
				|  |  |         keyMap.put(PUBLIC_KEY, publicKey);
 | 
	
		
			
				|  |  |         keyMap.put(PRIVATE_KEY, privateKey);
 | 
	
		
			
				|  |  |         return keyMap;
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 用私钥对信息生成数字签名
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 已加密数据
 | 
	
		
			
				|  |  |      * @param privateKey 私钥(BASE64编码)
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String sign(String content, String privateKey) throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(privateKey);
 | 
	
		
			
				|  |  |         byte[] data = content.getBytes("UTF-8");
 | 
	
		
			
				|  |  |         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
 | 
	
		
			
				|  |  |         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
 | 
	
		
			
				|  |  |         signature.initSign(privateK);
 | 
	
		
			
				|  |  |         signature.update(data);
 | 
	
		
			
				|  |  |         return encryptBASE64(signature.sign());
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 校验数字签名
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 已加密数据
 | 
	
		
			
				|  |  |      * @param publicKey 公钥(BASE64编码)
 | 
	
		
			
				|  |  |      * @param sign 数字签名
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static boolean verify(String content, String publicKey, String sign)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(publicKey);
 | 
	
		
			
				|  |  |         byte[] data = content.getBytes("UTF-8");
 | 
	
		
			
				|  |  |         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         PublicKey publicK = keyFactory.generatePublic(keySpec);
 | 
	
		
			
				|  |  |         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
 | 
	
		
			
				|  |  |         signature.initVerify(publicK);
 | 
	
		
			
				|  |  |         signature.update(data);
 | 
	
		
			
				|  |  |         return signature.verify(decryptBASE64(sign));
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <P>
 | 
	
		
			
				|  |  |      * 私钥解密
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 已加密数据
 | 
	
		
			
				|  |  |      * @param privateKey 私钥(BASE64编码)
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String decryptByPrivateKey(String content, String privateKey)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(privateKey);
 | 
	
		
			
				|  |  |         byte[] encryptedData = decryptBASE64(content);
 | 
	
		
			
				|  |  |         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 | 
	
		
			
				|  |  |         cipher.init(Cipher.DECRYPT_MODE, privateK);
 | 
	
		
			
				|  |  |         int inputLen = encryptedData.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(encryptedData, offSet, MAX_DECRYPT_BLOCK);
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             out.write(cache, 0, cache.length);
 | 
	
		
			
				|  |  |             i++;
 | 
	
		
			
				|  |  |             offSet = i * MAX_DECRYPT_BLOCK;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         byte[] decryptedData = out.toByteArray();
 | 
	
		
			
				|  |  |         out.close();
 | 
	
		
			
				|  |  |         return new String(decryptedData,"UTF-8");
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 公钥解密
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 已加密数据
 | 
	
		
			
				|  |  |      * @param publicKey 公钥(BASE64编码)
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String decryptByPublicKey(String content, String publicKey)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(publicKey);
 | 
	
		
			
				|  |  |         byte[] encryptedData = decryptBASE64(content);
 | 
	
		
			
				|  |  |         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         Key publicK = keyFactory.generatePublic(x509KeySpec);
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 | 
	
		
			
				|  |  |         cipher.init(Cipher.DECRYPT_MODE, publicK);
 | 
	
		
			
				|  |  |         int inputLen = encryptedData.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(encryptedData, offSet, MAX_DECRYPT_BLOCK);
 | 
	
		
			
				|  |  |             } else {
 | 
	
		
			
				|  |  |                 cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |             out.write(cache, 0, cache.length);
 | 
	
		
			
				|  |  |             i++;
 | 
	
		
			
				|  |  |             offSet = i * MAX_DECRYPT_BLOCK;
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  |         byte[] decryptedData = out.toByteArray();
 | 
	
		
			
				|  |  |         out.close();
 | 
	
		
			
				|  |  |         return new String(decryptedData,"UTF-8");
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 公钥加密
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 源数据
 | 
	
		
			
				|  |  |      * @param publicKey 公钥(BASE64编码)
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String encryptByPublicKey(String content, String publicKey)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(publicKey);
 | 
	
		
			
				|  |  |         byte[] data = content.getBytes("UTF-8");
 | 
	
		
			
				|  |  |         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         Key publicK = keyFactory.generatePublic(x509KeySpec);
 | 
	
		
			
				|  |  |         // 对数据加密
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 | 
	
		
			
				|  |  |         cipher.init(Cipher.ENCRYPT_MODE, publicK);
 | 
	
		
			
				|  |  |         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();
 | 
	
		
			
				|  |  |         //Base64加密
 | 
	
		
			
				|  |  |         return encryptBASE64(encryptedData);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 私钥加密
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param content 源数据
 | 
	
		
			
				|  |  |      * @param privateKey 私钥(BASE64编码)
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String encryptByPrivateKey(String content, String privateKey)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         byte[] keyBytes = decryptBASE64(privateKey);
 | 
	
		
			
				|  |  |         byte[] data = content.getBytes("UTF-8");
 | 
	
		
			
				|  |  |         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
 | 
	
		
			
				|  |  |         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
 | 
	
		
			
				|  |  |         Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
 | 
	
		
			
				|  |  |         cipher.init(Cipher.ENCRYPT_MODE, privateK);
 | 
	
		
			
				|  |  |         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();
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         //Base64加密
 | 
	
		
			
				|  |  |         return encryptBASE64(encryptedData);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 获取私钥
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param keyMap 密钥对
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String getPrivateKey(Map<String, Object> keyMap)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         Key key = (Key) keyMap.get(PRIVATE_KEY);
 | 
	
		
			
				|  |  |         return encryptBASE64(key.getEncoded());
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /** *//**
 | 
	
		
			
				|  |  |      * <p>
 | 
	
		
			
				|  |  |      * 获取公钥
 | 
	
		
			
				|  |  |      * </p>
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param keyMap 密钥对
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String getPublicKey(Map<String, Object> keyMap)
 | 
	
		
			
				|  |  |             throws Exception {
 | 
	
		
			
				|  |  |         Key key = (Key) keyMap.get(PUBLIC_KEY);
 | 
	
		
			
				|  |  |         return encryptBASE64(key.getEncoded());
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * BASE64解密
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param key
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static byte[] decryptBASE64(String key) throws Exception {
 | 
	
		
			
				|  |  |         return Base64.getDecoder().decode(key);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * BASE64加密
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param key
 | 
	
		
			
				|  |  |      * @return
 | 
	
		
			
				|  |  |      * @throws Exception
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String encryptBASE64(byte[] key) throws Exception {
 | 
	
		
			
				|  |  |         return Base64.getEncoder().encodeToString(key);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | }
 |