Python 图像加密解密 - 使用 Lorenz 混沌系统
以下是使用 Python 代码实现图像加密解密的完整程序,该程序利用 Lorenz 混沌系统的特性生成密钥,对图像进行加密和解密操作。
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
import imageio
def lorenz(t, xyz, sigma, rho, beta):
x, y, z = xyz
dxdt = sigma * (y - x)
dydt = x * (rho - z) - y
dzdt = x * y - beta * z
return [dxdt, dydt, dzdt]
# 设定Lorenz模型的参数值
sigma = 10.0
rho = 28.0
beta = 8.0 / 3.0
# 定义Lorenz模型的初始条件
xyz0 = [1.0, 1.0, 1.0]
# 解Lorenz模型的微分方程
sol = solve_ivp(lorenz, [0, 100], xyz0, args=(sigma, rho, beta), dense_output=True)
# 读取待加密的图像
image_path = 'C:/Users/DELL/Desktop/1111/lena.png'
image = imageio.v2.imread(image_path)
# 获取图像的形状
rows, cols, channels = image.shape
# 在时间范围内生成均匀的点
t_eval = np.linspace(0, 100, rows * cols)
# 根据解的结果计算各个时刻的xyz值
xyz = sol.sol(t_eval).T
# 将xyz的范围映射到图像的像素值范围内
xyz_min, xyz_max = np.min(xyz, axis=0), np.max(xyz, axis=0)
xyz_scaled = (xyz - xyz_min) / (xyz_max - xyz_min) * 255
xyz_scaled = xyz_scaled.astype(np.uint8)
# 将xyz_scaled的值作为密钥进行加密,只对图像的RGB通道进行加密
encrypted_image = np.zeros_like(image)
for i in range(channels):
encrypted_image[..., i] = np.take_along_axis(image[..., i], xyz_scaled[:, i % 3].reshape(rows, cols), axis=None)
# 保存加密后的图像
encrypted_image_path = 'C:/Users/DELL/Desktop/1111/lena_encrypted.png'
imageio.v2.imwrite(encrypted_image_path, encrypted_image)
# 读取加密后的图像
encrypted_image = imageio.v2.imread(encrypted_image_path)
# 解密图像,使用相同的密钥
decrypted_image = np.zeros_like(encrypted_image)
for i in range(channels):
decrypted_image[..., i] = np.take_along_axis(encrypted_image[..., i], xyz_scaled[:, i % 3].reshape(rows, cols), axis=None)
# 保存解密后的图像
decrypted_image_path = 'C:/Users/DELL/Desktop/1111/lena_decrypted.png'
imageio.v2.imwrite(decrypted_image_path, decrypted_image)
# 显示加密前和解密后的图像
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].axis('off')
axes[1].imshow(decrypted_image)
axes[1].set_title('Decrypted Image')
axes[1].axis('off')
plt.show()
请确保将image_path变量设置为您的图像文件路径,并在运行程序之前确保已安装numpy、scipy、matplotlib和imageio库。
注意:
- 该代码仅供学习参考,实际应用中可能需要进一步优化和加强安全性。
- Lorenz 混沌系统是一个较为基础的加密方法,安全性有限。
- 在实际应用中,建议使用更强大的加密算法和方法。
如果还有其他问题,请随时向我提问。
原文地址: https://www.cveoy.top/t/topic/6lw 著作权归作者所有。请勿转载和采集!