折腾了很久,终于搞定了aes对称加解密的问题。
1、前端加密
需要引入aes.js
CryptoJS->rollups文件夹下的,不是components文件夹下的。
<script src="<%=basePath%>common/aes/aes.js"></script>
function encrypt(pass) {
var key = "ab3456ha89012346";
var iv = "ab3456ha89012346";
var CBCOptions = {
iv: CryptoJS.enc.Utf8.parse(iv),
mode:CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
};
var aeskey = CryptoJS.enc.Utf8.parse(key);
var secretData = CryptoJS.enc.Utf8.parse(pass);
var encrypted = CryptoJS.AES.encrypt(
secretData,
aeskey,
CBCOptions
);
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
return encryptedBase64Str;
}
key是密钥,iv是偏移量,两个可以不同。
2、后端解密
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public static String decryptAES(String content) {
try {
String iv = "ab3456ha89012346";
SecretKeySpec skeySpec = new SecretKeySpec(iv.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, skeySpec,ivspec);
byte[] base = Base64.decodeBase64(content.getBytes("UTF-8"));
byte[] res = cipher.doFinal(base);
return new String(res,"utf-8");
} catch (Exception e) {
e.printStackTrace();
log.error("AES.desEncrypt fail", e);
}
return null;
}
前端Pkcs7(js不支持Pkcs5),后端PKCS5Padding(java自带的jar包不支持Pkcs7),没有任何问题,如果不成功,从其他方面找原因。
3、期间遇到的问题
Input length must be multiple of 16 when decrypting with padded cipher
问题:要解密的内容长度必须是16的整数倍
解决:前端加密结果传给后端,要取encrypted.ciphertext的值,不是encrypted。
Given final block not properly padded
问题:要解密的内容未正确填充
解决:前后端使用的密钥不一致,修改一致。
object HTMLInputElement
问题:解密后的结果输出
解决:前端加密内容不正确,修改加密内容为字符串。