java加密之AES/ECB/PKCS5Padding

来源:互联网 发布:考试做题软件 编辑:程序博客网 时间:2024/06/12 01:13

废话不多说,直接上代码

1.先创建一个base64编码类,

实际项目中不用自己写,有成熟的实现方法

package com.taikang;public final class Base64 { static private final int     BASELENGTH           = 128;  static private final int     LOOKUPLENGTH         = 64;  static private final int     TWENTYFOURBITGROUP   = 24;  static private final int     EIGHTBIT             = 8;  static private final int     SIXTEENBIT           = 16;  static private final int     FOURBYTE             = 4;  static private final int     SIGN                 = -128;  static private final char    PAD                  = '=';  static private final boolean fDebug               = false;  static final private byte[]  base64Alphabet       = new byte[BASELENGTH];  static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];  static {      for (int i = 0; i < BASELENGTH; ++i) {          base64Alphabet[i] = -1;      }      for (int i = 'Z'; i >= 'A'; i--) {          base64Alphabet[i] = (byte) (i - 'A');      }      for (int i = 'z'; i >= 'a'; i--) {          base64Alphabet[i] = (byte) (i - 'a' + 26);      }      for (int i = '9'; i >= '0'; i--) {          base64Alphabet[i] = (byte) (i - '0' + 52);      }      base64Alphabet['+'] = 62;      base64Alphabet['/'] = 63;      for (int i = 0; i <= 25; i++) {          lookUpBase64Alphabet[i] = (char) ('A' + i);      }      for (int i = 26, j = 0; i <= 51; i++, j++) {          lookUpBase64Alphabet[i] = (char) ('a' + j);      }      for (int i = 52, j = 0; i <= 61; i++, j++) {          lookUpBase64Alphabet[i] = (char) ('0' + j);      }      lookUpBase64Alphabet[62] = (char) '+';      lookUpBase64Alphabet[63] = (char) '/';  }  private static boolean isWhiteSpace(char octect) {      return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);  }  private static boolean isPad(char octect) {      return (octect == PAD);  }  private static boolean isData(char octect) {      return (octect < BASELENGTH && base64Alphabet[octect] != -1);  }  /**  * Encodes hex octects into Base64  *  * @param binaryData Array containing binaryData  * @return Encoded Base64 array  */  public static String encode(byte[] binaryData) {      if (binaryData == null) {          return null;      }      int lengthDataBits = binaryData.length * EIGHTBIT;      if (lengthDataBits == 0) {          return "";      }      int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;      int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;      int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;      char encodedData[] = null;      encodedData = new char[numberQuartet * 4];      byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;      int encodedIndex = 0;      int dataIndex = 0;      if (fDebug) {          System.out.println("number of triplets = " + numberTriplets);      }      for (int i = 0; i < numberTriplets; i++) {          b1 = binaryData[dataIndex++];          b2 = binaryData[dataIndex++];          b3 = binaryData[dataIndex++];          if (fDebug) {              System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);          }          l = (byte) (b2 & 0x0f);          k = (byte) (b1 & 0x03);          byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);          byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);          byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);          if (fDebug) {              System.out.println("val2 = " + val2);              System.out.println("k4   = " + (k << 4));              System.out.println("vak  = " + (val2 | (k << 4)));          }          encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];          encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];          encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];          encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];      }      // form integral number of 6-bit groups      if (fewerThan24bits == EIGHTBIT) {          b1 = binaryData[dataIndex];          k = (byte) (b1 & 0x03);          if (fDebug) {              System.out.println("b1=" + b1);              System.out.println("b1<<2 = " + (b1 >> 2));          }          byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);          encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];          encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];          encodedData[encodedIndex++] = PAD;          encodedData[encodedIndex++] = PAD;      } else if (fewerThan24bits == SIXTEENBIT) {          b1 = binaryData[dataIndex];          b2 = binaryData[dataIndex + 1];          l = (byte) (b2 & 0x0f);          k = (byte) (b1 & 0x03);          byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);          byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);          encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];          encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];          encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];          encodedData[encodedIndex++] = PAD;      }      return new String(encodedData);  }  /**  * Decodes Base64 data into octects  *  * @param encoded string containing Base64 data  * @return Array containind decoded data.  */  public static byte[] decode(String encoded) {      if (encoded == null) {          return null;      }      char[] base64Data = encoded.toCharArray();      // remove white spaces      int len = removeWhiteSpace(base64Data);      if (len % FOURBYTE != 0) {          return null;//should be divisible by four      }      int numberQuadruple = (len / FOURBYTE);      if (numberQuadruple == 0) {          return new byte[0];      }      byte decodedData[] = null;      byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;      char d1 = 0, d2 = 0, d3 = 0, d4 = 0;      int i = 0;      int encodedIndex = 0;      int dataIndex = 0;      decodedData = new byte[(numberQuadruple) * 3];      for (; i < numberQuadruple - 1; i++) {          if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))              || !isData((d3 = base64Data[dataIndex++]))              || !isData((d4 = base64Data[dataIndex++]))) {              return null;          }//if found "no data" just return null          b1 = base64Alphabet[d1];          b2 = base64Alphabet[d2];          b3 = base64Alphabet[d3];          b4 = base64Alphabet[d4];          decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);          decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));          decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);      }      if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {          return null;//if found "no data" just return null      }      b1 = base64Alphabet[d1];      b2 = base64Alphabet[d2];      d3 = base64Data[dataIndex++];      d4 = base64Data[dataIndex++];      if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters          if (isPad(d3) && isPad(d4)) {              if ((b2 & 0xf) != 0)//last 4 bits should be zero              {                  return null;              }              byte[] tmp = new byte[i * 3 + 1];              System.arraycopy(decodedData, 0, tmp, 0, i * 3);              tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);              return tmp;          } else if (!isPad(d3) && isPad(d4)) {              b3 = base64Alphabet[d3];              if ((b3 & 0x3) != 0)//last 2 bits should be zero              {                  return null;              }              byte[] tmp = new byte[i * 3 + 2];              System.arraycopy(decodedData, 0, tmp, 0, i * 3);              tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);              tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));              return tmp;          } else {              return null;          }      } else { //No PAD e.g 3cQl          b3 = base64Alphabet[d3];          b4 = base64Alphabet[d4];          decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);          decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));          decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);      }      return decodedData;  }  /**  * remove WhiteSpace from MIME containing encoded Base64 data.  *  * @param data  the byte array of base64 data (with WS)  * @return      the new length  */  private static int removeWhiteSpace(char[] data) {      if (data == null) {          return 0;      }      // count characters that's not whitespace      int newSize = 0;      int len = data.length;      for (int i = 0; i < len; i++) {          if (!isWhiteSpace(data[i])) {              data[newSize++] = data[i];          }      }      return newSize;  }  } 

2.AES/ECB/PKCS5Padding加密算法

// 加密    public static String Encrypt(String sSrc, String sKey) throws Exception {        if (sKey == null) {            System.out.print("Key为空null");            return null;        }        // 判断Key是否为16位        if (sKey.length() != 16) {            System.out.print("Key长度不是16位");            return null;        }        byte[] raw = sKey.getBytes("utf-8");        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));        return new Base64().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。    }

3.解密算法

// 解密    public static String Decrypt(String sSrc, String sKey) throws Exception {        try {            // 判断Key是否正确            if (sKey == null) {                System.out.print("Key为空null");                return null;            }            // 判断Key是否为16位            if (sKey.length() != 16) {                System.out.print("Key长度不是16位");                return null;            }            byte[] raw = sKey.getBytes("utf-8");            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");            cipher.init(Cipher.DECRYPT_MODE, skeySpec);            byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密            try {                byte[] original = cipher.doFinal(encrypted1);                String originalString = new String(original,"utf-8");                return originalString;            } catch (Exception e) {                System.out.println(e.toString());                return null;            }        } catch (Exception ex) {            System.out.println(ex.toString());            return null;        }    }

4.测试

 public static void main(String[] args) throws Exception {        /*         * 此处使用AES-128-ECB加密模式,key需要为16位。         */        String cKey = "123456789012345";        // 需要加密的字串        String cSrc = "www.taikang.com 你好";        System.out.println(cSrc);        // 加密        String enString = AES.Encrypt(cSrc, cKey);        System.out.println("加密后的字串是:" + enString);        // 解密        String DeString = AES.Decrypt(enString, cKey);        System.out.println("解密后的字串是:" + DeString);    }

5.运行结果

www.taikang.com 你好加密后的字串是:8mmGTqzo8REZveq3PiZvs+pJc8cFrFW9WBUWztLOqsg=解密后的字串是:www.taikang.com 你好

说明:这种方式加密解密双方使用同一个密钥,这个密钥可以在数据库报存,也可以在配置文件,或者在常量类中看个人喜好

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 穿高跟鞋崴着脚了怎么办 亚麻裤缩水了怎么办 怎么办一个人保定损点 淘宝遇到职业敲诈怎么办 三无燕窝被打假怎么办 碰上职业打假的怎么办 遇到专业打假的怎么办 手机wifi被劫持怎么办 手机网页乱跳怎么办 老公说话不算话怎么办 编曲接不到活怎么办 电表显示跳闸黄灯怎么办 硫酸铬钾中毒怎么办 门锁能扭动却打不开怎么办 防盗门保险坏了怎么办 厦门工会卡过期怎么办 阴雨天被子受潮怎么办 衣服晾臭了怎么办 喷砂机油水分离泵有油怎么办 水太烫玻璃瓶盖打不开怎么办 玻璃罐的玻璃盖打不开怎么办? 开红酒没有开瓶器怎么办 手机卡突然坏了怎么办 滚筒洗衣机打不开门怎么办 全自动洗衣机门开不开怎么办 好期待评分不足怎么办 单片机数码管亮度低怎么办 猫的同轴灯不亮怎么办 楼下邻居太吵怎么办 冰箱冷却液内露怎么办 冷却水没有了会怎么办 金立m7信号不好怎么办 csgo凉了饰品怎么办 模型拟合度低怎么办 石膏线用发泡胶怎么办 电表上显示err10怎么办 电表显示欠压怎么办 tcl电视遥控器失灵怎么办 玩具汽车遥控器失灵怎么办 玩具车遥控丢了怎么办 按压扣坏了怎么办