AES是什么?
美国国家标准技术研究所在2001年发布了高级加密标准(AES)。
AES是基于数据块的加密方式,
即,每次处理的数据是一块(16字节),当数据不是16字节的倍数时填充,
这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度。
AES是一个对称分组密码算法。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文,解密过程分别为对应的逆操作。
Base64_Decode
Base64是网络上最常见的用于字节代码的编码方式之一(一个字母就是一字节byte)
采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
Base64编码非常适合HTTP环境下传递较长的标识信息(传输8Bit字节代码)
其他应用程序中,也常常需要把二进制数据编码为适合放在URL中的形式
package com.example.Utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESUtils {
/**
* 加密
*
* @param sSrc 需要加密的字段
* @param sKey 加密的密钥
* @return
* @throws Exception
*/
public static String encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null || sKey.length() != 16) {
throw new Exception("sKey错误");
}
// byte[] srcIv = new byte[16];
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(raw);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
// cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return new String(Base64.encodeBase64(encrypted));
}
/**
* 解密
* @param sSrc 需要解密的字段
* @param sKey 密钥
* @return
* @throws Exception
*/
public static String Decrypt(String sSrc ,String sKey) throws Exception {
try {
// 判断Key是否正确
if (sKey == null || sKey.length() != 16) {
throw new Exception("sKey为空或不是16位");
}
// byte[] srcIv = new byte[16];
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(raw);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = Base64.decodeBase64(sSrc);
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
e.printStackTrace();
// LogUtil.info(LogConstants.App, e.getMessage());
return null;
}
} catch (Exception ex) {
ex.printStackTrace();
// LogUtil.info(LogConstants.App, ex.getMessage());
return null;
}
}
}
测试
@Test
public void contextLoads() {
String sSrc="123";//需要加密的字段
String sKey="ASDFGHJ@_1234567";//密钥
try {
String abc = AESUtils.encrypt(sSrc, sKey);
String abc1=AESUtils.Decrypt(abc,sKey);
System.out.println("明文:"+sSrc);
System.out.println("加密后:"+abc);
System.out.println("解密后:"+abc1);
}
catch (Exception e){
e.printStackTrace();
}
}
控制台打印:
这里推荐一篇博客关于AES加密与Base64编码(加解密、签名系列)