AesTestOne.java 3.1 KB

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