package com.sys.core;

import javax.crypto.Cipher;
import java.io.IOException;
import java.security.Key;

public class SecurityEncode {
	private Cipher encryptCipher = null;
//	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
	private Cipher decryptCipher = null;
	private static String staticKey = "";
//
	public String encrypt(String strIn,String keyStr) {
		try{
			if(encryptCipher == null){
				getCipher(keyStr);
			}
			return byteArr2HexStr( encryptCipher.doFinal( strIn.getBytes() ));
		}catch(Exception e){
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * 解密
	 * @param strIn
	 * @return
	 * @throws Exception 
	 */
	public String decrypt(String strIn,String keyStr) throws Exception {
		
			 if(decryptCipher == null || !staticKey.equals(keyStr)){
				 getCipher(keyStr);
				 staticKey = keyStr;
			    }
	          byte[] result = decryptCipher.doFinal(hexStr2ByteArr(strIn));
	                    
	             return new String(result, "UTF-8");
	        
	}
	private Cipher getCipher(String keyStr) throws Exception {
		//Security.addProvider(new SunJCE());
		Key key = loadKey(keyStr);
	
		//加密（如果不需要加密可以不实例化）
		encryptCipher = Cipher.getInstance("DES");
		encryptCipher.init(Cipher.ENCRYPT_MODE, key);
	
//		//解密（如果不需要加密可以不实例化）
		decryptCipher = Cipher.getInstance("DES");
		decryptCipher.init(Cipher.DECRYPT_MODE, key);
//		
		return encryptCipher;
	}
	private Key loadKey(String keyStr) throws IOException {
		//从配置文件中加载密钥文件
		//Properties p = new Properties();
		//p.load(this.getClass().getClassLoader().getResourceAsStream(filename));
	
		//String strKey = p.getProperty(property);
		//加密key
		String strKey = keyStr;
	
		byte[] byteKey = strKey.getBytes();
	
		// 创建一个空的8位字节数组（默认值为0）
		byte[] arrB = new byte[8];
		// 将原始字节数组转换为8位
		for (int i = 0; i < byteKey.length && i < arrB.length; i++) {
			arrB[i] = byteKey[i];
		}
		// 生成密钥
		Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
		return key;
	}

	private static String byteArr2HexStr(byte[] arrB) throws Exception {
		int iLen = arrB.length;
		// 每个byte用两个字符才能表示，所以字符串的长度是数组长度的两倍
		StringBuffer sb = new StringBuffer(iLen * 2);
		for (int i = 0; i < iLen; i++) {
			int intTmp = arrB[i];
			// 把负数转换为正数
			while (intTmp < 0) {
				intTmp = intTmp + 256;
			}
			// 小于0F的数需要在前面补0
			if (intTmp < 16) {
				sb.append("0");
			}
			sb.append(Integer.toString(intTmp, 16));
		}
		return sb.toString();
	}
	private static byte[] hexStr2ByteArr(String strIn)
	       throws NumberFormatException {
	        byte[] arrB = strIn.getBytes();
	        int iLen = arrB.length;
	        // 两个字符表示一个字节，所以字节数组长度是字符串长度除以2
	        byte[] arrOut = new byte[iLen / 2];
	        for (int i = 0; i < iLen; i = i + 2) {
	            String strTmp = new String(arrB, i, 2);
	            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
	        }
	        return arrOut;
	    }
}
