原理
这是一种比较广泛的加密方式,但也正因为它比较广泛所以容易被破解
经典的base64规则:
先对原串进行操作:3个字符放到一起(3*8=24个bit位),对这24个bit位分为4组,每组6个bit位,每组的前面再补2个0
例如原串:01001000 01001111 01001010
操作之后:00010010 00000100 00111101 00001010
总的来说长度会增加1/3
而且因为每个字符只有6位可能不为0,所以实际上有26=64种操作结果字符,所以叫base64
为了显示这64种,有如下编码表(仅序号,非真实二进制):
0—25对应A—Z
25—51对应a—z
52—61对应0—9
62对应+
63对应/
在末位,如果凑不够3个字符(24位),则补若干个全0字节
比如单个字母A
,只有8位,就会被补全为:A的ascii,8个0,8个0
分组之后可能有的操作结果是全0,这种的对应=
,这也是base64编码的特点,结尾因为补0有时会产生一个或两个=
例如:
A的ascii是65,所以当单个A转换时:
01000001 00000000 00000000
转换:00010000 00010000 00000000 00000000
发现最后两个都是=
python3的实现
python的标准库提供了base64,只要import base64
即可
比较常用的有
base64.b64encode([bytes])
base64.urlsafe_b64encode([bytes])
第二个和第一个的区别是,因为base64中会产生/
,+
这两种url中会转义的字符,所以在url使用中先将/
,+
转化为下划线与短杠,接收者做相反操作,从而可以在url中安全传输
在python3中,str默认编码是unicode,并不能直接传入bytes,所以在加密前需要先转码(否则报错a bytes-like object is required, not 'str'
)
import base64
a=input()
print(base64.b64encode(a.encode('utf-8')))#先转bytes再加密
这样即可,utf-8的转码将str转为了bytes
输出的结果是b’密文’,说明结果是bytes型的,可以强制转换成str从而去掉b
import base64
a=input()
b=base64.b64encode(a.encode('utf-8'))#b是一个bytes类型
c=str(b,"utf-8")#转换为str
print(c)
解密过程是decode
base64.b64decode([bytes, bytearray, memoryview, str])
base64.urlsafe_b64decode([bytes, bytearray, memoryview, str])
和加密的区别是可以直接填入str类型,所以密文不一定要先转化为bytes
但返回值仍然是bytes
import base64
a=input()
print(base64.b64decode(a))
解密过程