- 密码学教程
- 密码学 - 首页
- 密码学 - 起源
- 密码学 - 历史
- 密码学 - 原理
- 密码学 - 应用
- 密码学 - 优点与缺点
- 密码学 - 现代密码学
- 密码学 - 传统密码
- 密码学 - 加密的需求
- 密码学 - 双重强度加密
- 密码系统
- 密码系统
- 密码系统 - 组成部分
- 密码系统的攻击
- 密码系统 - 彩虹表攻击
- 密码系统 - 字典攻击
- 密码系统 - 暴力攻击
- 密码系统 - 密码分析技术
- 密码学的类型
- 密码系统 - 类型
- 公钥加密
- 现代对称密钥加密
- 密码学哈希函数
- 密钥管理
- 密码系统 - 密钥生成
- 密码系统 - 密钥存储
- 密码系统 - 密钥分发
- 密码系统 - 密钥撤销
- 分组密码
- 密码系统 - 流密码
- 密码学 - 分组密码
- 密码学 - Feistel分组密码
- 分组密码的工作模式
- 分组密码的工作模式
- 电子密码本 (ECB) 模式
- 密码分组链接 (CBC) 模式
- 密码反馈 (CFB) 模式
- 输出反馈 (OFB) 模式
- 计数器 (CTR) 模式
- 经典密码
- 密码学 - 反向密码
- 密码学 - Caesar 密码
- 密码学 - ROT13 算法
- 密码学 - 转置密码
- 密码学 - 加密转置密码
- 密码学 - 解密转置密码
- 密码学 - 乘法密码
- 密码学 - 仿射密码
- 密码学 - 简单替换密码
- 密码学 - 简单替换密码的加密
- 密码学 - 简单替换密码的解密
- 密码学 - 维吉尼亚密码
- 密码学 - 维吉尼亚密码的实现
- 现代密码
- Base64编码与解码
- 密码学 - XOR 加密
- 替换技术
- 密码学 - 单字母替换密码
- 密码学 - 单字母替换密码的破解
- 密码学 - 多字母替换密码
- 密码学 - Playfair 密码
- 密码学 - Hill 密码
- 多字母替换密码
- 密码学 - 一次性密码本密码
- 一次性密码本密码的实现
- 密码学 - 转置技术
- 密码学 - 栅栏密码
- 密码学 - 列置换密码
- 密码学 -隐写术
- 对称算法
- 密码学 - 数据加密
- 密码学 - 加密算法
- 密码学 - 数据加密标准 (DES)
- 密码学 - 三重 DES
- 密码学 - 双重 DES
- 高级加密标准 (AES)
- 密码学 - AES 结构
- 密码学 - AES 变换函数
- 密码学 - 字节替换变换
- 密码学 - 行移位变换
- 密码学 - 列混淆变换
- 密码学 - 轮密钥加变换
- 密码学 - AES 密钥扩展算法
- 密码学 - Blowfish 算法
- 密码学 - SHA 算法
- 密码学 - RC4 算法
- 密码学 - Camellia 加密算法
- 密码学 - ChaCha20 加密算法
- 密码学 - CAST5 加密算法
- 密码学 - SEED 加密算法
- 密码学 - SM4 加密算法
- IDEA - 国际数据加密算法
- 公钥(非对称)密码算法
- 密码学 - RSA 算法
- 密码学 - RSA 加密
- 密码学 - RSA 解密
- 密码学 - 创建 RSA 密钥
- 密码学 - 破解 RSA 密码
- 密码学 - ECDSA 算法
- 密码学 - DSA 算法
- 密码学 - Diffie-Hellman 算法
- 密码学中的数据完整性
- 密码学中的数据完整性
- 消息认证
- 密码学数字签名
- 公钥基础设施 (PKI)
- 哈希
- MD5(消息摘要算法 5)
- SHA-1(安全哈希算法 1)
- SHA-256(安全哈希算法 256 位)
- SHA-512(安全哈希算法 512 位)
- SHA-3(安全哈希算法 3)
- 哈希密码
- Bcrypt 哈希模块
- 现代密码学
- 量子密码学
- 后量子密码学
- 密码协议
- 密码学 - SSL/TLS 协议
- 密码学 - SSH 协议
- 密码学 - IPsec 协议
- 密码学 - PGP 协议
- 图像和文件加密
- 密码学 - 图像
- 密码学 - 文件
- 隐写术 - 图像
- 文件加密和解密
- 密码学 - 文件加密
- 密码学 - 文件解密
- 物联网中的密码学
- 物联网安全挑战、威胁和攻击
- 物联网安全的密码技术
- 物联网设备的通信协议
- 常用的密码技术
- 自定义构建密码算法(混合密码)
- 云密码学
- 量子密码学
- 密码学中的图像隐写术
- DNA 密码学
- 密码学中的一次性密码 (OTP) 算法
- 区别
- 密码学 - MD5 vs SHA1
- 密码学 - RSA vs DSA
- 密码学 - RSA vs Diffie-Hellman
- 密码学 vs 密码学
- 密码学 - 密码学 vs 密码分析
- 密码学 - 经典 vs 量子
- 密码学 vs 隐写术
- 密码学 vs 加密
- 密码学 vs 网络安全
- 密码学 - 流密码 vs 分组密码
- 密码学 - AES vs DES 密码
- 密码学 - 对称 vs 非对称
- 密码学有用资源
- 密码学 - 快速指南
- 密码学 - 讨论
密码学 - Base64编码与解码
本章将介绍 Python 中 Base64 编码和解码的过程,从基础到高级方法。让我们开始学习 Base64 编码和解码。
借助 Base64 这个有效的工具,我们可以将二进制数据转换为允许安全文本传输的格式。所以基本上 Base64 帮助我们对字节进行编码并将其转换为 ASCII 字符。当你想在仅处理文本的系统中发送或使用数据时,它非常有用。这种编码有助于确保数据在传输过程中保持安全且不变。
Base64 编码的细节
Base64 指的是一组相关的编码技术,这些技术以数字方式对二进制数据进行编码并将其转换为 Base64 表示形式。Base64 这个词来自特定的 MIME 内容传输编码。
设计
用于构成 Base64 所需的 64 个字符的特定字符因实现而异。一般规则是选择一组 64 个字符,这些字符是 1. 大多数编码共享的子集的一部分,以及 2. 可打印的。
这种组合使得数据在通过像电子邮件这样的系统传输时不太可能被修改,而这些系统以前不是 8 位干净的。例如,MIME 的 Base64 实现中的前 62 个值是 A-Z、a-z 和 0-9,最后两个是“+”和“/”。其他版本通常衍生自 Base64,共享此属性,但在用于最后两个值的符号上有所不同;例如,URL 和文件名安全的“RFC 4648 / Base64URL”变体使用“-”和“_”。
Base64 有一组特定的字符:
26 个大写字母
26 个小写字母
10 个数字
加号 (+) 和斜杠 (/) 用于换行
它通常用于各种应用程序中,包括电子邮件附件、通过互联网传输数据以及以简单的文本格式存储复杂数据。
Python 的 Base64 模块
Python 中的 Base64 模块提供使用 Base64 编码技术对数据进行编码和解码的函数。这种编码策略将二进制数据转换为文本格式。
以下是 Base64 重要函数的概述:
Base64 的关键函数
序号 | 函数及描述 |
---|---|
1 | base64.b64encode(s, altchars=None) 此函数使用 Base64 对输入的类似字节的对象 s 进行编码,并返回编码后的字节。要生成 URL 或文件系统安全的 Base64 字符串,可以提供一组备用字符 (altchars) 来替换标准的“+”和“/”字符。 |
2 | base64.b64decode(s, altchars=None, validate=False) 解码 Base64 编码的类似字节的对象或 ASCII 字符串 s,并返回解码后的字节。与 b64encode 函数类似,可以指定一组备用字符 (altchars)。如果输入中存在 Base64 字母表之外的字符,可以启用验证 (validate=True) 来报告错误。 |
3 | base64.standard_b64encode(s) 此函数使用标准 Base64 字母表对输入的类似字节的对象 s 进行编码,并返回编码后的字节。 |
4 | base64.standard_b64decode(s) 此函数使用标准 Base64 字母表对类似字节的对象或 ASCII 字符串 s 进行解码,并返回解码后的字节。 |
5 | base64.urlsafe_b64encode(s) 此函数使用 URL 和文件系统安全的字母表对输入的类似字节的对象 s 进行编码,该字母表用“-”代替“+”,用“_”代替标准 Base64 字母表中的“/”。结果可能仍然包含“=”。 |
6 | base64.urlsafe_b64decode(s) 此函数使用 URL 和文件系统安全的字母表对类似字节的对象或 ASCII 字符串 s 进行解码,并返回解码后的字节。 |
使用 Python 实现
以下是我们在 Python 中进行 Base64 编码和解码的方法:
使用 Base64 进行编码
编码是一种将明文转换为加密形式的方法,以便中间人无法理解它。因此,这里我提供了两种在 Python 中使用 Base64 进行编码的不同方法:
使用 base64.b64encode() 函数
在此代码中,我们将探讨如何使用 Python 的 base64 模块以可在基于文本的系统中传输或存储的格式对数据进行编码。为了对消息进行编码,我们将使用 base64.b64encode() 方法。此函数将数据转换为可在仅处理文本的系统上安全传输的格式。这是一个简单的示例,用于理解 Base64 编码的概念。
以下是使用上述函数进行 Base64 编码的实现:
示例
import base64 def base64_encoding(data): encoded_bytes = base64.b64encode(data) encoded_string = encoded_bytes.decode('utf-8') return encoded_string #our plain text message data = b"Hello, World!" encoded_data = base64_encoding(data) print("Our plain text message:", data) print("Encoded data using b64encode():", encoded_data)
以下是上述示例的输出:
输入/输出
Our plain text message: b'Hello, World!' Encoded data using b64encode(): SGVsbG8sIFdvcmxkIQ==
使用 base64.standard_b64encode() 函数
该代码导入了 base64 模块,该模块包含使用 Base64 编码方法对数据进行编码和解码的函数。该函数使用 base64.standard_b64encode() 方法对输入数据进行编码。此函数使用标准 Base64 字母表将数据转换为 Base64 编码格式。
以下是使用 standard_b64encode() 函数的 Python 实现:
示例
import base64 def base64_encoding(data): encoded_bytes = base64.standard_b64encode(data) encoded_string = encoded_bytes.decode('utf-8') return encoded_string # Our plaintext example data = b"Hello, Tutorialspoint!" encoded_data = base64_encoding(data) print("Our plain text message:", data) print("Encoded data using standard_b64encode() :", encoded_data)
以下是上述示例的输出:
输入/输出
Our plain text message: b'Hello, Tutorialspoint!' Encoded data using standard_b64encode() : SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ==
使用 urlsafe_b64encode()
在本例中,我们将使用 `urlsafe_b64encode()` 方法返回一个适用于 URL 的 Base64 编码文本。当我们需要在 URL 中添加二进制数据(例如路径段或查询字符串)时,这非常有用。
以下是使用上述函数进行 Base64 编码的实现:
示例
import base64 data = b'Hello, Bharat!' encoded_data = base64.urlsafe_b64encode(data) print("Our plaintext message: ", data) print("Encoded data using urlsafe_b64encode(): ", encoded_data)
以下是上述示例的输出:
输入/输出
Our plaintext message: b'Hello, Bharat!' Encoded data using urlsafe_b64encode(): b'SGVsbG8sIEJoYXJhdCE='
Base64 解码
解码是将编码或加密的数据转换回其原始可读格式的过程。
这里有两个 Python 程序,第一个程序将使用 `base64.b64decode()` 函数解码 Base64 编码的字符串,另一个程序将使用 `base64.standard_b64decode()` 函数。
使用 `base64.b64decode()`
该程序实现了相同的结果,但使用了 `base64` 模块中不同的解码函数。它直接使用 `base64.b64decode()` 来解码 Base64 编码的字符串。
以下是使用 `b64decode()` 函数进行简单解码的 Python 实现:
示例
import base64 def base64_decoding(encoded_string): decoded_bytes = base64.b64decode(encoded_string) decoded_string = decoded_bytes.decode('utf-8') return decoded_string # Our ciphertext encoded_data = "SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ==" decoded_data = base64_decoding(encoded_data) print("Our encoded message:", encoded_data) print("Decoded data using b64decode():", decoded_data)
以下是上述示例的输出:
输入/输出
Our encoded message: SGVsbG8sIFR1dG9yaWFsc3BvaW50IQ== Decoded data using b64decode(): Hello, Tutorialspoint!
使用 `base64.standard_b64decode()`
此程序使用 `base64.standard_b64decode()` 函数来解码加密的消息。以下是 Base64 解码的 Python 实现:
示例
import base64 def base64_decoding(encoded_string): decoded_bytes = base64.standard_b64decode(encoded_string) decoded_string = decoded_bytes.decode('utf-8') return decoded_string # our encrypted data encoded_data = "SGVsbG8sIEV2ZXJ5b25lIQ==" decoded_data = base64_decoding(encoded_data) print("Our encoded message:", encoded_data) print("Decoded data using standard_b64decode():", decoded_data)
以下是上述示例的输出:
输入/输出
Our encoded message: SGVsbG8sIEV2ZXJ5b25lIQ== Decoded data using standard_b64decode(): Hello, Everyone!
使用 Base64 处理不同数据类型
在深入研究 Base64 编码时,我们可能会遇到一些需要编码除简单文本消息之外的其他数据类型的情况。因此,我们将了解如何使用 Base64 函数编码图像和 JSON 数据。
编码图像文件
让我们来看一个例子,我们有一个图像文件,我们将把它编码成 Base64。当我们使用 `open()` 函数以二进制模式打开图像文件时,我们将使用 `read()` 方法读取图像文件的内容。然后,我们将使用 `b64encode()` 函数来编码图像文件的二进制数据。输出将是一个 Base64 编码的字节字符串,显示图像数据。
以下是操作方法:
示例
import base64 # Binary data (image) with open('image.jpg', 'rb') as file: binary_data = file.read() # Encode binary data encoded_binary_data = base64.b64encode(binary_data).decode('utf-8') print("Encoded (Image) Binary Data:", encoded_binary_data)
在这个例子中,您可以将图像文件路径替换为您自己的图像文件名和路径。
以下是上述示例的输出:
输入/输出
Base64 编码代码将给出以下输出:
编码 JSON 对象
Base64 的另一个基本用例是编码 JSON 对象。我们将首先定义一个 JSON 对象。然后,我们将使用 `JSON` 模块中的 `dumps()` 函数将 JSON 对象转换为字符串。然后将此字符串转换为字节,并将其传递给 `b64encode()` 函数进行编码。
以下是实现:
示例
import base64 import json # Declare a JSON object here json_obj = { 'name': 'Amit Sharma', 'age': 28, 'city': 'New Delhi' } # change the JSON object to a string json_string = json.dumps(json_obj) # change the string to bytes byte_data = json_string.encode('utf-8') # Encode the bytes encoded_data = base64.b64encode(byte_data) print("Encoded JSON Object: ", encoded_data)
以下是上述示例的输出:
输入/输出
Encoded JSON Object: b'eyJuYW1lIjogIkFtaXQgU2hhcm1hIiwgImFnZSI6IDI4LCAiY2l0eSI6ICJOZXcgRGVsaGkifQ=='
如您所见,Python 中的 Base64 编码非常灵活,可以处理各种数据格式。Python 的 `base64` 模块可以编码文本、图像文件和 JSON 对象。
应用
Base64 编码常用于各种应用程序。它广泛用于加密二进制数据,尤其是在需要通过电子邮件进行通信或用于其他文本字段时。它也用于各种 Web 和互联网协议,以及编码数字签名和证书。
局限性
以下是 Base64 编码的局限性:
Base64 编码通常会将数据大小增加约 33%。这会影响传输和存储效率,尤其对于大型数据集而言。
它基本上不是一种加密形式。它只是将数据转换为不同的格式。因此,敏感信息不会被保密或安全。
Base64 在编码数据的末尾添加填充字符('='),以确保其正确对齐。这可能会使编码数据的解析和处理变得复杂。
它使用一组有限的字符(A-Z、a-z、0-9、'+'、'/')进行编码。当编码数据需要在对某些字符有限制的系统中传输或处理时,这可能会导致问题。
Base64 编码不会压缩数据。它仅用于以文本格式表示二进制数据,而不是用于减小文件大小。
ASCII 和 Base64 的区别
在使用 ASCII 和 Base64 编码数据时,您可以观察到以下区别:
当您使用 ASCII 编码文本时,您从文本字符串开始,将其转换为字节序列。
当您使用 Base64 编码数据时,您从字节序列开始,将其转换为文本字符串。
缺点
Base64 算法通常用于在数据库中存储密码。主要的缺点是每个解码后的单词都可以通过任何在线工具轻松编码,入侵者可以轻松获取信息。