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

news2024/10/6 5:54:13

目录

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

    }

}
  •  结果看图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之生成随机数方法(C代码实现猜数字游戏)

C语言之生成随机数方法&#xff08;C代码实现猜数字游戏&#xff09; 首先先把猜数字游戏的代码给大家暂时出来&#xff0c;然后我们在根据代码的步骤一步一步的推导 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <tim…

【ChatGPT】一个凭借两百多年历史的公式崛起的巨星

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…

一分钟学一个 Linux 命令 - ps

前言 大家好&#xff0c;我是 god23bin。欢迎来到《一分钟学一个 Linux 命令》系列&#xff0c;每天只需一分钟&#xff0c;记住一个 Linux 命令不成问题。今天要说的是 ps 命令。 什么是 ps 命令&#xff1f; ps 的英文全称是 process status&#xff0c;意思是进程状态。 …

Servlet执行原理和API详解---【创建Servlet项目】

目录 一、Servlet 是什么&#xff1f; 主要工作&#xff1a; 第一个Servlet项目&#xff1a; 编写代码 打包程序 一、Servlet 是什么&#xff1f; Servlet 是一款基于HTTP协议&#xff0c;用来开发Java Web&#xff0c;运行在Tomcat里面的里的框架技术。 一种实现动态页面…

chatgpt赋能python:Python创建文件

Python创建文件 Python是一种高级编程语言&#xff0c;广泛应用于各种领域&#xff0c;尤其在数据分析、机器学习和人工智能方面被广泛使用。在Python中&#xff0c;创建文件是一项基本任务&#xff0c;本文将介绍如何使用Python创建文件。 创建一个空文件 在Python中&#…

3.CSS 的背景

通过CSS背景属性&#xff0c;可以给页面元素添加背景样式。 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 3.1背景颜色 background-color属性定义了元素的背景颜色 background-color:颜色值;一般情况下元素背景颜色默认值是transparent(透…

【实战】 React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表1.新建文件2.状态提升3.新建utils4.Custom Hook 学习内容来源&#xff1a;React React Hook TS 最佳实践-慕课网 相对原教程&#xff0c;我在学习开始时&#xff08;2023.0…

记录好项目D8

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是超市管理系统 技术栈&#xff1a;springbootjavamysqlthyemleafshiro …

数据安全--24--数据安全管理之API管理

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/131274853 一、API管理概述 API是指应用程序编程接口&#xff0c;它的存在主要是为了提高系统各组成单元的内聚性&#xff0c;降低组成单元之间的耦合程度&#xff08;相互依赖程度&#xff09;&#…

[元带你学: eMMC协议详解 18] eMMC的后台操作(Background Operations)

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 1800 字&#xff0c; 主要内容 1、后台操作/前台操作区别&#xff1f; 2、如何进行手动后台操作&#xff1f; 3、自动后台启动和停止方法&a…

【Redis基础】

Redis基础 Redis基础Note Redis基础1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启1.3.7.wi…

web安全自学笔记

Web 安全方面的基本知识是有很必要的&#xff0c;未必就要深入理解。本文主要介绍常见的网络攻击类型&#xff0c;不作深入探讨。 正文 网络攻击的形式种类繁多&#xff0c;从简单的网站敏感文件扫描、弱口令暴力破解&#xff0c;到 SQL 注入&#xff0c;再到复杂的网络劫持等…

基于Web的影院信息管理系统设计与实现(论文+源码)_kaic

摘要 随着文化产业的发展&#xff0c;电影行业迎来了发展的黄金期&#xff0c;而且人民生活水平的 不断提高&#xff0c;观众对影院的服务要求也越来越高。传统的服务模式&#xff0c;已经不能满足 观众的需求&#xff0c;随着信息技术的发展&#xff0c;越来越多的影院将信息技…

Qt 中动态加载窗口

在编程中&#xff0c;我经常会遇见要根据用户触发按钮&#xff0c;动态生成窗口的情况。在此有两种方法可以动态生成窗口&#xff1a;一&#xff1a;直接在槽函数中调用窗口类。二&#xff1a;将 **.ui 添加到资源文件&#xff0c;通过 QUiLoader 加载。 现将两种方法介绍如下…

LAMPDISCUZ论坛

目录 1.1 LAMP 1.2 LAMP架构搭建 2. 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 APache的源码编译安装涉及到的软件包&#xff1a; 2.2 安装环境依赖包 2.3 配置软件模块 2.4 添加httpd系统服务 2.5 修改httpd 服务配置文件 3.编译安装mysqld 服务 3.1 …

1. CSS的三大特性

CSS有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突 的问题 层叠性原则: ●样式冲突,遵循的原则是就近原则,哪个样式离结构近,就执行哪个…

记一次Windows 下Microsoft Store应用权限问题

关键字&#xff1a;windows、 microsoft store 画图 mspaint 终端 terminal Windows11 锁屏界面黑屏 起因 情不知所起&#xff0c;额走错片场了。。。 具体原因无法确定&#xff0c;猜测是由于之前磁盘故障后进行修复导致的权限丢失异常 表象 几乎是所有的Microsoft store的…

Java-反射机制(超详解)

Java反射机制概述 前言一、Java反射机制概述1. Java Reflection2. 动态语言 vs 静态语言二、 Class类的理解1. 类的加载过程1.1 初步了解1.2 类的加载过程图解1.3 了解&#xff1a;什么时候会发生类初始化&#xff1f;1.4 类加载器的作用1.5 JVM中不同类型的类的加载器1.6 代码…

SpringMVC系列-1 使用方式和启动流程

背景 SpringMVC作为SSM组件之一&#xff0c;Java开发有必要了解SpringMVC是如何被集成到Spring框架以及整个项目的启动流程。本文以Tomcat作为Servlet容器进行介绍&#xff0c;默认认为读者使用过Tomcat且对Tomcat内部组件有足够的理解。 1.启动流程 当Tomcat被部署到服务器…

node的安装配置

这个是官网下载地址 推荐选择下载LTS版本的下载&#xff0c;不推荐下载最新版的&#xff0c;下载完成之后&#xff0c;在安装过程中更改安装路径默认是c盘的&#xff0c;如果c盘空间大当我没说&#xff0c;接着一路傻瓜式安装默认点击下一步&#xff0c;直到安装完成。 创建文…