Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python Base64模块的使用

Python Base64模块的使用

作者头像
Python碎片公众号
发布于 2021-02-26 07:13:40
发布于 2021-02-26 07:13:40
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

一、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
代码运行次数:0
运行
AI代码解释
复制
# 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
# 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
代码运行次数:0
运行
AI代码解释
复制
UVWXYZ!#$%&()*+,-./
VVZXWFlaISMkJSYoKSorLC0uLw==
 
UVWXYZ!#$%&()*+,-./

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 标准类库-因特网数据处理之Base64数据编码
该模块提供将二进制数据编码为可打印ASCII字符并将这种编码解码回二进制数据的功能。它为RFC 3548中指定的编码提供编码和解码功能。定义了Base16、Base32和Base64算法,以及事实上的标准Ascii85和Base85编码。
授客
2023/05/29
5460
【Python系列】 Base64 编码:使用`base64`模块
在计算机编程中,Base64 编码是一种常用的编码方法,用于将二进制数据转换为 ASCII 字符串。这种编码方式广泛应用于数据传输和存储,特别是在需要在文本格式中处理二进制数据的场景中。Python 提供了一个内置的base64模块,使得将bytes对象转换为 Base64 编码的字符串变得非常简单。
kwan的解忧杂货铺
2024/11/26
5080
python base64 加密模块
前言 在之前的文章,分享过hashlib,这次看下另外一个加密 模块--base64
雷子
2024/01/14
3321
python base64 加密模块
python模块之base64
base64模块提供了在二进制数据和可打印ASCII字符间编解码的功能,包括RFC3548中定义的Base16, Base32, Base64, Ascii85, Base85等编码。
py3study
2020/01/06
8960
Python标准库base64用法简介
base64模块提供了大量函数用来把二进制数据编码为可打印的ASCII字符,以及将其解码为二进制数据。提供了RFC3548中Base16、Base32、Base64以及事实标准Ascii85和Base85编码与解码算法的实现。 RFC3548编码规则适合对二进制数据进行编码以使其可以通过email安全传输,作为URL的一部分,或者包含在HTTP POST请求中,编码算法与uuencode程序并不一样。该模块提供了两个接口,支持将字节串对象编码为ASCII字节,以及进行相反的解码,支持RFC3548中定义的全
Python小屋屋主
2018/04/17
7.3K1
Python之Base64加解密
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。
Wu_Candy
2022/07/04
1.7K0
Python之Base64加解密
Android 逆向 | 不是加密的 Base64
Base 系列还有 16/32/62/64/85/36/58/91/92 等,分别表示用不同个数的可打印字符表示二进制数据
咸鱼学Python
2020/12/02
1.1K0
Android 逆向 | 不是加密的 Base64
Python Python中的加密工具
Python中的加密工具 hashlib模块介绍 难破解 不可逆 hashlib模块中的常用方法 函数名 参数 介绍 举例 返回值 md5 byte Md5算法加密 hashlib.md5(b'hello') Hash对象 sha1 byte Sha1算法加密 hashlib.sha1(b'hello') Hash对象 sha256 byte Sha256算法加密 hashlib.sha256(b'hello') Hash对象 sha512 byte Sha512算法加密 hashlib.sha512(b'
Zkeq
2022/05/18
7330
原生JS实现base64解码与编码
base64是用规定的64种字符来表示任意二进制数据的一种编码格式,而且这64种字符均是可见字符,而之所以要是可见的是因为在不同设备上处理不可见字符时可能发生错误。通常,电子邮件数据、公钥证书会经常使用。
IMWeb前端团队
2019/12/03
12.1K1
Python 编程 | 连载 21 -序列化与加密模块
Python中 number、str、list、tuple、dict 都可以进行序列化,其中字典是最常进行序列化的数据结构,注意集合 set 是不能进行序列化的。
RiemannHypothesis
2022/09/26
4050
Python 编程 | 连载 21 -序列化与加密模块
Base64笔记
昨天的《MIME笔记》中提到,MIME主要使用两种编码转换方式----Quoted-printable和Base64----将8位的非英语字符转化为7位的ASCII字符。
ruanyf
2018/09/10
9300
实战案例浅析JS加密 - DES与Base64
本篇旨在简单总结JS与Python加密的一些例子,文中演示的案例也是面向新手,如果有大佬很碰巧看到这篇文章,欢迎加我交流,咸鱼愿意付费学习。
咸鱼学Python
2019/06/03
3.7K0
实战案例浅析JS加密 - DES与Base64
Python3内置模块之base64编解码方法小结
Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来表示二进制数据的方法。可查看 RFC2045 ~ RFC2049,上面有 MIME 的详细规范。Base64 编码是从二进制到字符的过程,可用于在 HTTP 环境下传递较长的标识信息。比如使二进制数据可以作为电子邮件的内容正确地发送,用作 URL 的一部分,或者作为 HTTP POST 请求的一部分. 即 base64 其实不能归属密码领域,作用也不是用于加密,它是一种编码算法,但是具有不可读性,所以可以说是防君子不防小人。
一墨编程学习
2019/06/15
1.8K0
Base64原理以及隐写术
之前在我的印象中, Base64 很常见,很多地方都会听到这个名词,在 ctf 比赛中更是常见,因此,有必要搞懂它的原理。在维基百科中是这么介绍的,Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 2 ^ 6 = 64,所以每 6 个 bit 为一个单元,对应某个可打印字符。3 个字节有 24 个 bit ,对应于 4 个 Base64 单元,即 3 个字节可由 4 个可打印字符来表示
棒棒鸡不棒
2022/09/01
1.8K0
Base64原理以及隐写术
Python3读写base64格式base64使用场景
base64转换过程 这几天写web,需要将用户上传的图片,实时显示到前端页面,然后通过Jcrop裁剪,并将裁剪后的图片通过canvas实时显示到前端,最后将canvas显示的图片装换为ba
zhaoolee
2018/04/19
4.6K1
Python3读写base64格式base64使用场景
关于Base64隐写那点事儿
咕咕咕的我又回来了,学校这几天在放“五一七天小长假”,加上今天的ISCC有点奇奇怪怪,所以来更一篇博客吧!今天我们来讲关于base64隐写那点事儿……
L1near
2022/11/11
1.6K0
关于Base64隐写那点事儿
python3下常用编解码与加解密
Python3相对于Python2的一大改变就是,对默认字符类型进行了修改。Python2中定义字符串默认为二进制字符串,强制加前缀u的才是unicode字符串;而Python3中字符串默认为unicode,强制加前缀b的才是二进制字符串。(也就是刚好反过来了)
上帝De助手
2019/09/18
1.6K0
通过小实例讲解 base64 原理
**字符串转base64的转码规则:第一步,将每三个字节作为一组,一共是24个二进制位。第二步,将这24个二进制位分为四组,每个组有6个二进制位。第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。第四步,根据上表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
wade
2021/05/28
9390
通过小实例讲解 base64 原理
为啥要 base64 编码?
在项目中,对报文进行压缩、加密后,最后一步一般是 base64 编码。因为 base64 编码的字符串更适合不同平台,不同语言的传输。
王小明_HIT
2021/05/20
1.9K0
生成图片的base64编码(纯C语言实现)
Base64编码是一种广泛使用的编码方案,将任意二进制数据转换为可打印的ASCII字符字符串。这种编码方式之所以重要,是因为许多通信协议和存储介质对数据的可传输性和可存储性有特定的要求,它们可能无法直接处理或有效传输二进制数据。Base64编码通过使用64个字符的标准字符集——包括大写字母A-Z、小写字母a-z、数字0-9以及符号“+”和“/”,来表示二进制数据中的每一个6位组。为了标识编码的结束,Base64还使用了=作为填充字符。
DS小龙哥
2025/05/27
2210
生成图片的base64编码(纯C语言实现)
相关推荐
Python 标准类库-因特网数据处理之Base64数据编码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验