Java实现Base64加密及解密

Base64介绍:

参考博文:

http://www.cnblogs.com/chengmo/archive/2014/05/18/3735917.html

以欲加密字符串 “AA” 为例:
加密步骤:
  1. 字符串 “AA”
  2. 将每个字符转化为转化为二进制表示: 1000001 1000001 (14位)
  3. 每个字符转化为二进制后不足8位首部补零:01000001 01000001 (16位)
  4. 不为24位的整数倍补零: 01000001 01000001 00000000 (24位)
  5. 每六位为一组: 010000 010100 000100 000000
  6. 转为十进制:16 20 4 0
  7. 将其作为索引取出Base64码表相应的值: Q U E = (若为 0, 使用字符 ‘=’ 填充)
  8. 最终结果为“QUE=”
以欲解密字符串 “QUE=” 为例:
解密步骤:
  1. 解密字符串”QUE=”
  2. 对每个字符找到其在Base64码表的索引:16 20 4 ( ‘=’ 忽略)
  3. 将每个索引转化为二进制: 10000 10100 100 (12位)
  4. 不足6位首部补零:010000 010100 000100 (18位)
  5. 每8位为一组,余下部分舍去: 01000001 01000001 (16位)
  6. 将其转化为十进制:65 65
  7. ASCII对应字符为:A A
  8. 解密字符串为: “AA”

代码实现:

/**
 * @author DengZhiXiang
 * @date 2018/4/24 13:37
 * @description 
 */
public class Base64Custom {

    private static String base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * 将 byte 数组内的每个字符转化为二进制表示
     * 且每个字符占 8 位,不足 8 位用补 '0'
     *
     * @param bytes
     * @return
     */
    private static String translatesToBinary(byte[] bytes) {
        StringBuilder binary = new StringBuilder();
        for (byte b : bytes) {
            StringBuilder byteBinary = new StringBuilder();
            //转为二进制
            while (b > 0) {
                byteBinary.append(b % 2);
                b /= 2;
            }
            //不足 8 位补 '0'
            while (byteBinary.length() < 8) {
                byteBinary.append('0');
            }
            binary.append(byteBinary.reverse());
        }
        //不足 24 位,补 '0'
        while (binary.length() % 24 != 0) {
            binary.append('0');
        }
        return binary.toString();
    }

    /**
     * @param origin      原始字符串
     * @param charsetName 字符集
     * @return 编码后的字符串
     * @throws UnsupportedEncodingException
     */
    public static String encode(String origin, String charsetName) throws Exception {
        StringBuilder result = new StringBuilder();
        String strBinaryBytes = translatesToBinary(origin.getBytes(charsetName));
        for (int i = 0; i <= strBinaryBytes.length() - 6; i += 6) {
            //将每 6 位二进制表示字符串转化为整数
            int temp = Integer.parseInt(strBinaryBytes.substring(i, i + 6), 2);
            if (temp == 0) {
                result.append('=');
            } else {
                result.append(base64Table.charAt(temp));
            }
        }
        return result.toString();
    }

    /**
     * 解码
     *
     * @param base64 加密过的字符串
     * @param charsetName 解码字符集
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String decode(String base64, String charsetName) throws Exception {
        char[] chars = base64.toCharArray();
        StringBuilder builder = new StringBuilder();
        for (char b : chars) {
            if (b != '=') {
                StringBuilder binary = new StringBuilder(Integer.toBinaryString(base64Table.indexOf(b)));
                while (binary.toString().length() != 6) {
                    binary.insert(0, '0');
                }
                builder.append(binary.toString());
            }
        }
        String base64str = builder.toString();
        base64str = base64str.substring(0, base64str.length() - base64str.length() % 8);
        byte[] bytes = new byte[base64str.length() / 8];
        for (int i = 0; i < bytes.length; ++i) {
            bytes[i] = (byte) Integer.parseInt(base64str.substring(i * 8, i * 8 + 8), 2);
        }
        return new String(bytes, charsetName);
    }
}

猜你喜欢

转载自blog.csdn.net/hnust_Dengzhixiang/article/details/80063042
今日推荐