AES 加密后进行 BASE64 转码
今天第一次使用到加密,所以有些摸不着头脑,百度后,经测试,加密后的结果和文档中的不一致;
加密模式:AES/CBC/PKCS5Padding
加密初始化向量:长度为 16 的空字节数组
以上是加密规则,琢磨了半天,原来 IvParameterSpec iv = new IvParameterSpec(srcIv);构造函数是一个16位长的空字节数组,开始时是16位字符串,所以生成结果就和规定的不一样。
public class AES {
private String sKey="1234567890123456";
byte[] srcIv=new byte[16];
//加密
public String Encrypt(String sSrc) throws Exception{
if(sKey == null || sKey.length() != 16){
throw new Exception("sKey为空");
}
byte[] raw=sKey.getBytes();
SecretKeySpec skeySpec=new SecretKeySpec(raw,"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(srcIv);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec,iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return new BASE64Encoder().encode(encrypted);
}
// 解密
public String Decrypt(String sSrc) throws Exception {
try {
// 判断Key是否正确
if (sKey == null || sKey .length() != 16) {
throw new Exception("sKey为空或不是16位");
}
byte[] raw = sKey.getBytes("ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(srcIv);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
} catch (Exception e) {
LogUtil.info(LogConstants.App, e.getMessage());
return null;
}
} catch (Exception ex) {
LogUtil.info(LogConstants.App, ex.getMessage());
return null;
}
}
}
- 上一篇: react实现前后台数据交互
- 下一篇: Scala教程(十三)Set、Map操作实战