Let the data no longer run naked: learn to use the AES encryption and decryption algorithm

Table of contents

1. Application.yml file configuration

2. AES encryption and decryption tools

3. AES message key, AES key initial vector, byte array conversion tool class

4. AES encryption and decryption test


Why do we use the AES algorithm for encryption and decryption?

AES (Advanced Encryption Standard), also known as Advanced Encryption Standard, is a symmetric encryption algorithm and one of the widely used encryption technologies at present. Its main features are fast encryption speed, high security, and good scalability.

The AES algorithm adopts a symmetric encryption method, that is, the same key is used for encryption and decryption. Key lengths can be 128, 192, or 256 bits, with 128-bit keys being widely used because it provides sufficient security and efficient encryption speed. In the process of AES encryption and decryption, the method of block encryption is adopted, that is, the plaintext is divided into several blocks, and then the encryption operation is performed separately, and finally the encrypted ciphertext is combined.

The AES algorithm has the following advantages:

  1. High security: The AES algorithm adopts powerful symmetric encryption technology, which can provide very high security and effectively protect the confidentiality and integrity of data.

  2. Fast speed: The AES algorithm adopts a group encryption method, which can make full use of hardware acceleration and multi-threading technology, and has a very efficient encryption speed.

  3. Good scalability: Since the key length of the AES algorithm can be flexibly adjusted, it can provide more flexible encryption requirements and is suitable for different scenarios and applications.

  4. High commonality: The AES algorithm is widely used in the field of modern cryptography and is currently one of the most commonly used symmetric encryption algorithms, so it has good compatibility and portability in practical applications.

The AES algorithm is mainly used in network communication, data storage, encryption and decryption, etc. In network communication, AES encryption can protect the confidentiality and integrity of Internet data and prevent sensitive information from being stolen and tampered with; in data storage, AES encryption can protect stored data from theft and disclosure; in terms of encryption and decryption, AES Algorithms can be used to implement various security protocols and applications such as SSL/TLS, IPSec, PGP, etc.

1. Application.yml file configuration

crypto:
  #AES消息秘钥
  ASE_SIGN_KEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCFeSnQmMwPfwnvrozctUM8YmkvieWgsxvh2aAl71GVeGcsxCvIO1K9uAPFJdpSwATBRR3v0V6PYsatO9t0n3WF9HvX2LVkF+uKI7g5IdXsTe5e5XORMz4ESYvus2onq2SmMUCTel8Wd0hQNWB90GG9Mc1TT4uwhMyTR37t6DSctZXelyx1f6fOb2RIz+eDD8tI7feibBo17Jkmh3cK96xYUC4wPiSRbVRv96+1jc4lbi4qfwPXRnxbrDWD3NJxh4yt4abrp0BNq4o0vEDqmyjtOytOW1gdmHPvDML7LO10xm4lDYVTvqyow0RH8jKxm/TTIK9KSnKtqvjDoEaUo5WfAgMBAAECggEABkM4Hgx9TqDUU4WqIFT08algbBWZS5/7x+4RIJaJCm1a0fPmZf+6kyJGMwLiqo1N68+VZwI44Jtu3QP4+RDeT8m34dnOMQMaTyH769pVkj/Z1mQHtyFjYIoe4bVTXscg8tdOw1yzh3dTUkge3ehgHaNvkeAimsawXpy1LO5/QXcGFWtZtOW2+Lx8Teylg98vEuGtolGjr/BZHhGJ2BoV9+P6CyH6Y0evqi/Ku9HQdQW3RWD/K/M9oX8wT4crLqa/bGUYCvlXJLt8CAHv1KbqScRaX68LIunJweJxjceElENYTmCGcrJ2PILWag1RhCvnBCe3RIuCowVCVDJK5yx2wQKBgQDbmFj3me5ucUuZIBKbcsWJDfpdW012dkUeT0r21HzA8MF8ufNFEVmGxinDQtSVqPjOCDo2773JaaBKiuLTnqnVG+QEnPILyFgEsraxJbbeLkQ/xlZNyZpzqlhHD/mxQBm++cje9h8sx71I7Un/nXgirE3lWMYlHXOxr+7mrKYO4QKBgQCbmcq5tRHcADFG67hD8e2ajiQYfPYDG3pvkSqxMeg5P0SauaQ+DZmCvz7R7E8icB9vXHCLjlYzLOu3IVBaFTlJv7x+ljB93BsYqBIQGD+KiyDeCpt94rFFJSLBqldA4tgYLEf+mCgfJHOMOMuzaZrbDgld8Z5YgieuMDJS4Uy0fwKBgF0vullgPjkp5N3XKW5D9yWhA+TIEQg7SjuBhJtYMpSh1kn6kwx1P1udDi3pV1MnQGYWQbX8aLpnE3lulLEe/I0N5+Y5P9HWM9vShwqHqaGBWr8BiLA75Eo/OHT3h4s7W3GaiC5tnW8gV+fxolxR06BLJEc2M+eeJvF5alUDYPihAoGAYXU6HIbk4L7eHmWVzDjDcYKF6TCbhea4ERkDfGid4v1VovOTg6pQ9CuE1UcFabSAe+eSNla4duUz3kfnZATXFPIaxc6cILiz4AWlCp+lbMknlOtf6MEL9xsDYfmnHOT4JGvXzAbRWnAiTzljnMQQUhPAmi6z1wvufpOBcZfby1ECgYEAgzuxcHaGeLio0GVoOP/ql+eEBPWrMO6kRcGZq/N+kfFYuk4+evTVcD506oWFrPoX68XPvRz65LxzVkU5Sze6e2aIKA8XrDnRWJ4qVfMGdWve8zRwnEY937BQixjgBfoCIdq/IZBLxp7vCR3E/oirSUJs3siJ9xLajcNURG6szqc=
  #AES秘钥初始向量
  ASE_SIV: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhXkp0JjMD38J766M3LVDPGJpL4nloLMb4dmgJe9RlXhnLMQryDtSvbgDxSXaUsAEwUUd79Fej2LGrTvbdJ91hfR719i1ZBfriiO4OSHV7E3uXuVzkTM+BEmL7rNqJ6tkpjFAk3pfFndIUDVgfdBhvTHNU0+LsITMk0d+7eg0nLWV3pcsdX+nzm9kSM/ngw/LSO33omwaNeyZJod3CvesWFAuMD4kkW1Ub/evtY3OJW4uKn8D10Z8W6w1g9zScYeMreGm66dATauKNLxA6pso7TsrTltYHZhz7wzC+yztdMZuJQ2FU76sqMNER/IysZv00yCvSkpyrar4w6BGlKOVnwIDAQAB
  #RSA公钥
  RSA_PRIVATE_KEY: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCPEG5zZAEqSasGgEr1iHdunBLHip08GGct9EAIzw8zBq5zUwpX0KXLNJJ1d+AgcQWAYk0BrsX9lpR2ffodJci2qgo13kXc97xMRbFBSsZ4wnoK0L/cSy9P6NxdpJ+FuhKY6MnwOFApif7mJY8I4FumThOjC+7s3kW1hMctbFc0YyEc3sND9u001oiX9lDEiTYd4Ouq2IKDFbe2l38KCPgTpkpD4OXUFm3utgLlsrGostU9DQXalg9c8LLLRjBQoHyeCyOXzwWBGsZ2hoAvJNKIlOx66GKu6ebF/EV3Y2BsdjDQF0zCQ/c3xCz7bsv2BGcuA3VuYAtUmBmoSD6AL6aTAgMBAAECggEAKXMtTSlwXPwzHRMWpMUBNX7qwf2bSMoZOutFkkfLs5EAAlHQ8Vh2cMWumXI98ahNW8EfZploq+xw31Pon4FPAf2KL8lSnI76c27NyIkNr/dIvNF2hTETaCejkU4dGfWrZbosp/jo4OAmhi/jnULDyw9cCSVv+Bj+QXVS8AovyfFvv4Yj9j6G0vKvs7npJQEJ6eQjeKayWOMArGnxQeRwQBmdtwL46X9ARBt+vSCrWLcOi83orrgiR3R4eySNJ3nTPtyX6G5Co/GdiRm6h+aJQ3zXeE0DVUDsgOYj6rtwb9KJwLG3AM7Bx7evIyPcOY0iDowGnWdRXQo0TTjpIi3LoQKBgQDDRjxTxDYQX6NIaWtjs45tMtdGzavF4C5+7MSsWkf7SZ5JWu3b8XyE8WO4BGMr3q1meeA/PCQjA94LLKHYGj0UTXUDJzd8gw0wbFr9X+ta4FDuUfsW13rSmE6O4oz9oN7ciHDC4kJQjt3LPexuAKPHIqhIRUu3g1boF6pp9ubONQKBgQC7jcBRq9VlJRoxKDYVlNwq+Z/s2Segi4ip4oqky5y36jObg+50qGjrQ2DQnXnnfU1UaBVBnz4xKqgzPx7CSj90Rxjd4LwOtMKot2YwwwWuGRw1GRC7f11d0hJjJEv2Px7Uv6Y4Fb/uTDsC8wUnJddT5rXedYY93RImTTBuTK7apwKBgBCWY8N91FXZueYJxmyGsR+HhQ/noqLBY1G2zRIS7TBkVYTHq5LWVYx5cM4N2Vq9pJ8i1TCp7CvpRTBPz0OrHusdlUX6S9VQ0Ir/eU8ymaxzh4xm/Fw5W56N/4ZVqkJVKvkywdlcHOP47tA352CEv2TIBeF1uXPSPUyjzf8IURzNAoGAQyKLe/CZUzpDtOLi8Ti20r9GCr70m1g3FDCeVjz4HTE9Reak3adG3yfgKOylrUJCAvu62CGLXogZazal6QAw1It6kDmYt17m6wOzFbNJfjdIzIzrW2JM5n+Cy3A7rKqNe7QaaKsIZ+FrojOhXZEDEepcoYPKCKzwiTtKIcFbObMCgYBEzPX1r/JxDS9Qc+AxfE2v91WvzRQD9tWY0Zd1AYgKZiIXvc63vL9Cnsq4K7YM/YiXQv8lCq7R1CzlwWRC3yLnO3SWTMTORX8C0SX8Sy4BJ1e3veDFYlhfxcR4JmWEGSbnZcZBxAnUln/zUFmOthv02cDTSfOVRCFblRtnAVbhwA==
  #RSA私钥
  RSA_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjxBuc2QBKkmrBoBK9Yh3bpwSx4qdPBhnLfRACM8PMwauc1MKV9ClyzSSdXfgIHEFgGJNAa7F/ZaUdn36HSXItqoKNd5F3Pe8TEWxQUrGeMJ6CtC/3EsvT+jcXaSfhboSmOjJ8DhQKYn+5iWPCOBbpk4Towvu7N5FtYTHLWxXNGMhHN7DQ/btNNaIl/ZQxIk2HeDrqtiCgxW3tpd/Cgj4E6ZKQ+Dl1BZt7rYC5bKxqLLVPQ0F2pYPXPCyy0YwUKB8ngsjl88FgRrGdoaALyTSiJTseuhirunmxfxFd2NgbHYw0BdMwkP3N8Qs+27L9gRnLgN1bmALVJgZqEg+gC+mkwIDAQAB
  #签名私钥
  SIGNATURE_PRIVATE_KEY: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9Gv5KNtk4chHBx332tLxgOnoJ9zpDiMQ6YcZuLO3GC/INLWM71I/LvyPpU0pwC1NwCG0GMgNPax7O6kiNkp/0f+3f7jPFQf0qP7JsGsk1bdmFIy6cOnkrvH1FyYJGdTxBwJxiwTBr3QUN3nh/djO5QPeRffn+Yh9ZkIsPeZjp3u3HMYeVaVXzhTJAMrVyoBiVS8zIeDsV/SrU2tXBdTR9ULw8G3GerO6SfLjagMQ3SvuMi+srSwqZlJUd+gdWNY+FUv1Fa438Y/ZFXSTSdvznoD1zF52VXbfqVIGk81iBaKCU8ZbFOavA4jroYTU9n8MwkGn5Fo+96HnY0DSYDgmhAgMBAAECggEAFaEoxMRRRCuH7Gos9jLl+Pu3SbyFZYQXLbZRQ/jPmX90SB2Q5B8D84IBUYa9VON2v7G3BqZhyouuEmypr8e9k/Gt+5b7ROyvUE3I0qSdrwbJgnjrs+LcSSxeB8VsqTJvmfW17XW7XBsDoPp5Pdr/P4k2x+Vo2rfObigiP7rgyp8KimHaq1u5RLYLUbPGBdRLRt0NUohO1V9Y0KyFTtxdfvJ2BdDANvhOYyCmp9dI5MXoNDh1w0z03Eq4PM30SVEv37mwSVEav4eKlN7/cuclcLF2pddNX7xScdH/kohDaR2xWh1HqkVKIMP+nBXMPWsSpzw+ktwQBROtMbtNsuIZIQKBgQDtDM1KJqoleKImYDc+S3+tU+z6PiYEQQRAzhCscvCvWNOzI0OB0CSEp3hfiUXL6jyOFOU/qI36EqXuqSAuNM+ZtfIzQhPkDNHjO9RqHZhan8AsP06Bmo2P+u83BGF2VVMfacM98aRpL6CwpBsBpnX0ASlC25WAESviXRRH01Za5wKBgQDMOQMTue9j1EA19VLnHXwuOJ3KoaAIdwyluQPgyjnIyTypMKelOrUJoUhRYJm/4XOekq0oyWhc++GnkMfHZYOzHXalTMoAP9EdRMRqUTHztBrUkqkInVEJrAif/OvXMlSIR15fIC+/fewLxEKjf2rU2AM7XRKVyHplkvCsoB0uNwKBgGpUhL1PLKEURH+8RuttiD7iV3lEaV8dHuBGzpncEPRGfudq2PwgtlC+ojMQazt1vWXqH473d4AF32J3gJTZYYnMYHD3od54lak9DCHxVobIA7aVSwy9m+RKpgTitSkUSu3bThW6D4qTL5wscGTEG0KxRqXTw3KnwSyPneo99Q1fAoGAOpyONoYhn3wWJaZP8cazkixrlPFIFcXdGl78LvK7HNYsk75EDxbHSIlCUSCxX7Gb1kHwcolDa5Ra0hWqUJ7g6nIlUBG209V89bJ70KuW84OYQ7QH0VIdJPJ70zbqlOt7+VTKT/DT41iHe2ULXxM9nPKWEt6Ga/iKsEY4zsJxPYcCgYEAoGW8YlcLiMpaTOyOnS5uH6at71sUc2wLR+ovLqqpQxLtOn597fB96X41fg07x0yh9RJ4MbSjamVOpcWsXJaTL5hf98ppw/ffeoWtRc2IiVVGZFNDYm5xXj+mMke8mFNCeKEo2Igf8jGXUTz6473cdljd4GB0T/JWGFX2HNzvEcs=
  #签名公钥
  SIGNATURE_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRr+SjbZOHIRwcd99rS8YDp6Cfc6Q4jEOmHGbiztxgvyDS1jO9SPy78j6VNKcAtTcAhtBjIDT2sezupIjZKf9H/t3+4zxUH9Kj+ybBrJNW3ZhSMunDp5K7x9RcmCRnU8QcCcYsEwa90FDd54f3YzuUD3kX35/mIfWZCLD3mY6d7txzGHlWlV84UyQDK1cqAYlUvMyHg7Ff0q1NrVwXU0fVC8PBtxnqzukny42oDEN0r7jIvrK0sKmZSVHfoHVjWPhVL9RWuN/GP2RV0k0nb856A9cxedlV236lSBpPNYgWiglPGWxTmrwOI66GE1PZ/DMJBp+RaPveh52NA0mA4JoQIDAQAB

2. AES encryption and decryption tools

package com.jmh.demo03.com.blog;


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

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

/**
 * AES加密工具类
 */
public class AESEncryptUtil {

	/**
	 * 参数分别代表 算法名称/加密模式/数据填充方式
	 */
	private static final String ALGORITHMS = "AES/CBC/PKCS5Padding";

	private static final String AES = "AES";

	/**
	 * 加密
	 * 
	 * @param content    未加密的字符串
	 * @param encryptKey key值 字节数组 ----16位
	 * @param SIV        加盐 字节数组 ----16位
	 * @return 加密后的内容
	 * @throws Exception 异常
	 */
	public static String encrypt(String content, byte[] encryptKey, byte[] SIV) throws Exception {
		Cipher cipher = Cipher.getInstance(ALGORITHMS);
		// 加密向量
		IvParameterSpec iv = new IvParameterSpec(SIV);
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey, AES), iv);
		byte[] encryptByte = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
		// 采用base64算法进行转码,避免出现中文乱码
		return Base64.encodeBase64String(encryptByte);
	}

	/**
	 * 解密
	 *
	 * @param encodeEncryptString 未解密的字符串
	 * @param decryptKey 解密的key值 字节数组 ----16位
	 * @param SIV        加盐 字节数组 ----16位
	 * @return 解密后的内容
	 * @throws Exception 异常
	 */
	public static String decrypt(String encodeEncryptString, byte[] decryptKey, byte[] SIV) throws Exception {
		Cipher cipher = Cipher.getInstance(ALGORITHMS);
		// 加密向量
		IvParameterSpec iv = new IvParameterSpec(SIV);
		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey, AES), iv);
		// 采用base64算法进行转码,避免出现中文乱码
		byte[] decryptByte = cipher.doFinal(Base64.decodeBase64(encodeEncryptString));
		return new String(decryptByte, StandardCharsets.UTF_8);
	}

}

3. AES message key, AES key initial vector, byte array conversion tool class

package com.jmh.service.base.util;

import java.security.MessageDigest;

/**
 * 数字摘要算法工具
 *
 */
public class MessageDigestUtil {
	// Md:Md2、Md4、Md5(产生出一个128位,即16字节的散列值(hash value)。在Java中可以将其Hex为一个32长度的字符串。)
	// SHA:SHA1、SHA224、SHA256、SHA384、SHA512

	private static final String MD5 = "MD5";
	private static final String SHA1 = "SHA-1";
	private static final String SHA224 = "SHA-224";
	private static final String SHA256 = "SHA-256";
	private static final String SHA384 = "SHA-384";
	private static final String SHA512 = "SHA-512";
	private static final String CHARSET = "UTF-8";

	/**
	 * @param input 输入 ----Byte
	 * @return 返回16个字节
	 * @throws Exception
	 */
	public static byte[] MD5(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest md5 = MessageDigest.getInstance(MD5);
		// 执行消息摘要算法
		return md5.digest(input);
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回20个字节
	 * @throws Exception
	 */
	public static byte[] SHA1(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha1 = MessageDigest.getInstance(SHA1);
		// 执行消息摘要算法
		return sha1.digest(input);
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回28个字节
	 * @throws Exception
	 */
	public static byte[] SHA224(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha224 = MessageDigest.getInstance(SHA224);
		// 执行消息摘要算法
		return sha224.digest(input);
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回32个字节
	 * @throws Exception
	 */
	public static byte[] SHA256(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha256 = MessageDigest.getInstance(SHA256);
		// 执行消息摘要算法
		return sha256.digest(input);
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回48个字节
	 * @throws Exception
	 */
	public static byte[] SHA384(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha384 = MessageDigest.getInstance(SHA384);
		// 执行消息摘要算法
		return sha384.digest(input);
	}

	/**
	 * @param input ----Byte
	 * @return 返回64个字节
	 * @throws Exception
	 */
	public static byte[] SHA512(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha512 = MessageDigest.getInstance(SHA512);
		// 执行消息摘要算法
		return sha512.digest(input);
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回16个字节
	 * @throws Exception
	 */
	public static byte[] MD5(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest md5 = MessageDigest.getInstance(MD5);
		// 执行消息摘要算法
		return md5.digest(input.getBytes("UTF-8"));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回20个字节
	 * @throws Exception
	 */
	public static byte[] SHA1(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha1 = MessageDigest.getInstance(SHA1);
		// 执行消息摘要算法
		return sha1.digest(input.getBytes("UTF-8"));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回28个字节
	 * @throws Exception
	 */
	public static byte[] SHA224(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha224 = MessageDigest.getInstance(SHA224);
		// 执行消息摘要算法
		return sha224.digest(input.getBytes("UTF-8"));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回32个字节
	 * @throws Exception
	 */
	public static byte[] SHA256(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha256 = MessageDigest.getInstance(SHA256);
		// 执行消息摘要算法
		return sha256.digest(input.getBytes("UTF-8"));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回48个字节
	 * @throws Exception
	 */
	public static byte[] SHA384(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha384 = MessageDigest.getInstance(SHA384);
		// 执行消息摘要算法
		return sha384.digest(input.getBytes("UTF-8"));
	}

	/**
	 * @param input ----String
	 * @return 返回64个字节
	 * @throws Exception
	 */
	public static byte[] SHA512(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha512 = MessageDigest.getInstance(SHA512);
		// 执行消息摘要算法
		return sha512.digest(input.getBytes("UTF-8"));
	}
	
	/**
	 * @param input 输入 ----Byte
	 * @return 返回32个字符16进制字符串
	 * @throws Exception
	 */
	public static String MD5ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest md5 = MessageDigest.getInstance(MD5);
		// 执行消息摘要算法
		return toHex(md5.digest(input));
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回40个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA1ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha1 = MessageDigest.getInstance(SHA1);
		// 执行消息摘要算法
		return toHex(sha1.digest(input));
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回56个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA224ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha224 = MessageDigest.getInstance(SHA224);
		// 执行消息摘要算法
		return toHex(sha224.digest(input));
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回64个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA256ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha256 = MessageDigest.getInstance(SHA256);
		// 执行消息摘要算法
		return toHex(sha256.digest(input));
	}

	/**
	 * @param input 输入 ----Byte
	 * @return 返回96个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA384ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha384 = MessageDigest.getInstance(SHA384);
		// 执行消息摘要算法
		return toHex(sha384.digest(input));
	}

	/**
	 * @param input ----Byte
	 * @return 返回128个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA512ToHex(byte[] input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha512 = MessageDigest.getInstance(SHA512);
		// 执行消息摘要算法
		return toHex(sha512.digest(input));
	}
	
	/**
	 * @param input 输入 ----String
	 * @return 返回32个字符16进制字符串
	 * @throws Exception
	 */
	public static String MD5ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest md5 = MessageDigest.getInstance(MD5);
		// 执行消息摘要算法
		return toHex(md5.digest(input.getBytes("UTF-8")));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回40个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA1ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha1 = MessageDigest.getInstance(SHA1);
		// 执行消息摘要算法
		return toHex(sha1.digest(input.getBytes("UTF-8")));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回56个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA224ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha224 = MessageDigest.getInstance(SHA224);
		// 执行消息摘要算法
		return toHex(sha224.digest(input.getBytes("UTF-8")));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回64个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA256ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha256 = MessageDigest.getInstance(SHA256);
		// 执行消息摘要算法
		return toHex(sha256.digest(input.getBytes("UTF-8")));
	}

	/**
	 * @param input 输入 ----String
	 * @return 返回96个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA384ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha384 = MessageDigest.getInstance(SHA384);
		// 执行消息摘要算法
		return toHex(sha384.digest(input.getBytes("UTF-8")));
	}

	/**
	 * @param input ----String
	 * @return 返回128个字符16进制字符串
	 * @throws Exception
	 */
	public static String SHA512ToHex(String input) throws Exception {
		// 创建消息摘要对象
		MessageDigest sha512 = MessageDigest.getInstance(SHA512);
		// 执行消息摘要算法
		return toHex(sha512.digest(input.getBytes("UTF-8")));
	}

	/**
	 * 将字节数组转换成16进制字符串
	 * @param digest
	 * @return
	 */
	private static String toHex(byte[] digest) {
		StringBuilder stringBuilder = new StringBuilder();
		// 对密文进行迭代
		for (byte b : digest) {
			// 把密文转换成16进制
			String string = Integer.toHexString(b & 0xff);
			if (string.length() == 1) {
				string = "0" + string;
			}
			stringBuilder.append(string);
		}
		return stringBuilder.toString();
	}

}

4. AES encryption and decryption test

package com.fesion.service.service.jmhDemo;

import com.fesion.service.base.util.AESEncryptUtil;
import com.fesion.service.base.util.MessageDigestUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author 蒋明辉
 * @data 2023/6/18 23:25
 */
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class Demo02 {

    /**
     * AES消息秘钥,这个就是我们在第一步application.yml文件里面配置的
     */
    @Value("${crypto.ASE_SIGN_KEY}")
    private String ASE_SIGN_KEY;

    /**
     * AES秘钥初始向量
     */
    @Value("${crypto.ASE_SIV}")
    private String ASE_SIV;

    /**
     * AES加解密
     */
    @Test
    @SneakyThrows
    public void demo01(){
        //加密--------------------------------
        //要加密的内容
        String conent="蒋明辉是大帅哥呢!!!";
        String encrypt = AESEncryptUtil.encrypt(conent, MessageDigestUtil.MD5(ASE_SIGN_KEY), MessageDigestUtil.MD5(ASE_SIV));

        //解密--------------------------------
        String decrypt = AESEncryptUtil.decrypt(encrypt, MessageDigestUtil.MD5(ASE_SIGN_KEY), MessageDigestUtil.MD5(ASE_SIV));

        System.out.println("-----------------加密---------------------");
        System.out.println("加密的内容:"+encrypt);
        System.out.println("-----------------解密---------------------");
        System.out.println("加密的内容:"+decrypt);

    }

}
  •  The results look at the picture

Guess you like

Origin blog.csdn.net/m0_63300795/article/details/131277562