import java.io.UnsupportedEncodingException;
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.SecretKeySpec;
import org.junit.Test;
/**
* 可逆加密* 對稱密鑰加密又叫專用密鑰加密,即發送和接收數據的雙方必使用相同的密鑰對明文進行加密和解密運算。
* 對稱密鑰加密算法主要包括:DES、3DES、IDEA、FEAL、BLOWFISH等。
*
* @author Administrator
*/
public class AES {
/**
* 輔助數組,主要把byte值轉化爲對應的char值
*/
private static char[] CHARS = "0123456789abcdef".toCharArray();
/**
* 加密
*
* 因爲沒有操作對象,也沒有操作相同的資源,所以不會出現多線程問題
*
* @param content
* 需要加密的內容
* @param password
* 加密密碼
* @return
*/
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
return result;
// return parseByte2HexStr(result); // 加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
/**
* 把二進制byte數組轉化爲十六進制字符串
* @param buf
* @return
*/
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
byte b = buf[i];
byte c1 = (byte) ((b & 0xF0) >> 4);
byte c2 = (byte) (b & 0x0F);
sBuffer.append(CHARS[c1]).append(CHARS[c2]);
}
return sBuffer.toString().toUpperCase();
}
public static byte[] parseHexByte2Str(String str) {
str = str.toLowerCase();
byte[] bytes = new byte[str.length() / 2];
char[] cs = str.toCharArray();
for (int i = 0; i < cs.length / 2; ++i) {
char c1 = cs[i * 2];
char c2 = cs[i * 2 + 1];
int a1, a2;
if (c1 < 'a') a1 = c1 - '0';
else a1 = (c1 - 'a') + 10;
if (c2 < 'a') a2 = c2 - '0';
else a2 = (c2 - 'a') + 10;
bytes[i] = (byte)(((a1 & 0x0F) << 4) | (a2 & 0x0F));
}
return bytes;
}
/**
* 解密
*
* @param content
* 待解密內容
* @param password
* 解密密鑰
* @return
*/
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 創建密碼器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(content);
return result; // 加密
} 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 null;
}
@Test
public void testEncrypt() {
byte[] contentEncrypt = AES.encrypt("你好123威風威風22222222","12345678");
try {
String after = AES.parseByte2HexStr(contentEncrypt);
System.out.println("加密後:" + after);
byte[] bytes = AES.parseHexByte2Str(after);
System.out.println(new String(AES.decrypt(bytes, "12345678"),"UTF-8"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}