Java后端AES加密解密

package com.zimax.cqyf.admin.util;

import org.apache.tomcat.util.codec.binary.Base64;

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

public class AesEncryptUtil {

	//使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
	private static String KEY = "1234567890123456";

	private static String IV = "1234567890123456";

	public static String encrypt(String data, String key, String iv) throws Exception {
		try {

			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding
			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;
		}
	}

	public static String desEncrypt(String data, String key, String iv) {
		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);
			return new String(original);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static String encrypt(String data) throws Exception {
		return encrypt(data, KEY, IV);
	}

	public static String desEncrypt(String data) {
		return desEncrypt(data, KEY, IV);
	}

}

package com.zimax.cqyf.admin;

import com.zimax.cqyf.admin.util.AesEncryptUtil;
import com.zimax.cqyf.core.util.DateUtils;
import com.zimax.cqyf.db.entity.Park;
import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        String aesPass = "";
        try {
            aesPass = AesEncryptUtil.encrypt("123456");
            System.out.println("加密后:" + aesPass);
            aesPass = AesEncryptUtil.desEncrypt(aesPass);
            System.out.println("解密后:" + aesPass);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

结果:
加密后:QEwd/DWmy/4yGncCqBofQQ==
解密后:123456

补充: 当前解密方式解密后会存在多余占位符(空格)所以需要对解密后的字符串进行处理(trim()去除首尾空格)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端使用AES加密是为了保护数据的安全性,防止数据被篡改或者被恶意攻击。后端Java可以使用相应的解密方法来解密AES加密的数据,下面是代码示例: 前端加密代码: ```javascript function aesEncrypt(data, key) { var aesKey = CryptoJS.enc.Utf8.parse(key); var encrypted = CryptoJS.AES.encrypt(data, aesKey, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } var data = "Hello World!"; var key = "1234567890123456"; var encryptedData = aesEncrypt(data, key); console.log(encryptedData); // 输出: U2FsdGVkX1+0+H3LX/3jvK3b9b0O2Z9M1QfzMN5eK4= ``` 后端解密代码: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class AesUtil { // AES解密方法 public static String aesDecrypt(String encryptedData, String key) { try { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] decryptedBytes = cipher.doFinal(Base64.decodeBase64(encryptedData)); return new String(decryptedBytes); } catch (Exception ex) { throw new RuntimeException(ex); } } public static void main(String[] args) { // 假设前端使用AES加密的数据为:U2FsdGVkX1+0+H3LX/3jvK3b9b0O2Z9M1QfzMN5eK4= String encryptedData = "U2FsdGVkX1+0+H3LX/3jvK3b9b0O2Z9M1QfzMN5eK4="; String key = "1234567890123456"; // 解密数据 String decryptedData = aesDecrypt(encryptedData, key); System.out.println(decryptedData); // 输出: Hello World! } } ``` 以上代码假设前端使用AES加密数据,后端使用解密方法对数据进行解密,然后返回解密后的数据给前端。在实际应用中,可以根据具体需要进行调整。需要注意的是,前后端使用的秘钥必须相同,否则无法解密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值