packagecom.carspeak.client.util;importjava.io.UnsupportedEncodingException;importjava.security.InvalidKeyException;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeException;importjavax.crypto.KeyGenerator;importjavax.crypto.NoSuchPaddingException;importjavax.crypto.SecretKey;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;/*** AES 加密解密
*
*@authorhuqiang
**/
public classAESUtil {public staticString encrypt(String seed, String cleartext)throwsException {byte[] rawKey =getRawKey(seed.getBytes());byte[] result =encrypt(rawKey, cleartext.getBytes());returntoHex(result);
}public staticString decrypt(String seed, String encrypted)throwsException {byte[] rawKey =getRawKey(seed.getBytes());byte[] enc =toByte(encrypted);byte[] result =decrypt(rawKey, enc);return newString(result);
}private static byte[] getRawKey(byte[] seed) throwsException {
KeyGenerator kgen= KeyGenerator.getInstance("AES");
SecureRandom sr= SecureRandom.getInstance("SHA1PRNG", "Crypto");
sr.setSeed(seed);
kgen.init(128, sr); //192 and 256 bits may not be available
SecretKey skey =kgen.generateKey();byte[] raw =skey.getEncoded();returnraw;
}private static byte[] encrypt(byte[] raw, byte[] clear) throwsException {
SecretKeySpec skeySpec= new SecretKeySpec(raw, "AES");
Cipher cipher= Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec,newIvParameterSpec(new byte[cipher.getBlockSize()]));byte[] encrypted =cipher.doFinal(clear);returnencrypted;
}private static byte[] decrypt(byte[] raw, byte[] encrypted)throwsException {
SecretKeySpec skeySpec= new SecretKeySpec(raw, "AES");
Cipher cipher= Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec,newIvParameterSpec(new byte[cipher.getBlockSize()]));byte[] decrypted =cipher.doFinal(encrypted);returndecrypted;
}private staticString toHex(String txt) {returntoHex(txt.getBytes());
}private staticString fromHex(String hex) {return newString(toByte(hex));
}private static byte[] toByte(String hexString) {int len = hexString.length() / 2;byte[] result = new byte[len];for (int i = 0; i < len; i++)
result[i]= Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),16).byteValue();returnresult;
}private static String toHex(byte[] buf) {if (buf == null)return "";
StringBuffer result= new StringBuffer(2 *buf.length);for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}returnresult.toString();
}private final static String HEX = "0123456789ABCDEF";private static void appendHex(StringBuffer sb, byteb) {
sb.append(HEX.charAt((b>> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
}
}