base64
一、什么是Base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。
3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
二、python中的base64模块
base64模块实际上调用的是binascii模块
Base64模块真正用得上的方法只有8个,分别是:
encode, decode为一组, 专门用来编码和解码文件的, 也可以对StringIO里的数据做编解码;
encodestring, decodestring为一组,专门用来编码和解码字符串
b64encode, b64decode为一组, 用来编码和解码字符串,并且有一个替换符号字符的功能
因为Base64编码后的字符除了英文字母和数字外还有三个字符’ + / =‘,其中’=‘只是为了补全编码后的字符数为4的整数,而’+‘和’/‘在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什么情况下’+‘和’/'需要被替换,最常见的就是对url进行Base64编码的时候。
urlsafe_b64decode, urlsafe_b64encode为一组,这个就是用来专门对url进行Base64编解码的,实际上也是调用的前一组函数。
base64.b64encode()将bytes类型数据进行base64编码,返回编码后的bytes类型
base64.b64deocde()将base64编码的bytes类型进行解码,返回解码后的bytes类型
decode的作用是将其他编码的字符串转换成unicode编码
encode的作用是将unicode编码转换成其他编码的字符串
三、Base64使用场景
Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
四、base64转换过程
五、代码实现
1. 简单使用
import base64
s = '人生苦短,我学python!'
#加密 ..........................................
b = base64.b64encode(s.encode('utf-8'))
print(b)
#解密
c = base64.b64decode(b).decode('utf-8')
print(c)
运行结果:
2.url使用base64
示例代码:
import base64
url = 'http://www.baidu.com/info'
#加密
b = base64.b64encode(url.encode('utf-8'))
print(b)
#解密
c = base64.b64decode(b).decode('utf-8')
print(c)
运行结果:
3.读写文件
示例代码:
from base64 import b64encode, b64decode
with open(r'./text.txt', 'rb') as f: # 此处不能使用encoding='utf-8', 否则报错
base64_data = b64encode(f.read()) # b64encode是编码
print(base64_data) # 输出生成的base64码,Bytes类型, b'xxxxx'类型的字符串
new_data = b64decode(base64_data)
print(new_data)
运行结果:
5.base64对图片数据进行加密
见博客:python中base64库用法详解_base64 python-CSDN博客
6. base64嵌套加密
见博客:python中base64库用法详解_base64 python-CSDN博客
base58
- Base58编码方式(将冲突项都去掉),在Base64的基础上去掉了比较容易混淆的字符
- Base58中不含Base64中的数字 0 ,大写字母 O ,小写字母 l ,大写字母 I ,以及 “+” 和 “/” 两个字符。
无法用整字节来转换表示Base58,所以开销会比64和16大得多,但是利于展示地址。
辗转相除法解决上述字节编码问题
1、字符1代表0、字符2代表1,字符3代表2…字符z代表57.
2、如果将1234转换为58进制:
(1)、1234除以58,商为21,余数为16,查上表得H
(2)、21除以58,商为0,余数为21,查表得N
(3)、得到base58编码为:NH
(4)、每个字符串转换之前先把转换数前面的0,转成对应的编码1
3、base58输出字节数:
(1)、位数:log2(58)(每一个字母代表的信息量是log2(58))
(2)、输出的字节:(length8)bit
(3)、预留的字符数量:(length8)/log2(58)=length*1.38
编码和解码:
python脚本如下:
def b58encode(tmp: str) -> str:
tmp = list(map(ord, tmp))
temp = tmp[0]
base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
for i in range(len(tmp) - 1):
temp = temp * 256 + tmp[i + 1]
tmp = []
while True:
tmp.insert(0, temp % 58)
temp = temp // 58
if temp == 0:
break
temp = ""
for i in tmp:
temp += base58[i]
return temp
def b58decode(tmp: str) -> str:
import binascii
base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
temp = []
for i in tmp:
temp.append(base58.index(i))
tmp = temp[0]
for i in range(len(temp) - 1):
tmp = tmp * 58 + temp[i + 1]
return binascii.unhexlify(hex(tmp)[2:].encode("utf-8")).decode("UTF-8")
print(b58encode("ABDCDEFGA"))
print(b58decode("D9cS9N9iHjMLTdA8YSMRMp"))