美文网首页
AES加密 - 前端使用CryptoJS加密,后端使用Java解

AES加密 - 前端使用CryptoJS加密,后端使用Java解

作者: ratil_ | 来源:发表于2020-11-12 19:02 被阅读0次

    因为有个需要加密的需求(虽然这种加密前端的密钥还是会被被人拿到,但是目的只是加强破解难度),前端需要把传入的密码加密,后端进行解密,于是乎用AES加密

    记录一些遇到的异常(主要都是前端加密后的密文用Java解密的异常)

    先上前端加密和后端解密的代码(前端解密 和 后端加密都差不多)

    import CryptoJS from 'crypto-js'
    
    let key = CryptoJS.enc.Utf8.parse('1538663015386630');
    let iv = CryptoJS.enc.Utf8.parse('sdaefascvfelk392');
    export function encrypt() {
        let pwd = CryptoJS.enc.Utf8.parse('20000520WJ');
        // let pwd = '20000520WJJ'
        console.log(pwd)
        // let srcs = CryptoJS.enc.Utf8.parse(pwd)
        let encrypted = CryptoJS.AES.encrypt(pwd, key, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv:iv
        })
        // 实际上这里得到的密文是用Base64编码过的,后面有个异常会说到
        return encrypted.toString();
    }
    
    public static String decrypt(String cipherStr) {
            // 对于前端的密文要先base64解密
            BASE64Decoder decoder = new BASE64Decoder();
            IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
                return new String(cipher.doFinal(decoder.decodeBuffer(cipherStr)), StandardCharsets.UTF_8);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    

    javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    这个异常是因为一开始没有用BASE64解码,导致的,就是上面注释里的。在使用java进行加密的时候发现Base64编码后的密文和前端加密的一样,才得以解决

    注: 加密的key 和 偏移量 iv 最好用16位

    相关文章

      网友评论

          本文标题:AES加密 - 前端使用CryptoJS加密,后端使用Java解

          本文链接:https://www.haomeiwen.com/subject/vwgpbktx.html