后端接口AES加密和JS解密

886 阅读1分钟

有一些接口数据,我们需要做加密后返回给前端,然后前端就需要去做解密。所以就需要相同加解密算法,在不同语言下的实现。

下面的代码是后端使用了hutool工具包的AES加密,然后前端使用 CryptoJS 去做对应的解密。

Java

加密

public class EncryptUtil {

    public static String encrypt(String data, String key)  {
        String encryptedData = SecureUtil.aes(key.getBytes()).encryptHex(data);
        return Base64.getEncoder().encodeToString(encryptedData.getBytes(StandardCharsets.UTF_8));
    }
}

解密

public static String decrypt(String encryptedData, String key) {
    byte[] base64Decode = Base64.getDecoder().decode(encryptedData);

    return SecureUtil.aes(key.getBytes()).decryptStr(new String(base64Decode, StandardCharsets.UTF_8));
}

JS

解密

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>AES Decryption Test</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>

<body>

    <script>
        function decrypt(word, keyStr, iv) {
            let decodedString = CryptoJS.enc.Base64.parse(word).toString(CryptoJS.enc.Utf8);

            let key = CryptoJS.enc.Utf8.parse(keyStr);
            let ivs = CryptoJS.enc.Utf8.parse(iv);
            let encryptedHexStr = CryptoJS.enc.Hex.parse(decodedString);
            let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
            let decrypt = CryptoJS.AES.decrypt(srcs, key, {
                iv: ivs,
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            });
            let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
            console.log(decryptedStr)
            return decryptedStr.toString();
        }


        var encryptedData = ""; // 替换为实际的加密数据
        var key = ""; // 替换为实际的密钥
        var decode = decrypt(encryptedData, key, "");
        console.log("解密后:" + decode);

    </script>
</body>

</html>