加密解密基础教程

Base32编码和解码

什么是 Base32 编码?

Base32 是一种数据编码机制,使用 32 个可打印字符(字母 A-Z 和数字 2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。

它主要用来把二进制数据编码成可见的字符串。它的编码规则是:任意给定一个二进制数据,以 5 个位(bit))为一组进行切分(注意:base64 以 6 个位 (bit) 为一组),对切分而成的每个组进行编码得到 1 个可见字符。Base32 编码表字符集中的字符总数为 2 的 5 次方 32 个,这也是 Base32 名字的由来。

Base32 将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足 8 比特高位补 0)串联起来,按照 5 比特一组进行切分,并将每组二进制值转换成十进制来对应 32 个可打印字符中的一个。

由于数据的二进制传输是按照 8 比特一组进行(即一个字节),因此 Base32 按 5 比特切分的二进制数据必须是 40 比特的倍数(5 和 8 的最小公倍数)。

例如输入单字节字符“%”,它对应的二进制值是“100101”,前面补两个 0 变成“00100101”(二进制值不足 8 比特的都要在高位加 0 直到 8 比特),从左侧开始按照5比特切分成两组:“00100”和“101”,后一组不足5比特,则在末尾填充0直到5比特,变成“00100”和“10100”,这两组二进制数分别转换成十进制数,通过上述表格即可找到其对应的可打印字符“E”和“U”,但是这里只用到两组共 10 比特,还差30比特达到 40 比特,按照 5 比特一组还需 6 组,则在末尾填充6个“=”。

填充“=”符号的作用是方便一些程序的标准化运行,大多数情况下不添加也无关紧要,而且,在URL中使用时必须去掉“=”符号。

与 Base64 相比,Base32 具有许多优点:

  • 适合不区分大小写的文件系统,更利于人类口语交流或记忆。

  • 结果可以用作文件名,因为它不包含路径分隔符 “/”等符号。

  • 排除了视觉上容易混淆的字符,因此可以准确的人工录入。例如,RFC4648 符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆。

  • 排除填充符号“=”的结果可以包含在 URL 中,而不编码任何字符。

Base32也比Base16有优势:

  • Base32 比 Base16 占用的空间更小,1000 比特数据 Base32 需要200个字符,而 Base16 则为 250 个字符

Base32的缺点:

  • Base32 比 Base64 多占用大约 20% 的空间。因为 Base32 使用 8 个 ASCII 字符去编码原数据中的 5 个字节数据,而 Base64 是使用 4 个 ASCII 字符去编码原数据中的 3 个字节数据。

Base32 编码演示

下面将以一个具体的例子说明 Base32 的编码过程。这里以 “Easy” 字符串进行编码,详细步骤如下:

第一步:将字符 “Easy” 取 ASCII 码之后,对其转换成二进制字符串。如下:

E   69    01000101
a   97    01100001
s   115   01110011
y   121   01111001

将上面的字符串拼接得到 “01000101 01100001 01110011 01111001” 长度为 32 的字符串。

第二步:以 5 个 bit 为一组对 “Easy” 字符串对应的二进制串进行切分。得到 “01000,10101,10000,10111,00110,11110,01” 7个字节的 “Easy” 二进制串。

01000
10101
10000
10111
00110
11110
01

注意:每组的二进制串不足 5 个用 0 补齐。

第三步:计算第二步分割的每组二进制串所对应的十进制,然后参考标准 Base32 编码表,找出所对应的编码字符,组合成密文。如下:

01000   01000   I
10101   10101   V
10000   10000   Q
10111   10111   X
00110   00110   G
11110   11110   6
01      01000   I

注意,最后一个分组位数不足 4 个的时候,则用字符 “=” 编码填充,最终得到的 Base32 编码如下:

IVQXG6I=

Base32 解码演示

下面将以一个具体的例子说明 Base32 的编码过程。这里以 “Easy” 字符串进行编码后的“IVQXG6I=”为例,详细步骤如下:

第一步:将编码后的字符串“IVQXG6I=”后面的“=”字符去掉,然后转换成对于的二进制字符串。如下:

00001000   I
00010101   V
00010000   Q
00010111   X
00000110   G
00011110   6
00001000   I

第二步:将每个字符转成二进制字符串前面的三个0去掉,因为在 Base32 中只有 5 位是有效的,其他的是填充的。去掉前面三个位后,如下:

01000   I
10101   V
10000   Q
10111   X
00110   G
11110   6
01000   I

第三步:将解析后二进制一次排列成一个二进制字符串,得到如下字符串:

01000101011000010111001101111001000

将得到的二进制字符串按 8 位分割,剩下的位去掉。如下:

01000101    69    E
01100001    97    a
01110011    115    s
01111001    121    y
000                // 去掉

最后,将得到“Easy”字符串。

查看 Base64 类的详细用法,请参考官网 API 文档,地址如下:

http://commons.apache.org/proper/commons-codec/apidocs/index.html


说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号