AES加、解密算法工具类

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Random;

/**

  • AES加、解密算法工具类
    */
    public class AesUtil {

    /**

    • 内部固定key
    • /
      public static final String internalFixedKey=“123qazwsx”;
      /
      *
    • 加密算法AES
      */
      private static final String KEY_ALGORITHM = “AES”;

    /**

    • key的长度,Wrong key size: must be equal to 128, 192 or 256
    • 传入时需要16、24、36
      */
      private static final Integer KEY_LENGTH = 16 * 8;

    /**

    • 算法名称/加密模式/数据填充方式
    • 默认:AES/ECB/PKCS5Padding
      */
      private static final String ALGORITHMS = “AES/CBC/PKCS5Padding”;

    /**

    • 后端AES的key,由静态代码块赋值
      */
      public static String key;

    /**

    • 不能在代码中创建
    • JceSecurity.getVerificationResult 会将其put进 private static final Map<Provider,Object>中,导致内存缓便被耗尽
      */
      //private static final BouncyCastleProvider PROVIDER = new BouncyCastleProvider();

    static {
    key = getKey();
    }

    /**

    • 获取key
      */
      public static String getKey() {
      StringBuilder uid = new StringBuilder();
      //产生16位的强随机数
      Random rd = new SecureRandom();
      for (int i = 0; i < KEY_LENGTH / 8; i++) {
      //产生0-2的3位随机数
      int type = rd.nextInt(3);
      switch (type) {
      case 0:
      //0-9的随机数
      uid.append(rd.nextInt(10));
      break;
      case 1:
      //ASCII在65-90之间为大写,获取大写随机
      uid.append((char) (rd.nextInt(25) + 65));
      break;
      case 2:
      //ASCII在97-122之间为小写,获取小写随机
      uid.append((char) (rd.nextInt(25) + 97));
      break;
      default:
      break;
      }
      }
      return uid.toString();
      }

    /**

    • 加密

    • @param content 加密的字符串

    • @param encryptKey key值
      */
      public static String encrypt(String content, String encryptKey) throws Exception {
      //设置Cipher对象
      Cipher cipher = Cipher.getInstance(ALGORITHMS);
      byte[] initParam = internalFixedKey.getBytes();
      IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
      cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM), ivParameterSpec);

      //调用doFinal
      // 转base64
      return Base64.encodeBase64String(cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)));

    }

    /**

    • 解密

    • @param encryptStr 解密的字符串

    • @param decryptKey 解密的key值
      */
      public static String decrypt(String encryptStr, String decryptKey) throws Exception {
      //base64格式的key字符串转byte
      byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
      byte[] initParam = internalFixedKey.getBytes();
      IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
      //设置Cipher对象
      Cipher cipher = Cipher.getInstance(ALGORITHMS);
      cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM), ivParameterSpec);

      //调用doFinal解密
      return new String(cipher.doFinal(decodeBase64),“UTF-8”);
      }

    /**

    • MD5验证方法
    • @param text 明文
    • @param key 密钥
    • @param md5 密文
    • @return true/false
    • @throws Exception
      */
      public boolean verify(String text, String md5) throws Exception {
      //根据传入的密钥进行验证
      String md5Text = md5(text);
      if(md5Text.equalsIgnoreCase(md5))
      {
      return true;
      }
      return false;
      }

    /**

    • MD5方法
    • @param text 明文
    • @param key 密钥
    • @return 密文
    • @throws Exception
      */
      public String md5(String text) throws Exception {
      //加密后的字符串
      String encodeStr= DigestUtils.md5Hex(text+“5WuQXkFmlhllL8Q3”);
      return encodeStr;
      }

    public static void main(String[] args) throws Exception {
    String a=“1234566768sdffsdfsdffs68”;
    String aj=encrypt(a,“5WuQXkFmlhllL8Q3”);
    System.out.println(aj);
    String jm=decrypt(aj,“5WuQXkFmlhllL8Q3”);
    System.out.println(jm);

    }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值