密码学 - 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 编码代码将给出以下输出:

Base64 Output

编码 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 算法通常用于在数据库中存储密码。主要的缺点是每个解码后的单词都可以通过任何在线工具轻松编码,入侵者可以轻松获取信息。

广告