基于混沌Logistic加密算法的图片加密与还原(python)
主要参考【图像加密】图像处理之Logistic混沌序列加密 这篇博客,并将其中的matlab代码改成了python代码。
还原部分是在加密部分的基础上重复一次异或处理,所以只需再次使用加密函数(将图片路径改成加密后的图像)即可。
import cv2 import numpy as np from PIL import Image def logistic(Img, x, u,times): M = Img.shape[0] N = Img.shape[1] for i in range(1, times): x = u * x * (1 - x) array = np.zeros(M * N) array[1] = x for i in range(1, M * N - 1): array[i + 1] = u * array[i] * (1 - array[i]) array = np.array(array * 255, dtype='uint8') code = np.reshape(array, (M, N)) xor = Img ^ code v = xor return v # 0<x<1 x = 0.1 # 3.5699456...<u<=4 u = 4 times = 500 Img = cv2.imread('C:\\Users\\lena.bmp') Img = Img[:, :, [2, 1, 0]] (r, g, b) = cv2.split(Img) R = logistic(r, x, u, times) G = logistic(g, x, u, times) B = logistic(b, x, u, times) merged = np.ones(Img.shape, dtype=np.uint8) merged[:, :, 2] = B merged[:, :, 1] = G merged[:, :, 0] = R Img = Image.fromarray(merged) Img.save('C:\\Users\\lena0.bmp')
RGB各通道可以分别选用不同的参数,增大破解难度。
结果示例:
原图(512*512 .bmp格式)
加密后
灰度图加密后
在对灰度图像进行同样的处理后,不难发现RGB图像经加密处理后多多少少还是能看到一点原图像的轮廓,在做数字水印处理时推荐使用灰度图像。