package cn.jfinalbbs.utils; import com.jfinal.kit.HashKit; /** * Created by liuyang on 15/4/21. */ public class EncryptionUtil extends HashKit { /** * 码表; */ public static char[] encodeTable = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; /** * Base64的编码; * * @param value * @return */ public static String encoderBase64(byte[] value) { StringBuilder sb = new StringBuilder(); //获取编码字节是3的倍数; int len = value.length; int len3 = len / 3; //先处理没有加换行符; for (int i = 0; i < len3; i++) { //得到第一个字符; int b1 = (value[i * 3] >> 2) & 0x3F; char c1 = encodeTable[b1]; sb.append(c1); //得到第二个字符; int b2 = ((value[i * 3] << 4 & 0x3F) + (value[i * 3 + 1] >> 4)) & 0x3F; char c2 = encodeTable[b2]; sb.append(c2); //得到第三个字符; int b3 = ((value[i * 3 + 1] << 2 & 0x3C) + (value[i * 3 + 2] >> 6)) & 0x3F; char c3 = encodeTable[b3]; sb.append(c3); //得到第四个字符; int b4 = value[i * 3 + 2] & 0x3F; char c4 = encodeTable[b4]; sb.append(c4); } //如果有剩余的字符就补0; //剩余的个数; int less = len % 3; if (less == 1) {//剩余一个字符--补充两个等号;; //得到第一个字符; int b1 = value[len3 * 3] >> 2 & 0x3F; char c1 = encodeTable[b1]; sb.append(c1); //得到第二个字符; int b2 = (value[len3 * 3] << 4 & 0x30) & 0x3F; char c2 = encodeTable[b2]; sb.append(c2); sb.append("=="); } else if (less == 2) {//剩余两个字符--补充一个等号; //得到第一个字符; int b1 = value[len3 * 3] >> 2 & 0x3F; char c1 = encodeTable[b1]; sb.append(c1); //得到第二个字符; int b2 = ((value[len3 * 3] << 4 & 0x30) + (value[len3 * 3 + 1] >> 4)) & 0x3F; char c2 = encodeTable[b2]; sb.append(c2); //得到第三个字符; int b3 = (value[len3 * 3 + 1] << 2 & 0x3C) & 0x3F; char c3 = encodeTable[b3]; sb.append(c3); sb.append("="); } return sb.toString(); } /** * Base64的解码; * * @param value * @return */ public static String decoderBase64(byte[] value) { //每四个一组进行解码; int len = value.length; int len4 = len / 4; StringBuilder sb = new StringBuilder(); //除去末尾的四个可能特殊的字符; int i = 0; for (i = 0; i < len4 - 1; i++) { //第一个字符; byte b1 = (byte) ((char2Index((char) value[i * 4]) << 2) + (char2Index((char) value[i * 4 + 1]) >> 4)); sb.append((char) b1); //第二个字符; byte b2 = (byte) ((char2Index((char) value[i * 4 + 1]) << 4) + (char2Index((char) value[i * 4 + 2]) >> 2)); sb.append((char) b2); //第三个字符; byte b3 = (byte) ((char2Index((char) value[i * 4 + 2]) << 6) + (char2Index((char) value[i * 4 + 3]))); sb.append((char) b3); } //处理最后的四个字符串; for (int j = 0; j < 3; j++) { int index = i * 4 + j; if ((char) value[index + 1] != '=') { if (j == 0) { byte b = (byte) ((char2Index((char) value[index]) << 2) + (char2Index((char) value[index + 1]) >> 4)); sb.append((char) b); } else if (j == 1) { byte b = (byte) ((char2Index((char) value[index]) << 4) + (char2Index((char) value[index + 1]) >> 2)); sb.append((char) b); } else if (j == 2) { byte b = (byte) ((char2Index((char) value[index]) << 6) + (char2Index((char) value[index + 1]))); sb.append((char) b); } } else { break; } } return sb.toString(); } /** * 将码表中的字符映射到索引值; * * @param ch * @return */ public static int char2Index(char ch) { if (ch >= 'A' && ch <= 'Z') { return ch - 'A'; } else if (ch >= 'a' && ch <= 'z') { return 26 + ch - 'a'; } else if (ch >= '0' && ch <= '9') { return 52 + ch - '0'; } else if (ch == '+') { return 62; } else if (ch == '/') { return 63; } return 0; } }