Base64的编码实现原理攻略

Base64的编码原理

更多可查看 点击这里了

本文将实现:

  • 简述 ASCII码字符编码的Base64 编码实现原理
  • 简述 非ASCII码字符编码的Base64 编码实现原理

加密分析系列文章:

  • Base64 编码实现原理(就是本文了)
  • Url Base64 编码算法实现原理(正在发文中)
  • MD5 算法系列实现原理 (正在发文中)
  • SHA 算法系列实现原理(正在发文中)
  • MAC 算法系列实现原理(正在发文中)
  • 对称加密 DES (正在发文中)
  • 对称加密 AES(正在发文中)
  • 基于口令加密 PBE(正在发文中)
  • 非对称加密 DH(正在发文中)
  • 非对称加密 RSA(正在发文中)

1 简述

  • Base64算法有编码和解码操作,可充当加密和解密的操作,还有一张字符映射表充当了密钥。
  • Base64算法公开,这与 柯克霍夫原则并无违背,但充当密钥的字符映射表公开,直接违反了 柯克霍夫原则
密码学上的柯克霍夫原则(Kerckhoffs's principle,也称为柯克霍夫假说、公理、或定律)系由奥古斯特·柯克霍夫在19世纪提出:即使密码系统的任何细节已为人悉知,只要密匙(key,又称密钥或秘钥)未泄漏,它也应是安全的。
复制代码
  • Base64算法不能称为加密算法,但其变换法则遵从了单表置换算法。

2 Base64的索引表

Base64的索引表,我们可以理解为加密密文的构成,密文中的字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符,这是标准的Base64协议规定。在日常使用中我们还会看到“=”或“==”号出现在Base64的编码结果中,“=”在此是作为填充字符出现

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
复制代码

3 编码表

简单点来说,一串明文经过一系列转换后,生成对应十进制数值,然后参照编码表,通过单表置换来通过编码字符来表示密文。

在这里插入图片描述

4 Base64 编码实现过程

通常以字符串使用 Base64 编码(加密),字符串是以字符构成,在编码过程中,以字符为基本单元,如下图中所示:

在这里插入图片描述

编码过程实现
  • 第一步: “M”、“a”、"n" 对应的ASCII码值分别为77,97,110,获取对应的二进制值 01001101、01100001、01101110。如图第二三行所示,由此组成一个24位的二进制字符串。
  • 第二步:对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)如图红色框,将24位每6位二进制位一组分成四组,这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位,
  • 第三步: 对获得的4个6位的二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码 ,添加2位高位0,组成4个8位二进制码,扩展成32个二进制位,此时变为四个字节:00010011、00010110、00000101、00101110。
  • 第四步 将获得的4个8位二进制码转换为十进制码,在上面的数据中,00010011、00010110、00000101、00101110 分别对应的十进制的值为:19、22、5、46。 第五步:用上面获得到的十进制的值(Base64编码索引)在Base64编码表中进行查找,分别对应:T、W、F、u。因此“Man”Base64编码之后就变为:TWFu。
位数不足情况

在这里插入图片描述

5 非 ASCII码字符编码

ASCII 码可以表示十进制范围为 0-127的字符,对应二进制范围是 0000 0000 -0111 1111

ASCII 码包括阿拉伯数字、大小写英文字母和一些控制符,但却没有包含双字节编码的字符,如中文字符,因此有了 GB2312 、GBK、 UTF-8 等编码,GB2312 、GBK用2个字节表示一个汉字,UTF-8用三个字节表示一个汉字。

非 ASCII码字符编码 加密实现过程

我们以字符串 “密” 为例

  • 第一步 获取 字符串 “密” 对应的 utf-8 的编码为 -27,-81,-122
  • 第二步 分别获取上述 utf-8 编码(-27,-81,-122)对应的二进制码:11100101 10101111 10000110
  • 第三步 将上述二进制码分成4组6位 111001 011010 111110 000110
  • 第四步 向6位二进制码添加2位高位0,组成4个8位二进制码,添加2位高位0,00111001 00011010 00111110 00000110
  • 第五步 获取上述二进制码对应的十进制码 57 26 62 6
  • 第六步 在Base64编码表中进行查找,分别对应 5 a + G

字符串 “密” 经过 Base64 编码后得到字符串 "5a+G"

6 分析

在这里 Base64(2的6次幂就是64)将字符转成的8位二进制码以6位为单位进行分组转换 表示字符,因此成为Base64。同理,Base32就是用5位分组,Base16就是用4位分组。

所以 Base32 、Base16编码过程也就一目了然了。

猜你喜欢

转载自juejin.im/post/5dc0b1305188255fd468f599