【Java工具类】(27)—AES加密工具类

Java工具类(27)—AES加密工具类

package com.awifi.cloudnative.container.common.utils;

import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import com.awifi.cloudnative.container.common.content.ErrorConstants;
import com.awifi.cloudnative.container.common.exception.BaseException;
import org.apache.tomcat.util.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AESUtil {
   private static final Logger LOG = LoggerFactory.getLogger(AESUtil.class);
   public static final String CODE_TYPE = "UTF-8";
   //public static final String CODE_TYPE = "gb2312";

   public static final String AES_TYPE = "AES/ECB/NoPadding";

   private static final String ENCRYPTION = "AES";
   private static final String IV = "0000000000000000";

   public static String getKey() {
       Random random = new SecureRandom();
       StringBuilder sb = new StringBuilder();
       for (int i = 0; i < 16; i++) {
           int number = random.nextInt(3);
           long result = 0;
           switch (number) {
               case 0:
                   result = Math.round(new SecureRandom().nextInt(25) + 65);
                   sb.append((char) result);
                   break;
               case 1:
                   result = Math.round(new SecureRandom().nextInt(25) + 97);
                   sb.append(String.valueOf((char) result));
                   break;
               case 2:
                   sb.append(String.valueOf(new SecureRandom().nextInt(10)));
                   break;
           }
       }
       // sb.append("123456789012345");
       // sb.append("\0");
       return sb.toString();

   }

   //    public static void main(String args[]) {
//        //生成15位字符串
//        String key = "yju5pH2e8yo6947F";
//        System.out.println("aes秘钥:" + key);
//        String sign = "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";
//        System.out.println(decrypt(sign, key));
//        String str = "{\"errorCode\":\"0\",\"errorMsg\":\"成功\"}";
//        sign = encrypt(str, key);
//        System.out.println("加密后:" + sign);
//        System.out.println("解密后:" + decrypt(sign, key));
//    }
   public AESUtil() {
   }

   /**
    * aes加密
    *
    * @param cleartext 待加密串
    * @param key
    * @return base64后的加密串
    */
   public static String encrypt(String cleartext, String password) {
       try {
           password = appendZero2Password(password);
           byte[] str = cleartext.getBytes(CODE_TYPE);
           str = completionCodeFor16Bytes(str);
           Cipher cipher = Cipher.getInstance(AES_TYPE);
           SecretKeySpec key = new SecretKeySpec(password.getBytes(), ENCRYPTION);

           //   IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
           //cipher.init(Cipher.ENCRYPT_MODE, key, vi);
           cipher.init(Cipher.ENCRYPT_MODE, key);
           byte[] encryptedData = cipher.doFinal(str);
           String sign = Base64.encodeBase64String(encryptedData);
           LOG.debug("加密后的字符串:{}", sign);
           return sign;
       } catch (Exception e) {
           LOG.error("AES加密失败", e);
           throw new BaseException(ErrorConstants.ERR_EXCEPTION_000, "AES加密失败");
       }
       //   Pointer pointer = aesecb();
     /*  byte[] dst = new byte[200];
       Object object = aesecb(dst);

       System.out.println("pointer:" + object.getClass() + "*******");
       return aesecb(dst) + "";
       return  Base64.encodeBase64String(cleartext.getBytes());*/
   }

   /**
    * Aes解密
    *
    * @param encrypted 待解密串
    * @param key
    * @return 原始数据
    */
   public static String decrypt(String encrypted, String password) {
       try {
           password = appendZero2Password(password);
           byte[] byteMi = Base64.decodeBase64(encrypted);
           byteMi = completionCodeFor16Bytes(byteMi);
           SecretKeySpec key = new SecretKeySpec(password.getBytes(), ENCRYPTION);
           Cipher cipher = Cipher.getInstance(AES_TYPE);
           IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
           //  cipher.init(Cipher.DECRYPT_MODE, key, iv);
           cipher.init(Cipher.DECRYPT_MODE, key);
           byte[] decryptedData = cipher.doFinal(byteMi);
           return new String(decryptedData, "utf-8").trim();
       } catch (Exception e) {
           LOG.error("AES解密失败" + e.getMessage());
           throw new BaseException(ErrorConstants.ERR_EXCEPTION_000, "AES解密失败");
       }
     /*
       byte[] byteMi = Base64.decodeBase64(encrypted);
       byte[] dst = new byte[200];
       return aesecb(dst) + "";
       byte[] decryptedData =  Base64.decodeBase64(encrypted);
       return new String(decryptedData).trim();*/
   }

   /**
    * mod16位补全
    *
    * @param str 待加密串
    * @return 补全待加密串
    * @throws UnsupportedEncodingException 异常
    */
   public static byte[] completionCodeFor16Bytes(byte[] str) throws UnsupportedEncodingException {
       int num = str.length;
       int index = 16 - num % 16;
       if (index == 16) {
           return str;
       }
       byte[] newStr = new byte[str.length + index];

       System.arraycopy(str, 0, newStr, 0, str.length);
       return newStr;
   }

   /**
    * mod8位补全
    *
    * @param str 待加密串
    * @return 补全待加密串
    * @throws UnsupportedEncodingException 异常
    */
   public static byte[] completionCodeFor4Bytes(byte[] str) throws UnsupportedEncodingException {
       int num = str.length;
       int index = 4 - num % 4;
       if (index == 4) {
           return str;
       }
       byte[] newStr = new byte[str.length + index];

       System.arraycopy(str, 0, newStr, 0, str.length);
       return newStr;
   }

   /**
    * 检验密钥并补全 \0
    *
    * @return String
    * @throws
    * @author 范涌涛
    * @date 2020-05-12 15:22:34
    */
   private static String appendZero2Password(String password) {
       if (null == password) {
           LOG.error("AES密钥长度错误");
           throw new BaseException(ErrorConstants.INNER_EXCEPTION_010, "AES密钥长度错误");
       }
       if (password.length() == 16) {
           return password;
       }
       StringBuilder sbBuilder = new StringBuilder(password);
       sbBuilder.append("\0");
       return sbBuilder.toString();
   }

   /** 宽带账号解密
    * 解密方法
    * @param data 要解密的数据
    * @param key  解密key
    * @param iv 解密iv
    * @return 解密的结果
    * @throws Exception
    */
   public static String AccountdesEncrypt(String data, String key, String iv) {
       try {
           byte[] encrypted1 = new Base64().decode(data);

           Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
           SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
           IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

           cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

           byte[] original = cipher.doFinal(encrypted1);
           String originalString = new String(original);
           return originalString.trim();
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }
   }
}


你可能感兴趣的:(项目经验,java工具类,后端,经验分享)