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编码方式

  1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数
  2. 然后将所有的二进制全部串起来,4个二进制位为一组,转化成对应十进制数。
  3. 根据十进制数值找到Base16编码表里面对应的字符

base16是4个比特位表示一个字符,原码是1个字节(8个比特位)表示一个字符,也就是说原先如果使用ASCII编码后的一个字符,现在转化成两个字符。数据量是原先的2倍。
在这里插入图片描述
也就是LOVE加密后是4C4F5645

Base16伪代码|实际环境

@TODO

Base32编码

Base32编码表格

Base32字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
在这里插入图片描述

Base32编码方式

  1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数
  2. 然后将所有的二进制全部串起来,5个二进制位为一组,若不足5位则低位补0,转化成对应十进制数。
  3. 若不足40位,则补=
    一个=相当于5位,补满40位为止。

例:
在这里插入图片描述
最后01不足5位,低位补全0。补为01000,也就是8
然后这才35位,需要末尾补一个=
所以LOVE用Base32编码后得到JRHVMRI=

base32 结尾可能会有 = 号,但最多有 6 个

Base32伪代码|实际环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
v3 = 0;
v4 = 0;
v28 = 0;
v5 = 0;
v25 = 0;
v6 = 0;
if ( v30 )
{
do
{
if ( !*(_BYTE *)(v6 + v2) ) // v2为字符串首地址,v6为0开始遍历
break;
++v6;
v5 += 8;
++v3;
}
while ( v6 < v30 ); // 循环完,v5为将所有字符转换为二进制位、的位数
//
v28 = v3;
}
switch ( v5 % 40 ) // 这里对位数是否能整除40做判断,来判断是否添加'='
// v4等于多少就添加几个'='
{
case 8u:
v4 = 6;
goto LABEL_10;
case 16u:
v4 = 4;
goto LABEL_10;
case 24u:
v4 = 3;
goto LABEL_10;
case 32u:
v4 = 1;
LABEL_10:
v25 = v4;
break;
default:
break;
}
v29 = (8 * v3 + 4) / 5; // 除以5,算一下转换后数据个数
// +4的原因是,向上取整,让余数也算一个数据

Base64编码

Base64编码表格

使用了ASCII编码中64个可打印的字符(大写字母A ~ Z,小写字母a ~ z,数字0~9以及"+“,”/")
Base64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
在这里插入图片描述

Base64编码方式

  1. 将数据(根据ASCII编码,UTF-8编码等)转成对应的二进制数

  2. 然后将所有的二进制全部串起来,6个二进制位为一组,若不足6位则低位补0,转化成对应十进制数。

  3. 若不足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
2
3
4
5
6
7
8
9
10
import base64
original = 'wo tai nan le'
print("1 original: ",type(original),original)
print("2 original.encode('utf-8'): ",type(original.encode('utf-8')),original.encode('utf-8'))
str_encode = base64.b16encode(original.encode('utf-8'))
print("3 str_encode: ",type(str_encode),str_encode)
print("4 str(str_encode,'utf-8'): ",type(str(str_encode,'utf-8')),str(str_encode,'utf-8'))
str_decode = base64.b16decode(str_encode)
print("5 str_decode: ",type(str_decode),str_decode)
print(str(str_decode,'utf-8'))

输出结果为
在这里插入图片描述
关键代码:

1
2
base64.b16encode(<'bytes'>)  #base16编码
base64.b16decode(<'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
2
3
4
5
6
7
8
9
10
11
str.maketrans(intab, outtab)  //用于创建字符映射的转换表
intab -- 字符串中被替代的字符组成的字符串。
outtab -- 用来替换的字符串。
后者替换前者
#第三个参数此处不讨论
此处的str不可改

str.translate(table[, deletechars]) //根据参数table给出的表转换字符串的字符
table -- 翻译表,翻译表是通过maketrans方法转换而来。
deletechars -- 字符串中要过滤的字符列表。#第二个参数此处不讨论
此处的str为需要转换的字符串,自行根据自己字符串取的名称进行更换

实例

1
2
3
4
5
intab = "like"
outtab = "love"
biao = str.maketrans(intab, outtab)
origin = "I like you"
print(origin.translate(biao))

输出
在这里插入图片描述
加解密实例

1
2
3
4
5
6
7
8
9
import base64
origin = 'wo tai nan le!!'
biao1 = str.maketrans("0123456789ABCDEF","abcdef0123456789")
str_encode = base64.b16encode(origin.encode('utf-8'))
encode = str(str_encode,'utf-8').translate(biao1)
print(encode)
biao2 = str.maketrans("abcdef0123456789","0123456789ABCDEF")
str_decode = base64.b16decode(encode.translate(biao2).encode('utf-8'))
print(str(str_decode,'utf-8'))

输出

1
2
1109ca1e0b03ca080b08ca060fcbcb
wo tai nan le!!

Base32加解密实现

同Base16加解密,将b16改为b32即可

Base64加解密实现

同Base16加解密,将b16改为b64即可