package com.mandi.common;

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class AESMethod {
	public static String encryptPKCS7ForBase64(String pwd,String source,byte[] IV){
		if(source==null||pwd==null)
			return null;
		try {
			KeyGenerator keygen=KeyGenerator.getInstance("AES");
			SecureRandom sr=SecureRandom.getInstance("SHA1PRNG");
			sr.setSeed(pwd.getBytes());
			keygen.init(128,sr);
			SecretKey key=keygen.generateKey();
			byte[] keyendoce=key.getEncoded();
			SecretKeySpec keyspec=new SecretKeySpec(keyendoce, "AES");
			Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
			try {
				cipher.init(Cipher.ENCRYPT_MODE,keyspec,new IvParameterSpec(IV));
				byte[] sbytes=null;
				sbytes = cipher.doFinal(source.getBytes("utf8"));
				return Base64.encodeBase64String(sbytes) ;//byte2hexStr(sbytes);  //这里也可以用base64来表示,这样解密的时候反解析base64
			} catch (UnsupportedEncodingException e) {
				System.out.println("加密过程中,getbyte有错误!");
				e.printStackTrace();
			} catch (InvalidAlgorithmParameterException e) {
				e.printStackTrace();
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	
	public static String decryptPKCS7ForBase64(String pwd,String source,byte[] IV){
		if(source==null||pwd==null)
			return "";
		byte[] sbytes=Base64.decodeBase64(source);//hexStr2bytes(source);
		try {
			KeyGenerator keygen=KeyGenerator.getInstance("AES");
			SecureRandom sr=SecureRandom.getInstance("SHA1PRNG");
			sr.setSeed(pwd.getBytes());
			keygen.init(128,sr);
			SecretKey key=keygen.generateKey();
			byte[] keyendoce=key.getEncoded();
			SecretKeySpec keyspec=new SecretKeySpec(keyendoce, "AES");
			Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
			try {
				cipher.init(Cipher.DECRYPT_MODE, keyspec,new IvParameterSpec(IV));
				byte[] dbytes=cipher.doFinal(sbytes);
				return new String(dbytes,"utf8");
			} catch (UnsupportedEncodingException e) {
				System.out.println("解密过程中,编码错误!");
				e.printStackTrace();
			} catch (InvalidAlgorithmParameterException e) {
				e.printStackTrace();
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	
	public static String encryptPKCS7ForBase64(byte[] pwd,String source,byte[] IV){
		if(source==null||pwd==null)
			return null;
		try {
			KeyGenerator keygen=KeyGenerator.getInstance("AES");
			SecureRandom sr=SecureRandom.getInstance("SHA1PRNG");
			sr.setSeed(pwd);
			keygen.init(128,sr);
			SecretKey key=keygen.generateKey();
			byte[] keyendoce=key.getEncoded();
			SecretKeySpec keyspec=new SecretKeySpec(keyendoce, "AES");
			Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
			try {
				cipher.init(Cipher.ENCRYPT_MODE,keyspec,new IvParameterSpec(IV));
				byte[] sbytes=null;
				sbytes = cipher.doFinal(source.getBytes("utf8"));
				return Base64.encodeBase64String(sbytes);//byte2hexStr(sbytes);  //这里也可以用base64来表示,这样解密的时候反解析base64
			} catch (UnsupportedEncodingException e) {
				System.out.println("加密过程中,getbyte有错误!");
				e.printStackTrace();
			} catch (InvalidAlgorithmParameterException e) {
				e.printStackTrace();
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	
	public static String decryptPKCS7ForBase64(byte[] pwd,String source,byte[] IV){
		if(source==null||pwd==null)
			return "";
		byte[] sbytes=Base64.decodeBase64(source);//hexStr2bytes(source);
		try {
			KeyGenerator keygen=KeyGenerator.getInstance("AES");
			SecureRandom sr=SecureRandom.getInstance("SHA1PRNG");
			sr.setSeed(pwd);
			keygen.init(128,sr);
			SecretKey key=keygen.generateKey();
			byte[] keyendoce=key.getEncoded();
			SecretKeySpec keyspec=new SecretKeySpec(keyendoce, "AES");
			Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
			try {
				cipher.init(Cipher.DECRYPT_MODE, keyspec,new IvParameterSpec(IV));
				byte[] dbytes=cipher.doFinal(sbytes);
				return new String(dbytes,"utf8");
			} catch (UnsupportedEncodingException e) {
				System.out.println("解密过程中,编码错误!");
				e.printStackTrace();
			} catch (InvalidAlgorithmParameterException e) {
				e.printStackTrace();
			}
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		return "";
	}
}