前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Base64模块的使用

Python Base64模块的使用

作者头像
Python碎片公众号
发布2021-02-26 15:13:40
1.2K0
发布2021-02-26 15:13:40
举报
文章被收录于专栏:Python碎片公众号的专栏

一、base64原理简介

base64可以理解为一种加密算法,用64个常见字符来表示8字节的二进制数字。

64个字符: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

base64转换后的结果只会出现这64个字符,这也是base64名字的由来。(由于不同的应用场景,当+或/有特殊含义时,这两个字符被换成了其他字符,那属于base64的变种)。

那64个字符怎么表示8字节的二进制数字呢?

首先,上面的64个字符按顺序分别对应了十进制数字的0到63,可以理解为上面的字符串的索引。

其次,因为一个8位二进制数字转换为十进制后表示的是0到255。所以base64会物理上将3个8位(3*8=24位)的二进制数据连在一起,然后切分成4个6位(4*6=24位)的二进制数据,然后再在这4个6位二进制数据的前面都补两个0,补满8位。这样处理后的二进制数字转换为十进制后表示的是0到63。

这刚好与上面的0到63个字符对应。可以参考下面的图片。

对于需要加密的内容,base64都会先将其转换为8位的二进制数据,然后进行上面的处理。

这样,我们用逆向思维,就已经搞清楚base64的原理了。

另外,base64会在数据的末尾填充等号=。一般来说,对字符串进行base64转换时,字符数量整除3不会补=,余1会补两个==,余2会补一个=。

二、base64对字符串进行转换

代码语言:javascript
复制
# coding=utf-8
import base64
import string
import random
 
 
base_str = string.ascii_letters + string.punctuation
print(base_str)
result_str = ''.join(random.choices(base_str, k=20))
print(result_str)
result = base64.encodebytes(bytes(result_str.encode('utf-8'))).decode('utf-8')
print(result)
result_back = base64.decodebytes(bytes(result.encode('utf-8'))).decode('utf-8')
print(result_back)

运行结果:

代码语言:javascript
复制
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
C{%H/>wHXk:H.Jlf<UBy
Q3slSC8+d0hYazpILkpsZjxVQnk=
 
C{%H/>wHXk:H.Jlf<UBy

上面的代码中,我们从字符中随机选取了20个字符,用encodebytes()方法将字符串转换成了base64字符,然后用decodebytes()方法将base64转换回字符串。

在Python的base64模块中,encodebytes()与decodebytes()互为逆运算,具体用法如上面代码。

如果是在Python2中,random没有choices()方法,encodebytes()和decodebytes() 要分别换成 encodestring()和decodestring()。

代码语言:javascript
复制
# Python2
result_str = 'UVWXYZ!#$%&()*+,-./'
print(result_str)
result = base64.encodestring(bytes(result_str.encode('utf-8'))).decode('utf-8')
print(result)
result_back = base64.decodestring(bytes(result.encode('utf-8'))).decode('utf-8')
print(result_back)

运行结果:

代码语言:javascript
复制
UVWXYZ!#$%&()*+,-./
VVZXWFlaISMkJSYoKSorLC0uLw==
 
UVWXYZ!#$%&()*+,-./

三、base64对文件中的字符串进行转换

代码语言:javascript
复制
base_str = string.ascii_letters + string.punctuation
print(base_str)
result_str = ''.join(random.choices(base_str, k=20))
print(result_str)
with open('base64.txt', 'wb') as f:
    f.write(bytes(result_str.encode('utf-8')))
base64.encode(open('base64.txt', 'rb'), open('base64.b64', 'wb'))
print(open("base64.b64").read())
 
base64.decode(open('base64.b64', 'rb'), open('base64.new', 'wb'))
print(open("base64.new").read())

运行结果:

代码语言:javascript
复制
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
_iPv}x\},*mkn,IYsqD#
X2lQdn14XH0sKm1rbixJWXNxRCM=
 
_iPv}x\},*mkn,IYsqD#

上面的代码中,我们先随机生成了一串字符,写入base64.txt中,然后用base64.encode()方法读取字符,转换成base64字符后写入base64.b64文件中。然后又用base64.decode()方法读取出base64字符,将base64字符转换回原始字符后写入base64.new文件中。

在Python的base64模块中,base64.encode()与base64.decode()互为逆运算。

代码运行后,会在当前目录下生成三个文件,分别是base64.txt, base64.b64, base64.new, 用文本方式打开,base64.txt中的字符串是转换前的字符串, base64.b64中的字符是base64字符串, base64.new中的字符串与base64.txt中一模一样。

四、base64其他方法的使用

代码语言:javascript
复制
base_str = string.ascii_letters + string.punctuation
print(base_str)
result_str = ''.join(random.choices(base_str, k=20))
print(result_str)
result = base64.b64encode(bytes(result_str.encode('utf-8'))).decode('utf-8')
print(result)
result_back = base64.b64decode(bytes(result.encode('utf-8'))).decode('utf-8')
print(result_back)

运行结果:

代码语言:javascript
复制
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
$\kFS:TkXHQkkw[GMl,k
JFxrRlM6VGtYSFFra3dbR01sLGs=
$\kFS:TkXHQkkw[GMl,k

代码还是之前的代码,只是把 encodebytes()和decodebytes() 换成了 b64encode()和b64decode(),效果也是一样的,只是encode时少了一个换行符而已。

除了b64encode()之外,base64模块中还有几对成对的方法,都是从base64延伸出来的。

b32encode()和b32decode()

b16encode()和b16decode()

b85encode()和b85decode()

a85encode()和a85decode()

standard_b64encode()和standard_b64decode()

urlsafe_b64encode()和urlsafe_b64decode()

使用方法与上面的完全一样,直接用方法名换掉上面代码中的的方法名就可以运行。只是转换的原理和转换的结果不同,应用的地方也有区别,比如urlsafe_b64encode是为了避免转换时使用斜杠/,因为url中有斜杠/,会造成混淆,所以改了转换时使用的字符。感兴趣的话可以慢慢研究。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档