加密算法--AES-128-CBC加密模式

1.工具类编写,用户后端

 

package com.project.util;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;

public class AesEncryptUtil {
    //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
        private static String KEY = "abcdefg123456789";
        
        private static String IV = "abcdefg123456789";
        
        
        /**
         * 加密方法
         * @param data  要加密的数据
         * @param key 加密key
         * @param iv 加密iv
         * @return 加密的结果
         * @throws Exception
         */
        public static String encrypt(String data, String key, String iv) throws Exception {
            try {

                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"
                int blockSize = cipher.getBlockSize();

                byte[] dataBytes = data.getBytes();
                int plaintextLength = dataBytes.length;
                if (plaintextLength % blockSize != 0) {
                    plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
                }

                byte[] plaintext = new byte[plaintextLength];
                System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

                SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

                cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
                byte[] encrypted = cipher.doFinal(plaintext);

                return new Base64().encodeToString(encrypted);

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        /**
         * 解密方法
         * @param data 要解密的数据
         * @param key  解密key
         * @param iv 解密iv
         * @return 解密的结果
         * @throws Exception
         */
        public static String desEncrypt(String data, String key, String iv) throws Exception {
            try {
                byte[] encrypted1 = new Base64().decode(data);

                Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
                SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

                cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original);
                return originalString;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        
        /**
         * 使用默认的key和iv加密
         * @param data
         * @return
         * @throws Exception
         */
        public static String encrypt(String data) throws Exception {
            return encrypt(data, KEY, IV);
        }
        
        /**
         * 使用默认的key和iv解密
         * @param data
         * @return
         * @throws Exception
         */
        public static String desEncrypt(String data) throws Exception {
            return desEncrypt(data, KEY, IV);
        }
        
        
        
        /**
        * 测试
        */
        public static void main(String args[]) throws Exception {

            String test = "test123";

            String data = null;
            String key = "abcdefg123456789";
            String iv = "abcdefg123456789";

            data = encrypt(test, key, iv);

            System.out.println(data);
            System.out.println(desEncrypt(data, key, iv));
        }
}

================================================================

eg:后台解密

  

  String unpassword = AesEncryptUtil.desEncrypt(password).trim();
    logName = AesEncryptUtil.desEncrypt(logName).trim();
    password = AesEncryptUtil.desEncrypt(password).trim();

2.前端编写

function encryptAes(data) {
        var key  = CryptoJS.enc.Latin1.parse('emall20190819123');
        var iv   = CryptoJS.enc.Latin1.parse('emall20190819123');
        return CryptoJS.AES.encrypt(data, key, {iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding}).toString();
   }

 

===========================================

eg: 

   

var enusername = encryptAes(username);
        $("#usernameSub").val(enusername);
        var enpassword = encryptAes(password);
        $("#passwordSub").val(enpassword);

 

注意:一个密码比如test123在前台被加密传后,传到后台进行解密,像test123不是16位密码,那么他加密再被解密后后面会出现空格给他变为16位,所以解密后采用trim()去除了空格

你可能感兴趣的:(信息安全)