AesTestOne.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package com.template.common.utils;
  2. import org.apache.commons.codec.binary.Base64;
  3. import javax.annotation.Resource;
  4. import javax.crypto.Cipher;
  5. import javax.crypto.spec.IvParameterSpec;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.URLDecoder;
  9. import java.nio.charset.Charset;
  10. import java.nio.charset.StandardCharsets;
  11. /**
  12. * @Author: binguo
  13. * @Date: 2024/1/5 星期五 14:26
  14. * @Description: com.template.common.utils
  15. * @Version: 1.0
  16. */
  17. public class AesTestOne {
  18. /**
  19. * AES 对称加密(RSA非对称加密)
  20. * CBC 有向量 (ECB 无向量)
  21. * PKCS5Padding 填充模式(NoPadding 无填充)
  22. */
  23. private static final String ALG_AES_CBC_PKCS5 = "AES/CBC/PKCS5Padding";
  24. private static final String ALGORITHM = "AES";
  25. private static final Charset UTF8 = StandardCharsets.UTF_8;
  26. //private static String aesKey = "61afd794ed3244e995c5e894e5788193"; // 指定好的秘钥,非Base64和16进制
  27. private static String aesIv = "activevector4api"; // 偏移量
  28. private static SecretKeySpec skeySpec;
  29. private static IvParameterSpec iv;
  30. /**
  31. * 解密方法
  32. * @param cipherStr Base64编码的加密字符串
  33. * @return 解密后的字符串(UTF8编码)
  34. * @throws Exception 异常
  35. */
  36. public static String decrypt(String cipherStr, String appSecret) throws Exception{
  37. // step 1 获得一个密码器
  38. Cipher cipher = Cipher.getInstance(ALG_AES_CBC_PKCS5);
  39. // step 2 初始化密码器,指定是加密还是解密(Cipher.DECRYPT_MODE 解密; Cipher.ENCRYPT_MODE 加密)
  40. // 加密时使用的盐来够造秘钥对象
  41. skeySpec = new SecretKeySpec(appSecret.getBytes(),ALGORITHM);
  42. // 加密时使用的向量,16位字符串
  43. iv = new IvParameterSpec(aesIv.getBytes());
  44. cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
  45. // 对加密报文进行base64解码
  46. byte[] encrypted1 = Base64.decodeBase64(cipherStr);
  47. // 解密后的报文数组
  48. byte[] original = cipher.doFinal(encrypted1);
  49. // 输出utf8编码的字符串,输出字符串需要指定编码格式
  50. return new String(original, UTF8);
  51. }
  52. /**
  53. * 加密
  54. * @param plainText 明文
  55. * @return Base64编码的密文
  56. * @throws Exception 加密异常
  57. */
  58. public static String encrypt(String plainText, String appSecret) throws Exception{
  59. Cipher cipher = Cipher.getInstance(ALG_AES_CBC_PKCS5);
  60. skeySpec = new SecretKeySpec(appSecret.getBytes(),ALGORITHM);
  61. iv = new IvParameterSpec(aesIv.getBytes());
  62. cipher.init(Cipher.ENCRYPT_MODE, skeySpec,iv);
  63. // 这里的编码格式需要与解密编码一致
  64. byte [] encryptText = cipher.doFinal(plainText.getBytes(UTF8));
  65. return Base64.encodeBase64String(encryptText);
  66. }
  67. public static void main(String[] args) throws Exception {
  68. // URL解码
  69. System.out.println("");
  70. }
  71. }