• 前后端请求AES加解密(转载)


    前端库地址:crypto-js

    安装依赖

    npm install --save crypto-js

    或者下载后引用

    <script src="./js/crypto-js.js"></script>
    <script src="./js/aes.js"></script>

    使用CBC模式

    前端

    // 字符串转hex
    let string_to_hex = function (str) {
      let tempstr = "";
      for (let i = 0; i < str.length; i++) {
        if (tempstr === "") tempstr = str.charCodeAt(i).toString(16);
        else tempstr += str.charCodeAt(i).toString(16);
      }
      return tempstr;
    };
    
    let keystr = "0123456789ABCDEF";
    let ivstr = "0123456789101112";
    const src = "Hello World";
    
    console.log("密钥:", keystr);
    console.log("偏移量:", ivstr);
    console.log("原字符串:", src);
    
    let key = string_to_hex(keystr);
    
    key = CryptoJS.enc.Hex.parse(key);
    ivstr = string_to_hex(ivstr);
    let iv = CryptoJS.enc.Hex.parse(ivstr);
    
    const enc = CryptoJS.AES.encrypt(src, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });
    
    const enced = enc.ciphertext.toString();
    console.log("加密:", enced);
    
    const dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });
    
    const decstr = CryptoJS.enc.Utf8.stringify(dec);
    console.log("解密:", decstr);

    结果

    密钥: 0123456789ABCDEF
    偏移量: 0123456789101112
    原字符串: Hello World
    加密: 4b20efdf7aceb95c099b7df542673256
    解密: Hello World

    Java后端

    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    public class AES {
    
        private static String Algorithm = "AES";
        private static String AlgorithmProvider = "AES/CBC/PKCS5Padding"; //算法/模式/补码方式
    
        public static byte[] generatorKey() throws NoSuchAlgorithmException {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(Algorithm);
            keyGenerator.init(256);//默认128,获得无政策权限后可为192或256
            SecretKey secretKey = keyGenerator.generateKey();
            return secretKey.getEncoded();
        }
    
        public static IvParameterSpec getIv(String ivstr) throws UnsupportedEncodingException {
            IvParameterSpec ivParameterSpec = new IvParameterSpec(ivstr.getBytes("utf-8"));
            return ivParameterSpec;
        }
    
        public static String encrypt(String src, String keystr, IvParameterSpec iv) throws
                NoSuchAlgorithmException,
                NoSuchPaddingException,
                InvalidKeyException,
                IllegalBlockSizeException,
                BadPaddingException,
                UnsupportedEncodingException,
                InvalidAlgorithmParameterException {
            byte[] key = keystr.getBytes("utf-8");
            SecretKey secretKey = new SecretKeySpec(key, Algorithm);
            IvParameterSpec ivParameterSpec = iv;
            Cipher cipher = Cipher.getInstance(AlgorithmProvider);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
            byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8")));
            return byteToHexString(cipherBytes);
        }
    
        public static String decrypt(String src, String keystr, IvParameterSpec iv) throws Exception {
            byte[] key = keystr.getBytes("utf-8");
            SecretKey secretKey = new SecretKeySpec(key, Algorithm);
    
            IvParameterSpec ivParameterSpec = iv;
            Cipher cipher = Cipher.getInstance(AlgorithmProvider);
            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
            byte[] hexBytes = hexStringToBytes(src);
            byte[] plainBytes = cipher.doFinal(hexBytes);
            return new String(plainBytes, "utf-8");
        }
    
        /**
         * 将byte转换为16进制字符串
         *
         * @param src
         * @return
         */
        public static String byteToHexString(byte[] src) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < src.length; i++) {
                int v = src[i] & 0xff;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                    sb.append("0");
                }
                sb.append(hv);
            }
            return sb.toString();
        }
    
        /**
         * 将16进制字符串装换为byte数组
         *
         * @param hexString
         * @return
         */
        public static byte[] hexStringToBytes(String hexString) {
            hexString = hexString.toUpperCase();
            int length = hexString.length() / 2;
            char[] hexChars = hexString.toCharArray();
            byte[] b = new byte[length];
            for (int i = 0; i < length; i++) {
                int pos = i * 2;
                b[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
            }
            return b;
        }
    
        private static byte charToByte(char c) {
            return (byte) "0123456789ABCDEF".indexOf(c);
        }
    
        public static void main(String[] args) {
            try {
                // 密钥必须是16的倍数
                String keystr = "0123456789ABCDEF";
                String ivstr = "0123456789101112";
                String src = "Hello World";
    
                System.out.println("密钥:" + keystr);
                System.out.println("偏移量:" + ivstr);
                System.out.println("原字符串:" + src);
                IvParameterSpec iv = getIv(ivstr);
                String enc = encrypt(src, keystr, iv);
                System.out.println("加密:" + enc);
    
                String dec = decrypt(enc, keystr, iv);
                System.out.println("解密:" + dec);
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    结果

    密钥:0123456789ABCDEF
    偏移量:0123456789101112
    原字符串:Hello World
    加密:4b20efdf7aceb95c099b7df542673256
    解密:Hello World

    使用ECB模式

    前端

    // 字符串转hex
    let string_to_hex = function (str) {
      let tempstr = "";
      for (let i = 0; i < str.length; i++) {
        if (tempstr === "") tempstr = str.charCodeAt(i).toString(16);
        else tempstr += str.charCodeAt(i).toString(16);
      }
      return tempstr;
    };
    
    let keystr = "0123456789ABCDEF";
    const src = "Hello World";
    
    console.log("密钥:", keystr);
    console.log("原字符串:", src);
    
    let key = string_to_hex(keystr);
    
    key = CryptoJS.enc.Hex.parse(key);
    const enc = CryptoJS.AES.encrypt(src, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    });
    
    const enced = enc.ciphertext.toString();
    console.log("加密:", enced);
    
    const dec = CryptoJS.AES.decrypt(CryptoJS.format.Hex.parse(enced), key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    });
    
    let decstr = CryptoJS.enc.Utf8.stringify(dec);
    console.log("解密:", decstr);

    结果

    密钥: 0123456789ABCDEF
    原字符串: Hello World
    加密: 21f41dde54d0c9703c730fd14ce47cfe
    解密: Hello World

    Java后端

    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    public class AES {
    
        private static String Algorithm = "AES";
        private static String AlgorithmProvider = "AES/ECB/PKCS5Padding"; // 算法/模式/补码方式
    
        public static byte[] generatorKey() throws NoSuchAlgorithmException {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(Algorithm);
            keyGenerator.init(256);//默认128,获得无政策权限后可为192或256
            SecretKey secretKey = keyGenerator.generateKey();
            return secretKey.getEncoded();
        }
    
        public static String encrypt(String src, String keystr) throws NoSuchAlgorithmException, NoSuchPaddingException,
                InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException, InvalidAlgorithmParameterException {
            byte[] key = keystr.getBytes("utf-8");
            SecretKey secretKey = new SecretKeySpec(key, Algorithm);
            Cipher cipher = Cipher.getInstance(AlgorithmProvider);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] cipherBytes = cipher.doFinal(src.getBytes(Charset.forName("utf-8")));
            return byteToHexString(cipherBytes);
        }
    
        public static String decrypt(String src, String keystr) throws Exception {
            byte[] key = keystr.getBytes("utf-8");
            SecretKey secretKey = new SecretKeySpec(key, Algorithm);
            Cipher cipher = Cipher.getInstance(AlgorithmProvider);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] hexBytes = hexStringToBytes(src);
            byte[] plainBytes = cipher.doFinal(hexBytes);
            return new String(plainBytes, "utf-8");
        }
    
        /**
         * 将byte转换为16进制字符串
         *
         * @param src
         * @return
         */
        public static String byteToHexString(byte[] src) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < src.length; i++) {
                int v = src[i] & 0xff;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                    sb.append("0");
                }
                sb.append(hv);
            }
            return sb.toString();
        }
    
        /**
         * 将16进制字符串装换为byte数组
         *
         * @param hexString
         * @return
         */
        public static byte[] hexStringToBytes(String hexString) {
            hexString = hexString.toUpperCase();
            int length = hexString.length() / 2;
            char[] hexChars = hexString.toCharArray();
            byte[] b = new byte[length];
            for (int i = 0; i < length; i++) {
                int pos = i * 2;
                b[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
            }
            return b;
        }
    
        private static byte charToByte(char c) {
            return (byte) "0123456789ABCDEF".indexOf(c);
        }
    
        public static void main(String[] args) {
            try {
                // 密钥必须是16的倍数
                String keystr = "0123456789ABCDEF";
                String src = "Hello World";
    
                System.out.println("密钥:" + keystr);
                System.out.println("原字符串:" + src);
    
                String enc = encrypt(src, keystr);
                System.out.println("加密:" + enc);
    
                String dec = decrypt(enc, keystr);
                System.out.println("解密:" + dec);
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    结果

    密钥:0123456789ABCDEF
    原字符串:Hello World
    加密:21f41dde54d0c9703c730fd14ce47cfe
    解密:Hello World

    转载地址:https://cloud.tencent.com/developer/article/1823249

    结果

    encrypt_str: U2FsdGVkX1/QM9zoNjeuJ4AHYhjME01+XQLEOGkO3ns= decrypt_str: 123456

  • 相关阅读:
    C语言第三天,《常量指针和指针常量》
    树莓派系统烧入总结
    c 语言第一天
    7. Vue
    6. Vue
    5. Vue
    4. Vue
    3. Vue
    1. Vue
    2. Vue
  • 原文地址:https://www.cnblogs.com/yinliang/p/15252688.html
Copyright © 2020-2023  润新知