AesUtil.java 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package com.malk.lianan;
  2. import cn.hutool.core.codec.Base64;
  3. import cn.hutool.crypto.Mode;
  4. import cn.hutool.crypto.Padding;
  5. import cn.hutool.crypto.symmetric.AES;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.Arrays;
  8. public class AesUtil {
  9. /**
  10. * AES CBC 加密
  11. * @param content 明文内容
  12. * @param key 密钥(需要16/24/32字节)
  13. * @return Base64编码的密文
  14. */
  15. public static String encrypt(String content, String key) {
  16. // 1. 创建AES对象,指定CBC模式,PKCS5Padding填充
  17. AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
  18. key.getBytes(StandardCharsets.UTF_8));
  19. // 2. 设置IV(这里使用密钥的前16字节,但实际应该用随机IV)
  20. // 注意:实际项目中IV应该是随机的,每次加密都不同
  21. byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
  22. if (ivBytes.length > 16) {
  23. ivBytes = Arrays.copyOf(ivBytes, 16);
  24. } else if (ivBytes.length < 16) {
  25. // 填充到16字节
  26. ivBytes = Arrays.copyOf(ivBytes, 16);
  27. Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
  28. }
  29. aes.setIv(ivBytes);
  30. // 3. 加密并返回Base64
  31. byte[] encrypted = aes.encrypt(content, StandardCharsets.UTF_8);
  32. return Base64.encode(encrypted);
  33. }
  34. /**
  35. * 解密
  36. */
  37. public static String decrypt(String base64Content, String key) {
  38. AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,
  39. key.getBytes(StandardCharsets.UTF_8));
  40. byte[] ivBytes = key.getBytes(StandardCharsets.UTF_8);
  41. if (ivBytes.length > 16) {
  42. ivBytes = Arrays.copyOf(ivBytes, 16);
  43. } else if (ivBytes.length < 16) {
  44. ivBytes = Arrays.copyOf(ivBytes, 16);
  45. Arrays.fill(ivBytes, ivBytes.length, 16, (byte)0);
  46. }
  47. aes.setIv(ivBytes);
  48. byte[] decoded = Base64.decode(base64Content);
  49. return aes.decryptStr(decoded, StandardCharsets.UTF_8);
  50. }
  51. }