当前位置:   article > 正文

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

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文件配置

  1. crypto:
  2. #AES消息秘钥
  3. 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=
  4. #AES秘钥初始向量
  5. ASE_SIV: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhXkp0JjMD38J766M3LVDPGJpL4nloLMb4dmgJe9RlXhnLMQryDtSvbgDxSXaUsAEwUUd79Fej2LGrTvbdJ91hfR719i1ZBfriiO4OSHV7E3uXuVzkTM+BEmL7rNqJ6tkpjFAk3pfFndIUDVgfdBhvTHNU0+LsITMk0d+7eg0nLWV3pcsdX+nzm9kSM/ngw/LSO33omwaNeyZJod3CvesWFAuMD4kkW1Ub/evtY3OJW4uKn8D10Z8W6w1g9zScYeMreGm66dATauKNLxA6pso7TsrTltYHZhz7wzC+yztdMZuJQ2FU76sqMNER/IysZv00yCvSkpyrar4w6BGlKOVnwIDAQAB
  6. #RSA私钥
  7. 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==
  8. #RSA公钥
  9. RSA_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjxBuc2QBKkmrBoBK9Yh3bpwSx4qdPBhnLfRACM8PMwauc1MKV9ClyzSSdXfgIHEFgGJNAa7F/ZaUdn36HSXItqoKNd5F3Pe8TEWxQUrGeMJ6CtC/3EsvT+jcXaSfhboSmOjJ8DhQKYn+5iWPCOBbpk4Towvu7N5FtYTHLWxXNGMhHN7DQ/btNNaIl/ZQxIk2HeDrqtiCgxW3tpd/Cgj4E6ZKQ+Dl1BZt7rYC5bKxqLLVPQ0F2pYPXPCyy0YwUKB8ngsjl88FgRrGdoaALyTSiJTseuhirunmxfxFd2NgbHYw0BdMwkP3N8Qs+27L9gRnLgN1bmALVJgZqEg+gC+mkwIDAQAB
  10. #签名私钥
  11. 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=
  12. #签名公钥
  13. SIGNATURE_PUBLIC_KEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvRr+SjbZOHIRwcd99rS8YDp6Cfc6Q4jEOmHGbiztxgvyDS1jO9SPy78j6VNKcAtTcAhtBjIDT2sezupIjZKf9H/t3+4zxUH9Kj+ybBrJNW3ZhSMunDp5K7x9RcmCRnU8QcCcYsEwa90FDd54f3YzuUD3kX35/mIfWZCLD3mY6d7txzGHlWlV84UyQDK1cqAYlUvMyHg7Ff0q1NrVwXU0fVC8PBtxnqzukny42oDEN0r7jIvrK0sKmZSVHfoHVjWPhVL9RWuN/GP2RV0k0nb856A9cxedlV236lSBpPNYgWiglPGWxTmrwOI66GE1PZ/DMJBp+RaPveh52NA0mA4JoQIDAQAB

2. AES加解密工具类

  1. package com.jmh.demo03.com.blog;
  2. import org.apache.tomcat.util.codec.binary.Base64;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.spec.IvParameterSpec;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import java.nio.charset.StandardCharsets;
  7. /**
  8. * AES加密工具类
  9. */
  10. public class AESEncryptUtil {
  11. /**
  12. * 参数分别代表 算法名称/加密模式/数据填充方式
  13. */
  14. private static final String ALGORITHMS = "AES/CBC/PKCS5Padding";
  15. private static final String AES = "AES";
  16. /**
  17. * 加密
  18. *
  19. * @param content 未加密的字符串
  20. * @param encryptKey key值 字节数组 ----16位
  21. * @param SIV 加盐 字节数组 ----16位
  22. * @return 加密后的内容
  23. * @throws Exception 异常
  24. */
  25. public static String encrypt(String content, byte[] encryptKey, byte[] SIV) throws Exception {
  26. Cipher cipher = Cipher.getInstance(ALGORITHMS);
  27. // 加密向量
  28. IvParameterSpec iv = new IvParameterSpec(SIV);
  29. cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey, AES), iv);
  30. byte[] encryptByte = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
  31. // 采用base64算法进行转码,避免出现中文乱码
  32. return Base64.encodeBase64String(encryptByte);
  33. }
  34. /**
  35. * 解密
  36. *
  37. * @param encodeEncryptString 未解密的字符串
  38. * @param decryptKey 解密的key值 字节数组 ----16位
  39. * @param SIV 加盐 字节数组 ----16位
  40. * @return 解密后的内容
  41. * @throws Exception 异常
  42. */
  43. public static String decrypt(String encodeEncryptString, byte[] decryptKey, byte[] SIV) throws Exception {
  44. Cipher cipher = Cipher.getInstance(ALGORITHMS);
  45. // 加密向量
  46. IvParameterSpec iv = new IvParameterSpec(SIV);
  47. cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey, AES), iv);
  48. // 采用base64算法进行转码,避免出现中文乱码
  49. byte[] decryptByte = cipher.doFinal(Base64.decodeBase64(encodeEncryptString));
  50. return new String(decryptByte, StandardCharsets.UTF_8);
  51. }
  52. }

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

  1. package com.jmh.service.base.util;
  2. import java.security.MessageDigest;
  3. /**
  4. * 数字摘要算法工具
  5. *
  6. */
  7. public class MessageDigestUtil {
  8. // Md:Md2、Md4、Md5(产生出一个128位,即16字节的散列值(hash value)。在Java中可以将其Hex为一个32长度的字符串。)
  9. // SHA:SHA1、SHA224、SHA256、SHA384、SHA512
  10. private static final String MD5 = "MD5";
  11. private static final String SHA1 = "SHA-1";
  12. private static final String SHA224 = "SHA-224";
  13. private static final String SHA256 = "SHA-256";
  14. private static final String SHA384 = "SHA-384";
  15. private static final String SHA512 = "SHA-512";
  16. private static final String CHARSET = "UTF-8";
  17. /**
  18. * @param input 输入 ----Byte
  19. * @return 返回16个字节
  20. * @throws Exception
  21. */
  22. public static byte[] MD5(byte[] input) throws Exception {
  23. // 创建消息摘要对象
  24. MessageDigest md5 = MessageDigest.getInstance(MD5);
  25. // 执行消息摘要算法
  26. return md5.digest(input);
  27. }
  28. /**
  29. * @param input 输入 ----Byte
  30. * @return 返回20个字节
  31. * @throws Exception
  32. */
  33. public static byte[] SHA1(byte[] input) throws Exception {
  34. // 创建消息摘要对象
  35. MessageDigest sha1 = MessageDigest.getInstance(SHA1);
  36. // 执行消息摘要算法
  37. return sha1.digest(input);
  38. }
  39. /**
  40. * @param input 输入 ----Byte
  41. * @return 返回28个字节
  42. * @throws Exception
  43. */
  44. public static byte[] SHA224(byte[] input) throws Exception {
  45. // 创建消息摘要对象
  46. MessageDigest sha224 = MessageDigest.getInstance(SHA224);
  47. // 执行消息摘要算法
  48. return sha224.digest(input);
  49. }
  50. /**
  51. * @param input 输入 ----Byte
  52. * @return 返回32个字节
  53. * @throws Exception
  54. */
  55. public static byte[] SHA256(byte[] input) throws Exception {
  56. // 创建消息摘要对象
  57. MessageDigest sha256 = MessageDigest.getInstance(SHA256);
  58. // 执行消息摘要算法
  59. return sha256.digest(input);
  60. }
  61. /**
  62. * @param input 输入 ----Byte
  63. * @return 返回48个字节
  64. * @throws Exception
  65. */
  66. public static byte[] SHA384(byte[] input) throws Exception {
  67. // 创建消息摘要对象
  68. MessageDigest sha384 = MessageDigest.getInstance(SHA384);
  69. // 执行消息摘要算法
  70. return sha384.digest(input);
  71. }
  72. /**
  73. * @param input ----Byte
  74. * @return 返回64个字节
  75. * @throws Exception
  76. */
  77. public static byte[] SHA512(byte[] input) throws Exception {
  78. // 创建消息摘要对象
  79. MessageDigest sha512 = MessageDigest.getInstance(SHA512);
  80. // 执行消息摘要算法
  81. return sha512.digest(input);
  82. }
  83. /**
  84. * @param input 输入 ----String
  85. * @return 返回16个字节
  86. * @throws Exception
  87. */
  88. public static byte[] MD5(String input) throws Exception {
  89. // 创建消息摘要对象
  90. MessageDigest md5 = MessageDigest.getInstance(MD5);
  91. // 执行消息摘要算法
  92. return md5.digest(input.getBytes("UTF-8"));
  93. }
  94. /**
  95. * @param input 输入 ----String
  96. * @return 返回20个字节
  97. * @throws Exception
  98. */
  99. public static byte[] SHA1(String input) throws Exception {
  100. // 创建消息摘要对象
  101. MessageDigest sha1 = MessageDigest.getInstance(SHA1);
  102. // 执行消息摘要算法
  103. return sha1.digest(input.getBytes("UTF-8"));
  104. }
  105. /**
  106. * @param input 输入 ----String
  107. * @return 返回28个字节
  108. * @throws Exception
  109. */
  110. public static byte[] SHA224(String input) throws Exception {
  111. // 创建消息摘要对象
  112. MessageDigest sha224 = MessageDigest.getInstance(SHA224);
  113. // 执行消息摘要算法
  114. return sha224.digest(input.getBytes("UTF-8"));
  115. }
  116. /**
  117. * @param input 输入 ----String
  118. * @return 返回32个字节
  119. * @throws Exception
  120. */
  121. public static byte[] SHA256(String input) throws Exception {
  122. // 创建消息摘要对象
  123. MessageDigest sha256 = MessageDigest.getInstance(SHA256);
  124. // 执行消息摘要算法
  125. return sha256.digest(input.getBytes("UTF-8"));
  126. }
  127. /**
  128. * @param input 输入 ----String
  129. * @return 返回48个字节
  130. * @throws Exception
  131. */
  132. public static byte[] SHA384(String input) throws Exception {
  133. // 创建消息摘要对象
  134. MessageDigest sha384 = MessageDigest.getInstance(SHA384);
  135. // 执行消息摘要算法
  136. return sha384.digest(input.getBytes("UTF-8"));
  137. }
  138. /**
  139. * @param input ----String
  140. * @return 返回64个字节
  141. * @throws Exception
  142. */
  143. public static byte[] SHA512(String input) throws Exception {
  144. // 创建消息摘要对象
  145. MessageDigest sha512 = MessageDigest.getInstance(SHA512);
  146. // 执行消息摘要算法
  147. return sha512.digest(input.getBytes("UTF-8"));
  148. }
  149. /**
  150. * @param input 输入 ----Byte
  151. * @return 返回32个字符16进制字符串
  152. * @throws Exception
  153. */
  154. public static String MD5ToHex(byte[] input) throws Exception {
  155. // 创建消息摘要对象
  156. MessageDigest md5 = MessageDigest.getInstance(MD5);
  157. // 执行消息摘要算法
  158. return toHex(md5.digest(input));
  159. }
  160. /**
  161. * @param input 输入 ----Byte
  162. * @return 返回40个字符16进制字符串
  163. * @throws Exception
  164. */
  165. public static String SHA1ToHex(byte[] input) throws Exception {
  166. // 创建消息摘要对象
  167. MessageDigest sha1 = MessageDigest.getInstance(SHA1);
  168. // 执行消息摘要算法
  169. return toHex(sha1.digest(input));
  170. }
  171. /**
  172. * @param input 输入 ----Byte
  173. * @return 返回56个字符16进制字符串
  174. * @throws Exception
  175. */
  176. public static String SHA224ToHex(byte[] input) throws Exception {
  177. // 创建消息摘要对象
  178. MessageDigest sha224 = MessageDigest.getInstance(SHA224);
  179. // 执行消息摘要算法
  180. return toHex(sha224.digest(input));
  181. }
  182. /**
  183. * @param input 输入 ----Byte
  184. * @return 返回64个字符16进制字符串
  185. * @throws Exception
  186. */
  187. public static String SHA256ToHex(byte[] input) throws Exception {
  188. // 创建消息摘要对象
  189. MessageDigest sha256 = MessageDigest.getInstance(SHA256);
  190. // 执行消息摘要算法
  191. return toHex(sha256.digest(input));
  192. }
  193. /**
  194. * @param input 输入 ----Byte
  195. * @return 返回96个字符16进制字符串
  196. * @throws Exception
  197. */
  198. public static String SHA384ToHex(byte[] input) throws Exception {
  199. // 创建消息摘要对象
  200. MessageDigest sha384 = MessageDigest.getInstance(SHA384);
  201. // 执行消息摘要算法
  202. return toHex(sha384.digest(input));
  203. }
  204. /**
  205. * @param input ----Byte
  206. * @return 返回128个字符16进制字符串
  207. * @throws Exception
  208. */
  209. public static String SHA512ToHex(byte[] input) throws Exception {
  210. // 创建消息摘要对象
  211. MessageDigest sha512 = MessageDigest.getInstance(SHA512);
  212. // 执行消息摘要算法
  213. return toHex(sha512.digest(input));
  214. }
  215. /**
  216. * @param input 输入 ----String
  217. * @return 返回32个字符16进制字符串
  218. * @throws Exception
  219. */
  220. public static String MD5ToHex(String input) throws Exception {
  221. // 创建消息摘要对象
  222. MessageDigest md5 = MessageDigest.getInstance(MD5);
  223. // 执行消息摘要算法
  224. return toHex(md5.digest(input.getBytes("UTF-8")));
  225. }
  226. /**
  227. * @param input 输入 ----String
  228. * @return 返回40个字符16进制字符串
  229. * @throws Exception
  230. */
  231. public static String SHA1ToHex(String input) throws Exception {
  232. // 创建消息摘要对象
  233. MessageDigest sha1 = MessageDigest.getInstance(SHA1);
  234. // 执行消息摘要算法
  235. return toHex(sha1.digest(input.getBytes("UTF-8")));
  236. }
  237. /**
  238. * @param input 输入 ----String
  239. * @return 返回56个字符16进制字符串
  240. * @throws Exception
  241. */
  242. public static String SHA224ToHex(String input) throws Exception {
  243. // 创建消息摘要对象
  244. MessageDigest sha224 = MessageDigest.getInstance(SHA224);
  245. // 执行消息摘要算法
  246. return toHex(sha224.digest(input.getBytes("UTF-8")));
  247. }
  248. /**
  249. * @param input 输入 ----String
  250. * @return 返回64个字符16进制字符串
  251. * @throws Exception
  252. */
  253. public static String SHA256ToHex(String input) throws Exception {
  254. // 创建消息摘要对象
  255. MessageDigest sha256 = MessageDigest.getInstance(SHA256);
  256. // 执行消息摘要算法
  257. return toHex(sha256.digest(input.getBytes("UTF-8")));
  258. }
  259. /**
  260. * @param input 输入 ----String
  261. * @return 返回96个字符16进制字符串
  262. * @throws Exception
  263. */
  264. public static String SHA384ToHex(String input) throws Exception {
  265. // 创建消息摘要对象
  266. MessageDigest sha384 = MessageDigest.getInstance(SHA384);
  267. // 执行消息摘要算法
  268. return toHex(sha384.digest(input.getBytes("UTF-8")));
  269. }
  270. /**
  271. * @param input ----String
  272. * @return 返回128个字符16进制字符串
  273. * @throws Exception
  274. */
  275. public static String SHA512ToHex(String input) throws Exception {
  276. // 创建消息摘要对象
  277. MessageDigest sha512 = MessageDigest.getInstance(SHA512);
  278. // 执行消息摘要算法
  279. return toHex(sha512.digest(input.getBytes("UTF-8")));
  280. }
  281. /**
  282. * 将字节数组转换成16进制字符串
  283. * @param digest
  284. * @return
  285. */
  286. private static String toHex(byte[] digest) {
  287. StringBuilder stringBuilder = new StringBuilder();
  288. // 对密文进行迭代
  289. for (byte b : digest) {
  290. // 把密文转换成16进制
  291. String string = Integer.toHexString(b & 0xff);
  292. if (string.length() == 1) {
  293. string = "0" + string;
  294. }
  295. stringBuilder.append(string);
  296. }
  297. return stringBuilder.toString();
  298. }
  299. }

4.  AES加解密测试

  1. package com.fesion.service.service.jmhDemo;
  2. import com.fesion.service.base.util.AESEncryptUtil;
  3. import com.fesion.service.base.util.MessageDigestUtil;
  4. import lombok.SneakyThrows;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import org.springframework.test.context.junit4.SpringRunner;
  11. /**
  12. * @author 蒋明辉
  13. * @data 2023/6/18 23:25
  14. */
  15. @SpringBootTest
  16. @RunWith(SpringRunner.class)
  17. @Slf4j
  18. public class Demo02 {
  19. /**
  20. * AES消息秘钥,这个就是我们在第一步application.yml文件里面配置的
  21. */
  22. @Value("${crypto.ASE_SIGN_KEY}")
  23. private String ASE_SIGN_KEY;
  24. /**
  25. * AES秘钥初始向量
  26. */
  27. @Value("${crypto.ASE_SIV}")
  28. private String ASE_SIV;
  29. /**
  30. * AES加解密
  31. */
  32. @Test
  33. @SneakyThrows
  34. public void demo01(){
  35. //加密--------------------------------
  36. //要加密的内容
  37. String conent="蒋明辉是大帅哥呢!!!";
  38. String encrypt = AESEncryptUtil.encrypt(conent, MessageDigestUtil.MD5(ASE_SIGN_KEY), MessageDigestUtil.MD5(ASE_SIV));
  39. //解密--------------------------------
  40. String decrypt = AESEncryptUtil.decrypt(encrypt, MessageDigestUtil.MD5(ASE_SIGN_KEY), MessageDigestUtil.MD5(ASE_SIV));
  41. System.out.println("-----------------加密---------------------");
  42. System.out.println("加密的内容:"+encrypt);
  43. System.out.println("-----------------解密---------------------");
  44. System.out.println("加密的内容:"+decrypt);
  45. }
  46. }
  •  结果看图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/794772
推荐阅读
相关标签
  

闽ICP备14008679号