python图像加密
机器学习入坑者 人气:0下面展示了图像的加密和解密过程(左边是输入图像,中间是加密后的结果,右边是解密后的图像):
1、加密算法要求
- (1)加密算法必须是可逆的,拥有配套的解密算法
- (2)必须是安全的,拦截者不能轻易的破解加密方式
- (3)不能造成数据量剧增,比如一个1kb的图像加密后变为100kb
2、Arnold置乱原理
Arnold
置乱又称为猫脸置乱,据说是因为Arnold首先对猫脸图像应用了这个算法。置乱的含义是置换和打乱,也就是将原始的图片按照我们设计的规则,进行顺序打乱的操作。
所谓的打乱次序指的是对图像进行“坐标变换”,只不过这种变换不是随意的变换,变换需要具有两个硬性要求:
- (1)变换就是加密,那么必须存在对应的逆变换(解密)
- (2)变换能保证图像的像素被彻底打乱,观察者看不出加密后图像包含的信息
为此,Arnold发明了下面的变换方式:
其中x和y表示坐标,new
表示变换以后的坐标,ori表示原始的坐标(original缩写),a和b是两个可选的参数,mod为求余数操作,N是图像的长或者宽,这里只考虑长度和宽度相等的图像,上式表示的就是“图像的坐标变换”。
有了加密变换,还需要使用对应的解密变换,也就是逆变换。逆变换就是“求矩阵的逆”,对2x2的矩阵求逆就能得到下面的逆变换矩阵:
根据加密变换和解密变换,就能设计图像加密算法和解密算法了!
实际上,上面的加密和解密也都是常规的矩阵变换,一点都不难!
3、python实现
根据上一节的加密变换公式可知,有几个参数是必须考虑的,比如:打乱的次数,a和b的取值(我觉得这两个值是随便取的,取不同值加密结果不同),N是图像的长度或者宽度所以不需要指定。
加密函数如下:
def arnold_encode(image, shuffle_times, a, b): """ Arnold shuffle for rgb image Args: image: input original rgb image shuffle_times: how many times to shuffle Returns: Arnold encode image """ # 1:创建新图像 arnold_image = np.zeros(shape=image.shape) # 2:计算N h, w = image.shape[0], image.shape[1] N = h # 或N=w # 3:遍历像素坐标变换 for time in range(shuffle_times): for ori_x in range(h): for ori_y in range(w): # 按照公式坐标变换 new_x = (1*ori_x + b*ori_y)% N new_y = (a*ori_x + (a*b+1)*ori_y) % N arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :] return arnold_image
调用加密函数以后可以得到如下的加密结果:
现在,谁还能看出来加密后的图像(左边是原始图,右边是加密后的图)表达什么?
除非你有下面的解密代码:
def arnold_decode(image, shuffle_times, a, b): """ decode for rgb image that encoded by Arnold Args: image: rgb image encoded by Arnold shuffle_times: how many times to shuffle Returns: decode image """ # 1:创建新图像 decode_image = np.zeros(shape=image.shape) # 2:计算N h, w = image.shape[0], image.shape[1] N = h # 或N=w # 3:遍历像素坐标变换 for time in range(shuffle_times): for ori_x in range(h): for ori_y in range(w): # 按照公式坐标变换 new_x = ((a*b+1)*ori_x + (-b)* ori_y)% N new_y = ((-a)*ori_x + ori_y) % N decode_image[new_x, new_y, :] = image[ori_x, ori_y, :] return decode_image
调用解密代码,就能恢复最右边的“decode”了:
4、结果分析与总结
自己还尝试了不同的a和b的值获得的不同加密效果:
男神镇楼!
(1)a = 1, b = 1:
(2)a=1,b=3:
(3)a=1,b=7:
(4) a=7, b=1:
可以看出:a和b作为控制加密的参数,不同的选择方式可以获得不同的加密效果。
加载全部内容