AES128加解密

什么是AES?

高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
是一种区块加密标准。AES可以使用128、192和256位密钥,从安全性来看,AES256安全性最高。从性能来看,AES128性能最高。

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.Security;
import java.util.Arrays;
/**
 * @author xf
 * @version 1.0.0
 * @ClassName Aes128Util 
 * @Description TODO AES工具类
 * @createTime 2021.03.03 20:44
 */
@Slf4j
public class Aes128Util {
    
    

	//key为16位(KEY:即密码)
	private  static final String KEY = "1234567891234567";
	//iv为16位(即偏移量,可自订)
	private  static final String IV = "abcdefghijklmnop";

	/**
	 * 加密 模式:AES/CBC/PKCS7Padding
	 * @param content 明文
	 * @return 密文
	 */
	public static String AESEncode(String content) {
    
    
		int base = 16;
		byte[] keybyte = KEY.getBytes(StandardCharsets.UTF_8);
		if (keybyte.length % base != 0) {
    
    
			int groups = keybyte.length / base + 1;
			byte[] temp = new byte[groups * base];
			Arrays.fill(temp, (byte) 0);
			System.arraycopy(keybyte, 0, temp, 0, keybyte.length);
			keybyte = temp;
		}
		// 初始化
		Security.addProvider(new BouncyCastleProvider());
		// 转化成JAVA的密钥格式
		Key key = new SecretKeySpec(keybyte, "AES");
		try {
    
    
			// 初始化cipher
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
			cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes()));
			byte[] encryptedText = cipher.doFinal(content.getBytes());
			return new String(Hex.encodeHex(encryptedText)).replaceAll("\r\n", "");
		} catch (Exception e) {
    
    
			log.info("AESEncode error", e);
		}
		return null;
	}

	/**
	 * 解密
	 * @param content 密文
	 * @return 铭文
	 */
	public static String AESDecode(String content) {
    
    
		try {
    
    
			byte[] raw = KEY.getBytes(StandardCharsets.UTF_8);
			Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
			SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
			IvParameterSpec ivParameter = new IvParameterSpec(IV.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameter);
			try {
    
    
				byte[] encrypted1 = Hex.decodeHex(content);// 先用base64解密
				byte[] original = cipher.doFinal(encrypted1);
				return new String(original);
			} catch (Exception e) {
    
    
				log.info(e.toString());
				return null;
			}
		} catch (Exception ex) {
    
    
			log.info(ex.toString());
			return null;
		}
	}

	public static void main(String[] args) {
    
    
		String content = "余生一个帆";
		System.out.println("加密前内容:" + content);
		String aesEncode = AESEncode(content);
		System.out.println("加密后内容:" + aesEncode);
		String aesDecode = AESDecode(aesEncode);
		System.out.println("解密后内容:" + aesDecode);
	}
}

运行结果:

加密前内容:余生一个帆
加密后内容:dee5e7562b2a60212661012f8b01b179
解密后内容:余生一个帆

猜你喜欢

转载自blog.csdn.net/weixin_44146379/article/details/114325700