前端直接默认参数加密的,没有传iv salt等
const cryptoJS = require("crypto-js");
const encryptedValue = cryptoJS.AES.encrypt(value, secret)
后端代码
前端默认参数加密,后端解密
public static byte[][] GenerateKeyAndIV(int keyLength, int ivLength, int iterations, byte[] salt, byte[] password, MessageDigest md) {int digestLength = md.getDigestLength();int requiredLength = (keyLength + ivLength + digestLength - 1) / digestLength * digestLength;byte[] generatedData = new byte[requiredLength];int generatedLength = 0;try {md.reset();// Repeat process until sufficient data has been generatedwhile (generatedLength < keyLength + ivLength) {// Digest data (last digest if available, password data, salt if available)if (generatedLength > 0) {md.update(generatedData, generatedLength - digestLength, digestLength);}md.update(password);if (salt != null) {md.update(salt, 0, 8);}md.digest(generatedData, generatedLength, digestLength);// additional roundsfor (int i = 1; i < iterations; i++) {md.update(generatedData, generatedLength, digestLength);md.digest(generatedData, generatedLength, digestLength);}generatedLength += digestLength;}// Copy key and IV into separate byte arraysbyte[][] result = new byte[2][];result[0] = Arrays.copyOfRange(generatedData, 0, keyLength);if (ivLength > 0) {result[1] = Arrays.copyOfRange(generatedData, keyLength, keyLength + ivLength);}return result;} catch (DigestException e) {throw new RuntimeException(e);} finally {// Clean out temporary dataArrays.fill(generatedData, (byte) 0);}}//解密方法public static byte[] aesDecrypt(String encryptedText, String secret) {try {byte[] cipherData = cn.hutool.core.codec.Base64.decode(encryptedText);byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16);MessageDigest md5 = MessageDigest.getInstance("MD5");final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5);SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES");IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length);Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");aesCBC.init(Cipher.DECRYPT_MODE, key, iv);return aesCBC.doFinal(encrypted);} catch (Exception e) {log.error("aesDecrypt errorencryptedText" + e.getMessage(), e);return null;}}
后端加密
public static byte[] aesEncrypt(String datastr, String secret) {try {byte[] input = datastr.getBytes();// 以下两个变量不可修改,否则java加密的,node无法解密byte[] saltData = "DFބf$t:".getBytes();byte[] preData = "Salted__".getBytes();MessageDigest md5 = MessageDigest.getInstance("MD5");final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5);SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES");IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]);Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding");aesCBC.init(Cipher.ENCRYPT_MODE, key, iv);byte[] encrypt = aesCBC.doFinal(input);byte[] encryptedData = addBytes(saltData, encrypt);return Base64.getEncoder().encode((addBytes(preData, encryptedData)));} catch (Exception e) {log.error("aesEncrypt error.param={}", datastr, e);return null;}}public static byte[] addBytes(byte[] data1, byte[] data2) {byte[] data3 = new byte[data1.length + data2.length];System.arraycopy(data1, 0, data3, 0, data1.length);System.arraycopy(data2, 0, data3, data1.length, data2.length);return data3;}