import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public classAES16 {//加密
public staticString Encrypt(String sSrc, String sKey) throws Exception {if (sKey == null) {
System.out.print("Key为空null");return null;
}//判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");return null;
}byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec= new SecretKeySpec(raw, "AES");
Cipher cipher= Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}//解密
public staticString Decrypt(String sSrc, String sKey) throws Exception {try{//判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");return null;
}//判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");return null;
}byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec= new SecretKeySpec(raw, "AES");
Cipher cipher= Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密
try{byte[] original =cipher.doFinal(encrypted1);
String originalString= new String(original,"utf-8");returnoriginalString;
}catch(Exception e) {
System.out.println(e.toString());return null;
}
}catch(Exception ex) {
System.out.println(ex.toString());return null;
}
}/**
*
* @Description AES解密,加密内容转化为16位二进制后解密mxg20190906
* @return String
* @author mxg*/
public staticString aesDecrypt(String sSrc, String sKey) throws Exception {try{//判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");return null;
}//判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");return null;
}byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec= new SecretKeySpec(raw, "AES");
Cipher cipher= Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);//byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密
try{byte[] original =cipher.doFinal( parseHexStr2Byte(sSrc));
String originalString= new String(original,"utf-8");returnoriginalString;
}catch(Exception e) {
System.out.println(e.toString());return null;
}
}catch(Exception ex) {
System.out.println(ex.toString());return null;
}
}/**将16进制转换为二进制
* @param hexStr
* @return*/
public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)return null;byte[] result = new byte[hexStr.length()/2];for (int i = 0;i< hexStr.length()/2; i++) {int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i]= (byte) (high * 16 +low);
}returnresult;
}public static voidmain(String[] args) throws Exception {/** 此处使用AES-128-ECB加密模式,key需要为16位。*/ //盐
String cKey = "";
// 需要加密的字串
String cSrc = "cicroot";
System.out.println("原文显示的字串:"+cSrc);
// 加密
String enString = AES16.Encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);
// 解密
String DeString = AES16.Decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString);}
}