平时 base64 的题目也有不少,生活中也是很常见的,但是每次遇到 base64 都是在网上找解码器直接一键解码,从没有去了解过它的具体实现过程,因为这周我们小组的任务要求深入了解 base64,才去真正的了解了 base64
# base64 是什么
base64 是一种从二进制到文本的编码方式,而且编码后的结果只包含 ASCII 基础字符,值得注意的是,base64 并不能算是加密算法,只是一种编码方式,算法什么的都是公开的,所以不能依赖它来进行加密
为什么要叫做 base64 呢?是因为它的输出字符串是由 64 个可打印字符组成的,下面是它的索引表(来源于百度百科)
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
0 | A | 17 | R | 34 | i | 51 | z |
1 | B | 18 | S | 35 | j | 52 | 0 |
2 | C | 19 | T | 36 | k | 53 | 1 |
3 | D | 20 | U | 37 | l | 54 | 2 |
4 | E | 21 | V | 38 | m | 55 | 3 |
5 | F | 22 | W | 39 | n | 56 | 4 |
6 | G | 23 | X | 40 | o | 57 | 5 |
7 | H | 24 | Y | 41 | p | 58 | 6 |
8 | I | 25 | Z | 42 | q | 59 | 7 |
9 | J | 26 | a | 43 | r | 60 | 8 |
10 | K | 27 | b | 44 | s | 61 | 9 |
11 | L | 28 | c | 45 | t | 62 | + |
12 | M | 29 | d | 46 | u | 63 | / |
13 | N | 30 | e | 47 | v | ||
14 | O | 31 | f | 48 | w | ||
15 | P | 32 | g | 49 | x | ||
16 | Q | 33 | h | 50 | y |
其实也就是我们平常在做题过程中可以看见的一个数组”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/“
废话不多说,直接开始了解它的编码过程吧
# 编码过程
# 字符串分组
将待转换的字符串每三个字节分为一组,每个字节占 8bit,一共是 24 个字节
这里我以我名字的首字母大写 TCH 为例,T、C、H 在 ASCII 码表中的位置分别是 84,67,72,而这三个数字的二进制码又分别为 1010100,1000011,1001000,不足八位的就在前面补 0,也就是 01010100,01000011,01001000,那么第一步就完成了
# 二进制码分组
以上我们已经得到了一个 3×8=24 位的二进制码,我们还需要把这 24 位二进制码分为四组 6 位二进制码,也就是 010101,000100,001101,001000,就是从前面开始六位六位的去划分就可以了
# 添 0 得到 4 字节
在这一步我们将以上得到的四组六位二进制码再在他们每组的前面添加两个 0,也就是 00010101,00000100,00001101,00001000,这样就得到了四组八位二进制码,也就得到了四个字节
# 根据索引表得到具体的值
将以上得到的四个二进制数在我们的 base64 索引表中找到具体的值,其中 00010101=21=V,00000100=4=E,00001101=13=N,00001000=8=I
所以,TCH 最终的编码结果就是 VENI
光是文字说明可能不是很形象,这里用一个表格来呈现一下可能会更清晰
这就是总体过程
# 位数不足情况
有时候会有一些特殊情况,因为我举得例子恰好是三个字节,那有时候不足三个字节呢?那该如何处理?其实很简单,如果是两个字节,就一共有 16 个二进制位,还是按照规则进行分组,每六个一组的话,第三组会缺少 2 位,用 0 补齐即可得到三个 base64 编码,第四组完全没有数据的话就用”=“来补上,所以打个比方 “BC” 转换之后就是 “QKM=”
# 注意事项
大多数编码都是由字符串转化成二进制的过程,而 Base64 的编码则是从二进制转换为字符串。与常规恰恰相反, Base64 编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱 Base64 编码来进行加密,在我之前刷题的过程中就有遇到过 base64 换表的题,就是将 base64 索引表的顺序打乱从而形成一个新表,再来进行编码的过程
# 换表情况
在注意事项中有提到换表的情况,其实这个不难理解,我们正常的表是这样的”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/“,我们可以随意的把它换成别的顺序,只要是 64 位就可以了,比如”123456789abcdefghijklmnopqrstuvwxyz+/ABCDEFGHIJKLMNOPQRSTUVWXYZ“,那么从 0 到 63 就是从 1 到 Z 的一个新表,中间的过程是一样的,只是最后索引部分需要从这个新表中进行索引即可,这就是换表的情况,因为之前刷题的时候遇到过所以这里就着重写一下,以后遇到还可以再看看