让数据不再裸奔:学习使用AES加解密算法

目录

1.  application.yml文件配置

2. AES加解密工具类

3. AES消息秘钥、AES秘钥初始向量、转字节数组工具类

4.  AES加解密测试


我们为什么要用AES算法来进行加解密?

AES(Advanced Encryption Standard),又称高级加密标准,是一种对称加密算法,也是目前广泛使用的加密技术之一。其主要特点是加密速度快、安全性高、可扩展性好等。

AES 算法采用对称加密的方式,即加密和解密使用相同的密钥进行操作。密钥长度可以是 128、192 或 256 位,其中 128 位密钥被广泛使用,因为它可以提供足够的安全性和高效的加密速度。AES 加密和解密过程中采用分块加密的方式,即将明文分成若干个块,再分别进行加密操作,最后将加密得到的密文合并起来。

AES 算法具有以下优点:

  1. 安全性高:AES 算法采用了强大的对称加密技术,能够提供非常高的安全性,能够有效保护数据的机密性和完整性。

  2. 速度快:AES 算法采用了分组加密的方式,能够充分利用硬件加速和多线程技术,具有非常高效的加密速度。

  3. 可扩展性好:由于 AES 算法的密钥长度可以灵活调整,因此可以提供比较灵活的加密需求,适用于不同场景和应用。

  4. 常见性高:AES 算法在现代密码学领域得到广泛应用,是目前最常用的对称加密算法之一,因此在实际应用中具有良好的兼容性和可移植性。

AES 算法主要用于网络通信、数据存储、加密解密等方面。在网络通信中,AES 加密可以保护互联网数据的机密性和完整性,防止敏感信息被窃取和篡改;在数据存储中,AES 加密可以保护存储的数据,避免盗窃和泄露;在加密解密方面,AES 算法可以用于实现各种安全协议和应用程序,例如 SSL/TLS、IPSec、PGP 等。

1.  application.yml文件配置

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加解密工具类

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消息秘钥、AES秘钥初始向量、转字节数组工具类

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加解密测试

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);

    }

}
  •  结果看图

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下为JavaAES加密解密工具类: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AESUtil { private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8"; /** * 加密 * @param data 待加密的字符串 * @param key 密钥 * @param iv 向量 * @return 加密后的字符串 */ public static String encrypt(String data, String key, String iv) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(data.getBytes(CHARSET)); return Base64.getEncoder().encodeToString(encrypted); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 解密 * @param data 待解密的字符串 * @param key 密钥 * @param iv 向量 * @return 解密后的字符串 */ public static String decrypt(String data, String key, String iv) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data)); return new String(decrypted, CHARSET); } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 使用示例: ```java public class Main { public static void main(String[] args) { String data = "Hello, world!"; String key = "1234567890123456"; String iv = "1234567890123456"; String encrypted = AESUtil.encrypt(data, key, iv); String decrypted = AESUtil.decrypt(encrypted, key, iv); System.out.println("明文:" + data); System.out.println("加密后:" + encrypted); System.out.println("解密后:" + decrypted); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值