|  | @ -0,0 +1,168 @@
 | 
	
		
			
				|  |  | package com.yihu.jw.hospital.prescription.service.entrance.util;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.security.NoSuchAlgorithmException;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import javax.crypto.Cipher;
 | 
	
		
			
				|  |  | import javax.crypto.KeyGenerator;
 | 
	
		
			
				|  |  | import javax.crypto.SecretKey;
 | 
	
		
			
				|  |  | import javax.crypto.spec.IvParameterSpec;
 | 
	
		
			
				|  |  | import javax.crypto.spec.SecretKeySpec;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import com.yihu.jw.utils.encode.Base64;
 | 
	
		
			
				|  |  | import sun.misc.BASE64Decoder;
 | 
	
		
			
				|  |  | import sun.misc.BASE64Encoder;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | public class AES {
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	public static String encrypt(String strKey, String strIn) {
 | 
	
		
			
				|  |  | 		try {
 | 
	
		
			
				|  |  | 			SecretKeySpec skeySpec = getKey(strKey);
 | 
	
		
			
				|  |  | 			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
 | 
	
		
			
				|  |  | 			IvParameterSpec iv = new IvParameterSpec(
 | 
	
		
			
				|  |  | 					"0102030405060708".getBytes());
 | 
	
		
			
				|  |  | 			cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
 | 
	
		
			
				|  |  | 			byte[] encrypted = cipher.doFinal(strIn.getBytes("UTF-8"));
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 			return Base64.encode(encrypted);
 | 
	
		
			
				|  |  | 		} catch (Exception e) {
 | 
	
		
			
				|  |  | 			e.printStackTrace();
 | 
	
		
			
				|  |  | 			return null;
 | 
	
		
			
				|  |  | 		}
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	public static String decrypt(String strKey, String strIn) throws Exception {
 | 
	
		
			
				|  |  | 		try {
 | 
	
		
			
				|  |  | 			SecretKeySpec skeySpec = getKey(strKey);
 | 
	
		
			
				|  |  | 			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
 | 
	
		
			
				|  |  | 			IvParameterSpec iv = new IvParameterSpec(
 | 
	
		
			
				|  |  | 					"0102030405060708".getBytes());
 | 
	
		
			
				|  |  | 			cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
 | 
	
		
			
				|  |  | 			byte[] encrypted1 = Base64.decode(strIn);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 			byte[] original = cipher.doFinal(encrypted1);
 | 
	
		
			
				|  |  | 			String originalString = new String(original, "UTF-8");
 | 
	
		
			
				|  |  | 			return originalString;
 | 
	
		
			
				|  |  | 		} catch (Exception e) {
 | 
	
		
			
				|  |  | 			e.printStackTrace();
 | 
	
		
			
				|  |  | 			return null;
 | 
	
		
			
				|  |  | 		}
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	private static SecretKeySpec getKey(String strKey) throws Exception {
 | 
	
		
			
				|  |  | 		byte[] arrBTmp = strKey.getBytes();
 | 
	
		
			
				|  |  | 		byte[] arrB = new byte[16]; // 创建一个空的16位字节数组(默认值为0)
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 		for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
 | 
	
		
			
				|  |  | 			arrB[i] = arrBTmp[i];
 | 
	
		
			
				|  |  | 		}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 		SecretKeySpec skeySpec = new SecretKeySpec(arrB, "AES");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 		return skeySpec;
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 	
 | 
	
		
			
				|  |  | 	/** 
 | 
	
		
			
				|  |  | 	 * 随机生成秘钥 
 | 
	
		
			
				|  |  | 	 */  
 | 
	
		
			
				|  |  | 	public static void generateKey(){    
 | 
	
		
			
				|  |  | 	    try {    
 | 
	
		
			
				|  |  | 	        KeyGenerator kg = KeyGenerator.getInstance("AES");    
 | 
	
		
			
				|  |  | 	        kg.init(128);//要生成多少位,只需要修改这里即可128, 192或256    
 | 
	
		
			
				|  |  | 	        SecretKey sk = kg.generateKey();    
 | 
	
		
			
				|  |  | 	        byte[] b = sk.getEncoded();    
 | 
	
		
			
				|  |  | 	        String s = byteToHexString(b);    
 | 
	
		
			
				|  |  | 	        System.out.println(s);    
 | 
	
		
			
				|  |  | 	        System.out.println("十六进制密钥长度为"+s.length());    
 | 
	
		
			
				|  |  | 	        System.out.println("二进制密钥的长度为"+s.length()*4);    
 | 
	
		
			
				|  |  | 	    } catch (NoSuchAlgorithmException e) {    
 | 
	
		
			
				|  |  | 	        e.printStackTrace();    
 | 
	
		
			
				|  |  | 	        System.out.println("没有此算法。");    
 | 
	
		
			
				|  |  | 	    }    
 | 
	
		
			
				|  |  | 	} 
 | 
	
		
			
				|  |  | 	
 | 
	
		
			
				|  |  | 	/** 
 | 
	
		
			
				|  |  | 	 * byte数组转化为16进制字符串 
 | 
	
		
			
				|  |  | 	 * @param bytes 
 | 
	
		
			
				|  |  | 	 * @return 
 | 
	
		
			
				|  |  | 	 */  
 | 
	
		
			
				|  |  | 	public static String byteToHexString(byte[] bytes){       
 | 
	
		
			
				|  |  | 	    StringBuffer sb = new StringBuffer();       
 | 
	
		
			
				|  |  | 	    for (int i = 0; i < bytes.length; i++) {       
 | 
	
		
			
				|  |  | 	         String strHex=Integer.toHexString(bytes[i]);   
 | 
	
		
			
				|  |  | 	         if(strHex.length() > 3){       
 | 
	
		
			
				|  |  | 	                sb.append(strHex.substring(6));       
 | 
	
		
			
				|  |  | 	         } else {    
 | 
	
		
			
				|  |  | 	              if(strHex.length() < 2){    
 | 
	
		
			
				|  |  | 	                 sb.append("0" + strHex);    
 | 
	
		
			
				|  |  | 	              } else {    
 | 
	
		
			
				|  |  | 	                 sb.append(strHex);       
 | 
	
		
			
				|  |  | 	              }       
 | 
	
		
			
				|  |  | 	         }    
 | 
	
		
			
				|  |  | 	    }    
 | 
	
		
			
				|  |  | 	   return  sb.toString();       
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	public static String signConvertToPara(String region) {
 | 
	
		
			
				|  |  | 		String target = "";
 | 
	
		
			
				|  |  | 		if (region != null) {
 | 
	
		
			
				|  |  | 			target = region.replaceAll("\\+", "%2B").replaceAll("\\ ", "%20")
 | 
	
		
			
				|  |  | 					.replaceAll("\\/", "%2F").replaceAll("\\?", "%3F")
 | 
	
		
			
				|  |  | 					.replaceAll("\\#", "%23").replaceAll("\\&", "%26")
 | 
	
		
			
				|  |  | 					.replaceAll("\\=", "%3D");
 | 
	
		
			
				|  |  | 		}
 | 
	
		
			
				|  |  | 		return target;
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	public static String paraConvertsign(String region) {
 | 
	
		
			
				|  |  | 		String target = "";
 | 
	
		
			
				|  |  | 		if (region != null) {
 | 
	
		
			
				|  |  | 			target = region.replaceAll("%2B", "+").replaceAll("%20", " ")
 | 
	
		
			
				|  |  | 					.replaceAll("%2F", "/").replaceAll("%3F", "?")
 | 
	
		
			
				|  |  | 					.replaceAll("%25", "%").replaceAll("%23", "#")
 | 
	
		
			
				|  |  | 					.replaceAll("%26", "&").replaceAll("%3D", "=");
 | 
	
		
			
				|  |  | 		}
 | 
	
		
			
				|  |  | 		return target;
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | 	//用于和c#互通的加解密
 | 
	
		
			
				|  |  | 	//https://www.jianshu.com/p/9483c9ea3a04
 | 
	
		
			
				|  |  | 	 /**
 | 
	
		
			
				|  |  |      * AES的加密函数
 | 
	
		
			
				|  |  |      * @param str 传入需要加密的字符
 | 
	
		
			
				|  |  |      * @param key 传入一个16位长度的密钥。否则报错
 | 
	
		
			
				|  |  |      * @return 执行成功返回加密结果,否则报错
 | 
	
		
			
				|  |  |      * @throws Exception 抛出一个加密异常
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String aesEncrypt(String str, String key) throws Exception {
 | 
	
		
			
				|  |  |         if (str == null || key == null) return null;
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
 | 
	
		
			
				|  |  |         cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
 | 
	
		
			
				|  |  |         byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
 | 
	
		
			
				|  |  |         return new BASE64Encoder().encode(bytes);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * AES的解密函数
 | 
	
		
			
				|  |  |      * @param str 传入需要解密的字符
 | 
	
		
			
				|  |  |      * @param key 传入一个16位长度的密钥。否则报错
 | 
	
		
			
				|  |  |      * @return 执行成功返回加密结果,否则报错
 | 
	
		
			
				|  |  |      * @throws Exception 抛出一个解密异常
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     public static String aesDecrypt(String str, String key) throws Exception {
 | 
	
		
			
				|  |  |         if (str == null || key == null) return null;
 | 
	
		
			
				|  |  |         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
 | 
	
		
			
				|  |  |         cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
 | 
	
		
			
				|  |  |         byte[] bytes = new BASE64Decoder().decodeBuffer(str);
 | 
	
		
			
				|  |  |         bytes = cipher.doFinal(bytes);
 | 
	
		
			
				|  |  |         return new String(bytes, "utf-8");
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  |     
 | 
	
		
			
				|  |  | 	public static void main(String[] args) throws Exception {
 | 
	
		
			
				|  |  | 		generateKey();
 | 
	
		
			
				|  |  | 		String testKey = "xmxzzxtj";
 | 
	
		
			
				|  |  | 		String testEn = AES.encrypt(testKey, "{'function':'healthExam','yyid00':'220006','userId':'','name':'','phone':'','identityCard':'','icCard':''}");
 | 
	
		
			
				|  |  | 		System.out.println(testEn);
 | 
	
		
			
				|  |  | 		String testDe = AES.decrypt(testKey, testEn);
 | 
	
		
			
				|  |  | 		System.out.println(testDe);
 | 
	
		
			
				|  |  | 		
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | 	}
 | 
	
		
			
				|  |  | }
 |