基于灰度图像的文本Base64加密与解密实现

在日常开发中,我们常需要对文本进行编码转换或加密处理。本文将介绍一种基于灰度图像的文本Base64加密与解密实现方案。该方案将文本转换为灰度图像,每个像素对应一个字符的ASCII值,再通过Base64编码生成密文。

实现代码

以下是完整的Python实现代码,包含两个核心函数:encrypt_text_to_base64(加密)和decrypt_base64_to_text(解密)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import base64
import io
import math
from PIL import Image

def calculate_dimensions(data_length):
"""
计算接近正方形的宽和高,使得宽度 × 高度 ≥ 数据长度
:param data_length: 数据总长度(包括4字节的长度信息)
:return: 元组 (宽度, 高度)
"""
if data_length == 0:
return (1, 1)
sqrt_len = math.sqrt(data_length)
width = math.ceil(sqrt_len)
height = math.ceil(data_length / width)
return (width, height)

def encrypt_text_to_base64(text):
"""
将文本加密为Base64字符串,生成接近正方形的图像
:param text: 原始文本
:return: Base64编码的密文
"""
# 将文本转换为UTF-8编码的字节数据
byte_data = text.encode('utf-8')
L = len(byte_data)

# 将长度信息编码为4字节的大端序数据
length_bytes = L.to_bytes(4, byteorder='big')
new_byte_data = length_bytes + byte_data
data_length = len(new_byte_data) # 4 + L

# 计算接近正方形的图像尺寸
width, height = calculate_dimensions(data_length)
total_pixels = width * height

# 填充数据至总像素数(填充0)
padding = total_pixels - data_length
padded_data = new_byte_data + bytes([0] * padding)

# 创建灰度图像并填充数据
img = Image.new('L', (width, height))
img.putdata(list(padded_data))

# 将图像保存到内存中的字节流
img_byte_stream = io.BytesIO()
img.save(img_byte_stream, format='PNG')

# 生成Base64编码的字符串
base64_str = base64.b64encode(img_byte_stream.getvalue()).decode('utf-8')
return base64_str

def decrypt_base64_to_text(base64_str):
"""
将Base64字符串解密为原始文本
:param base64_str: Base64编码的密文
:return: 解密后的原始文本
"""
# 将Base64字符串解码为字节数据
img_data = base64.b64decode(base64_str)

# 从字节数据加载图像并确保为灰度模式
img = Image.open(io.BytesIO(img_data)).convert('L')

# 提取所有像素数据并转换为字节
byte_data = bytes(img.getdata())

if len(byte_data) < 4:
raise ValueError("Invalid image data: too short")

# 提取前4字节作为原始数据长度
L = int.from_bytes(byte_data[:4], byteorder='big')

if len(byte_data) < 4 + L:
raise ValueError("Image data is corrupted, not enough bytes")

# 提取原始数据并解码
original_bytes = byte_data[4:4 + L]
text = original_bytes.decode('utf-8')
return text

# 示例测试
if __name__ == "__main__":
# 加密测试
original_text = "Hello,世界!"
print("原始文本:", original_text)

base64_cipher = encrypt_text_to_base64(original_text)
print("\nBase64密文:", base64_cipher)

# 解密测试
decrypted_text = decrypt_base64_to_text(base64_cipher)
print("\n解密后文本:", decrypted_text)

实现说明

1. 加密过程 (encrypt_text_to_base64)

  • 文本转字节:将输入文本转换为UTF-8编码的字节数据。
  • 灰度图像生成
    • 创建一个宽度等于字节长度、高度为1的灰度图像。
    • 每个像素值对应一个字节的ASCII值。
  • 图像保存
    • 将图像保存为PNG格式的字节流,避免文件系统操作。
  • Base64编码
    • 将字节流转换为Base64字符串作为密文。

2. 解密过程 (decrypt_base64_to_text)

  • Base64解码:将Base64字符串解码为图像字节数据。
  • 图像加载:从字节数据加载图像并强制转换为灰度模式。
  • 像素提取:提取像素值并直接转换为原始字节数据。
  • 文本解码:将字节数据解码为UTF-8文本。

3. 关键特性

  • 无损转换:PNG的无损压缩确保像素值在保存/加载过程中不会改变。
  • 多语言支持:通过UTF-8编码支持中文、Emoji等字符。
  • 紧凑性:灰度图像+PNG压缩使得Base64密文长度相对合理。

示例输出

运行上述代码的测试部分,输出如下:

1
2
3
4
5
原始文本: Hello,世界!

Base64密文: iVBORw0KGgoAAAANSUhEUgAAAA8AAAAECAIAAABv0vmDAAAAWElEQVR4nGNgGAWjYBSMglEwCkYBIwMZwMhIgeQoGAWjYBSMglEwCkYBIwM5YFSaUTAKRsEoGAWjYBSMglHASJ70KBgFo2AUjIJRMApGwSgYBQwA5P4C5Y7Wx1AAAAAASUVORK5CYII=

解密后文本: Hello,世界!

注意事项

  1. 依赖库
    • 需安装Pillow库,可通过pip install Pillow安装。
  2. 大文本处理
    • 极长的文本会导致生成的图像宽度过大,某些系统可能限制图像尺寸(但现代库通常支持超大尺寸)。
  3. 安全性
    • 此方法仅为编码转换,不具备加密安全性。若需真正的加密,需结合AES等算法。

总结

本文介绍了一种基于灰度图像的文本Base64加密与解密实现方案。通过将文本转换为灰度图像并利用Base64编码,我们实现了一种简单但有趣的文本加密方法。虽然该方法不适用于高安全性场景,但在某些特定需求下(如数据隐藏、无损传输)可能具有实用价值。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2023-2025 John Doe
  • Visitors: | Views:

请我喝杯茶吧~

支付宝
微信