关于 AES 的前后端加解密的处理

后端代码:

jar包支持:jce.jar

工具类:CipherUtil


package com.winlife.utils.cipher;

import com.winlife.utils.exception.SystemRuntimeException;
import org.apache.commons.codec.binary.Base64;
import org.springframework.util.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;


/**
* @描述 AES 加解密算法
* @创建人 cyw
* @创建时间 2021/9/28 9:44
*/
public class CipherUtil {

public static final String CHARSET_UTF8 = "UTF-8";

/**
* 数据传输加密KEY
*/
private static final String TT_CIPHER_KEY = "081FBFB4AFA081C7";

/**
* 数据传输加密向量
*/
private static final String TT_CIPHER_IV = "AFA081C7081FBFB4";

/**
* 密码传输加密KEY
*/
private static final String PW_CIPHER_KEY = "F35267BD3D02B727";

/**
* 数据传输加密向量
*/
private static final String PW_CIPHER_IV = "3A46AAB1CC6047F4";

/**
* 加密算法
*/
private static final String CIPHER_ALGORITHM = "AES";

/**
* 加密变换
*/
private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding";


public static void main(String[] arg){
System.out.println("加密:");
System.out.println("加密:"+pwEncrypt("111111"));
System.out.println("解密:"+pwDcrypt(pwEncrypt("111111")));
}

/**
* base64 code、AES 密码加密
* @author cyw
* @param content 需要加密的内容
* @return 加密后String
* @throws Exception
*/
public static String pwEncrypt(String content) {

if(StringUtils.isEmpty(content)){
return null;
}

try {
return base64Encode(AESEncrypt(content, PW_CIPHER_KEY, PW_CIPHER_IV));
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据加密失败", e);
}

}


/**
* 此项目使用的解密方法
* base64 、AES 密码解密
* @author cyw
* @param content 带解密内容
* @return 解密结果
* @throws Exception
*/
public static String pwDcrypt(String content){

if(StringUtils.isEmpty(content)){
return null;
}

try {
return AESDecrypt(base64Decode(content), PW_CIPHER_KEY, PW_CIPHER_IV);
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据解密失败", e);
}

}

/**
* base64 code、AES 数据传输加密
* @author cyw
* @param content 需要加密的内容
* @return 加密后String
* @throws Exception
*/
public static String transEncrypt(String content) {

if(StringUtils.isEmpty(content)){
return null;
}

try {
return base64Encode(AESEncrypt(content, TT_CIPHER_KEY, TT_CIPHER_IV));
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据加密失败", e);
}

}


/**
* base64 、AES 数据传输解密
* @author cyw
* @param content 带解密内容
* @return 解密结果
* @throws Exception
*/
public static String transDcrypt(String content){

if(StringUtils.isEmpty(content)){
return null;
}

try {
return AESDecrypt(base64Decode(content), TT_CIPHER_KEY, TT_CIPHER_IV);
} catch (Exception e) {
e.printStackTrace();
throw new SystemRuntimeException("数据解密失败", e);
}

}



/**
* AES加密
* @author cyw
* @param content 需要加密的内容
* @param encryptKey 加密密钥
* @param iv 加密向量
* @return 加密后的byte[](AES加密)
* @throws Exception
*/
private static byte[] AESEncrypt(String content, String encryptKey, String iv) throws Exception{

SecretKeySpec keySpec = new SecretKeySpec(encryptKey.getBytes(), CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());

// 加密
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 初始化
return cipher.doFinal(content.getBytes(CHARSET_UTF8)); // 加密


}


/**
* AES解密
* @author cyw
* @param encryptBytes 待解密byte[]
* @param decrytKey 解密密钥
* @param iv 解密向量
* @return 解密结果
*/
private static String AESDecrypt(byte[] encryptBytes, String decrytKey, String iv) throws Exception{

SecretKeySpec keySpec = new SecretKeySpec(decrytKey.getBytes(), CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION); // 创建密码器
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 初始化
return new String(cipher.doFinal(encryptBytes),"UTF-8"); // 解密 upd xin 添加编码格式防止乱码

}



/**
* base64 解码
* @author cyw
* @param base64Code 待解码的数据
* @return 解码后的byte[]
* @throws IOException
*/
private static byte[] base64Decode(String base64Code) throws IOException {

if (base64Code == null || "".equals(base64Code)) {
return null;
}

return Base64.decodeBase64(new String(base64Code.getBytes("UTF-8")).getBytes("UTF-8")); //upd xin 添加编码格式防止乱码

}

/**
* base64加密
* @param bytes 待编码的byte[]
* @return 编码后的base64 code
*/
private static String base64Encode(byte[] bytes) {

if (bytes == null || bytes.length == 0) {
return null;
}

return Base64.encodeBase64String(bytes);
}

}
 

前端代码:vue

先下载组件:npm install crypto-js

const CryptoJS = require('crypto-js');  //引用AES源码js


const key = CryptoJS.enc.Utf8.parse("F35267BD3D02B727"); //十六位十六进制数作为秘钥
const iv = CryptoJS.enc.Utf8.parse('3A46AAB1CC6047F4'); //十六位十六进制数作为秘钥偏移量

//解密方法
function Decrypt(word) {
    var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
    var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
    let decrypt = CryptoJS.AES.decrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
    debugger
    return decryptedStr.toString()
}
//加密方法
function Encrypt(word) {
    let encrypted = CryptoJS.AES.encrypt(word, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    })
    return encrypted.toString();
}

export default {
    Decrypt,
    Encrypt
}

借此,实现前后端的密码(敏感字符)的加解密操作

posted @ 2021-10-08 11:07  皇甫二牛  阅读(513)  评论(0)    收藏  举报