AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard),是美国联邦政府采用的一种区块加密标准。为对称加密,加密与解密为同一秘钥。Java实现如下:
1、秘钥的生成,根据一个字符串生成,字符串长度有限制。
/**
* 创建密钥
* @param password 自定义,长度不足自动补0,根据此字符串生成秘钥
* @return 秘钥
*/
private SecretKeySpec createKey(String password) {
byte[] data = null;
if (password == null) {
password = "";
}
StringBuilder sb = new StringBuilder(32);
sb.append(password);
while (sb.length() < 32) {
sb.append("0");
}
if (sb.length() > 32) {
sb.setLength(32);
}
try {
data = sb.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new SecretKeySpec(data, "AES");
}
2、加密:
/**
* 加密
*
* @param encodingString 要加密的字符串
* @param password 根据此字符串,生成秘钥
* @return 密文
*/
private String getAESEncode(String encodingString, String password) {
String data = null;
try {
//1.创建加密引擎
Cipher cipher = Cipher.getInstance("AES");
//2.创建key
SecretKeySpec key = createKey(password);
//3.密码引擎初始化
cipher.init(Cipher.ENCRYPT_MODE, key);
//4.对数据进行加密,数据进行Base64编码
byte[] rr = Base64.encode(cipher.doFinal(encodingString.getBytes()), Base64.DEFAULT);
data = new String(rr);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return data;
}
3、解密:
/**
* 解密
* @param decodingString 要解密的字符串
* @param password 生成秘钥的字符串
* @return 明文
*/
private String getDecodeString(String decodingString,String password){
String data="";
try {
//1、创建一个密码引擎
Cipher cipher = Cipher.getInstance("AES");
//2、创建key
SecretKeySpec keySpec = createKey(password);
//3、对密码引擎进行初始化
cipher.init(Cipher.DECRYPT_MODE,keySpec);
//4、对数据进行解密
byte[] decode = Base64.decode(decodingString, Base64.DEFAULT);
data= new String(cipher.doFinal(decode));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return data;
}