CryptoJS中AES实现前后端通⽤加解密技术
字符串长度js
在项⽬中如果要对前后端传输的数据双向加密,⽐如避免使⽤明⽂传输⽤户名,密码等数据。就需要对前后端数据⽤同种⽅法进⾏加密,⽅便解密。这⾥介绍使⽤ CryptoJS 实现 AES 加解密。
⾸先需要下载前台使⽤ CryptoJS 实现 AES 加解密的,所以要先下载组件,下载 CryptoJS-v3.1.2 版本之后,⽂件中包含components 和rollups 两个⽂件夹,components ⽂件夹下是单个组件,rollups ⽂件夹下是汇总,引⽤ rollups 下的 aes.js ⽂件即可。
已解决解密数据时出现的异常: pto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
这⾥提供 CryptoJS-v3.1.2 的
先上后台Java代码:
package company.pms.pmsbase.utils;
pto.Cipher;
pto.spec.IvParameterSpec;
pto.spec.SecretKeySpec;
import dec.binary.Base64;
public class AesUtil {
public static void main(String args[]) throws Exception {
String content = "明⽂ 123 abc";
//加密
String encrypted = encrypt(content, KEY, IV);
//解密
String decrypted = decrypt(encrypted, KEY, IV);
System.out.println("加密前:" + content);
System.out.println("加密后:" + encrypted);
System.out.println("解密后:" + decrypted);
}
private static String KEY = "abcdef0123456789"; // 长度必须是 16
private static String IV = "abcdef0123456789"; // 长度必须是 16
/**
* 加密返回的数据转换成 String 类型
* @param content 明⽂
* @param key 秘钥
* @param iv 初始化向量是16位长度的字符串
* @return
* @throws Exception
*/
public static String encrypt(String content, String key, String iv) throws Exception {
// 将返回的加密过的 byte[] 转换成Base64编码字符串很关键
return base64ToString(AES_CBC_Bytes(), Bytes(), iv.getBytes()));
}
/**
* 将解密返回的数据转换成 String 类型
* @param content Base64编码的密⽂
* @param key 秘钥
* @param iv 初始化向量是16位长度的字符串
* @return
* @throws Exception
*/
public static String decrypt(String content, String key, String iv) throws Exception {
// stringToBase64() 将 Base64编码的字符串转换成 byte[] 与base64ToString()配套使⽤
return new String(AES_CBC_Decrypt(stringToBase64(content), Bytes(), iv.getBytes()));
}
private static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes, byte[] iv){
try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Instance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
private static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes, byte[] iv){  try {
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Instance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
/**
* 字符串装换成 Base64
*/
public static byte[] stringToBase64(String key) throws Exception {
return Base64.Bytes());
}
/**
* Base64装换成字符串
*/
public static String base64ToString(byte[] key) throws Exception {
return new Base64().encodeToString(key);
}
}
再上前端代码(需引⽤ rollups ⽬录下的 aes.js ):
function encodeAesString(data,key,iv){
var key = Utf8.parse(key);
var iv = Utf8.parse(iv);
var encrypted =pt(data,key,{
iv:iv,
de.CBC,
padding:CryptoJS.pad.Pkcs7
});
//返回的是base64格式的密⽂
return encrypted;
}
// encrypted 为是base64格式的密⽂
function decodeAesString(encrypted,key,iv){
var key = Utf8.parse(key);
var iv = Utf8.parse(iv);
var decrypted =CryptoJS.AES.decrypt(encrypted,key,{
iv:iv,
de.CBC,
padding:CryptoJS.pad.Pkcs7
});
Utf8);
}
// 测试加、解密
function testAES(){
var data = "明⽂ 123 abc"; // 明⽂
var key = 'abcdef0123456789'; // 密钥长度16
var iv = 'abcdef0123456789'; // 密钥长度16
console.log("加密前:" + data);
// 测试加密
var encrypted = encodeAesString(data,key,iv); // 密⽂
console.log("加密后: " + encrypted);
var decryptedStr = decodeAesString(encrypted,key,iv);
console.log("解密后: " + decryptedStr);
}
贴上效果图:
中间遇到的问题:
1.  秘钥问题,秘钥的长度必须为16位,否则会报错
2. 加密得到的 byte[] 需⽤使⽤Base64转换成字符串,不能直接转成字符串,因为加密所采⽤的AES, MD5, SHA-256, SHA-512 等等算法,它们是通过对byte[] 进⾏各种变换和运算,得到加密之后的byte[],那么这个加密之后的 byte[] 结果显然就不会符合任何⼀种的编码⽅案,⽐如 UTF-8, GBK等,因为加密的过程是任意对byte[]进⾏运算的。所以你⽤任何⼀种编码⽅案来解码加密之后的 byte[] 结果,得到的都会是乱码。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。