zoukankan      html  css  js  c++  java
  • 《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位,

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

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

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

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

    This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
  • 相关阅读:
    pytorch获取模型某一层参数名及参数值方式
    PyTorch源码解读之torchvision.models
    torch.nn.Conv2d()函数详解
    UCF101
    ipynb格式转换
    linux下的压缩与解压缩
    tomcat 部署的项目图片名字带中文
    恢复oracle误删除数据
    项目中遇到的分布式高并发情况及解决方案
    poi 导出复杂表头 execl
  • 原文地址:https://www.cnblogs.com/jssj/p/11985651.html
Copyright © 2011-2022 走看看