Base16,Base32,Base64编码详细学习
Base编码 ¶
Base16编码 ¶
Base16编码表格 ¶
Base16字符表:0123456789ABCDEF
下标 | 编码值 | 下标 | 编码值 |
---|---|---|---|
0 | 0 | 8 | 8 |
1 | 1 | 9 | 9 |
2 | 2 | 10 | A |
3 | 3 | 11 | B |
4 | 4 | 12 | C |
5 | 5 | 13 | D |
6 | 6 | 14 | E |
7 | 7 | 15 | F |
Base16编码方式 ¶
- 将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数
- 然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数。
- 根据十进制数值找到Base16编码表里面对应的字符
base16是4个比特位表示一个字符,原码是1个字节(8个比特位)表示一个字符,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符。数据量是原先的2倍。
也就是LOVE
加密后是4C4F5645
Base16伪代码|实际环境 ¶
@TODO
Base32编码 ¶
Base32编码表格 ¶
Base32字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
Base32编码方式 ¶
- 将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数
- 然后将所有的二进制全部串起来,5个二进制位为一组,若不足5位则低位补0,转化成对应十进制数。
- 若不足40位,则补
=
一个=
相当于5位,补满40位为止。
例:
最后01不足5位,低位补全0。补为01000
,也就是8
然后这才35位,需要末尾补一个=
所以LOVE
用Base32编码后得到JRHVMRI=
base32 结尾可能会有 =
号,但最多有 6 个
Base32伪代码|实际环境 ¶
1 | v3 = 0; |
Base64编码 ¶
Base64编码表格 ¶
使用了ASCII编码中64个可打印的字符(大写字母A ~ Z,小写字母a ~ z,数字0~9以及"+“,”/")
Base64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Base64编码方式 ¶
-
将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数
-
然后将所有的二进制全部串起来,6个二进制位为一组,若不足6位则低位补0,转化成对应十进制数。
-
若不足24位,则补
=
一个=
相当于6个二进制位。
例:
最后只有4位,低位补全0,则为111100
然后3*6=18 不足24位,加上一个=
LO
加密后是TE8=
base64 结尾可能会有 =
号,但最多有 2 个
Base64伪代码|实际环境 ¶
当函数头是这种时候,大概率是Base64加密,然后根据字符集来确认
Base64url 编码 ¶
字符表中的 +
→ -
, /
→ _
总结 ¶
名称 | 下标数字的位个数 | 编码表字符串 | 位数不足是否会补全= | 编码后数据量变化 |
---|---|---|---|---|
base16 | 4 | 数字0~ 9和字母A~F | 不会,位数刚好是4的倍数 | 由一个8位表示一个字符 变成 4位表示一个字符,数据量变为原来的2倍 |
base32 | 5 | 大写字母A~ Z 和 数字2~7 | 会 | 变为 8/5 倍 |
base64 | 6 | 大写字母A~ Z,小写字母a~ z,数字0~9以及"+“,”/" | 会 | 变为 8/6=4/3 倍 |
Base加解密|Python实现 ¶
Base16加解密实现 ¶
Base16加解密(原始字符表) ¶
1 | import base64 |
输出结果为
关键代码:
1 | base64.b16encode(<'bytes'>) #base16编码 |
可以知道,在python3.7中
base64.b16encode(X) 其中需要加密的类型为’bytes’
(其中16可自行替换为16 32 64)
同时,加密后的类型也为’bytes’类型
所以加密的时候需要将 str 类型先转换为 bytes 类型:
例如:origin是一个 str 类型,则origin.encode('utf-8')
则为 bytes 类型
而将 bytes 类型先转换为 str 类型:
代码:str(origin,'utf-8')
其中origin是需要转换的 bytes 类型数据
Base16加解密(自定义字符表) ¶
Base16的原始字符表为:0123456789ABCDEF
倘若我们替换成abcdef0123456789
用到两个方法
1 | str.maketrans(intab, outtab) //用于创建字符映射的转换表 |
实例
1 | intab = "like" |
输出
加解密实例
1 | import base64 |
输出
1 | 1109ca1e0b03ca080b08ca060fcbcb |
Base32加解密实现 ¶
同Base16加解密,将b16改为b32即可
Base64加解密实现 ¶
同Base16加解密,将b16改为b64即可