《Java知识应用》Java加密方式(Base64)详解

1. 说明

Base64加密方式:比较简单,加密快,对普通大众可以起到加密的作用。在程序员眼中和透明一样。

Base64应用场景:图片转码(应用于邮件,img标签,http加密)

2. 案例

import java.util.Base64;

/**
 * Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码
 * 跟操作系统无关,因为我是64位系统。其实你打印的是 int 类型的, 1个int 4个字节 所以32位。
 * GBK采用双字节8位表示,总体编码范围为 8140 -- FEFE,首字节在 81 -- FE 之间,尾字节在 40 -- FE 之间。
 * ASCII是7位编码,只使用前7位,第8位补0,所以转换成整数始终为正数,而GBK是8位编码,也就是说一个字节中的第8位可以为1,如1010 1101,而将其转换成byte类型时,byte值为10101101,以补码存储,第8位被当成符号位,当然是负数了,值为:-83。
 * “何”字的GBK编码是:BA CE(1011 1010 1100 1110),两个字节第8位都为1,对byte类型来说,都被理解为最高位符号位。这样值就变成-70和-50了。
 */
public class MyBase64 {
    public static void main(String[] args) {
        try {
            Base64.Decoder decoder = Base64.getDecoder();
            Base64.Encoder encoder = Base64.getEncoder();
            String text = "通";
            byte[] textByte = text.getBytes("GBK");
            //编码
            String encodedText = encoder.encodeToString(textByte);
            System.out.println(encodedText);
            //解码
            System.out.println(new String(decoder.decode(encodedText), "GBK"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

3. 分析原理

码表:Java中的源码(外加一个“=” 组成)。

/**
 * This array is a lookup table that translates 6-bit positive integer
 * index values into their "Base64 Alphabet" equivalents as specified
 * in "Table 1: The Base64 Alphabet" of RFC 2045 (and RFC 4648).
 */
private static final char[] toBase64 = {
    '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', '+', '/'
};

以“通”字为例:

通在GBK编码下的字节码为:1100110110101000。按照每六位重新划分,然后根据6位二进制转换成10进制。最后去码表找对应的值即可。特别说明:Base64,一定是4*n位,

不够的使用“=”代替。 如下表格。

扫描二维码关注公众号,回复: 8085119 查看本文章

根据上图可以很清楚的看懂过程。

查看源码也可以比较简单的看懂加密和解密的过程。

参考:https://blog.csdn.net/u013068377/article/details/78921720

猜你喜欢

转载自www.cnblogs.com/jssj/p/11985651.html