欢迎加入我们卧虎藏龙的python讨论qq群:729683466
●导 语 ●
总有些东西是你不希望别人看到的
比如
你暗恋的女神的照片
要是被别人发现了
那可就尴尬了
所以
来学一学用python加密图片吧!
代码及相关资源获取
1:关注“python趣味爱好者”公众号,回复“加密图片 ”获取源代码。
效果演示
加密前:
加密后:
往期精选
????
开发工具
python3.6.4,第三方库:PIL
讲解部分
一:凯撒加密
很久以前公众号就发过一篇关于关于python凯撒加密的推文,原理就是凯撒加密,将图片中的每一个像素点按照规律向后移动,这样就可以打破原始的像素点排布规律。就可以让图片变形,如果要解密,就将像素点向前移动。
但根据群里朋友的反映,那个代码加密的效果不太好,也就是说,加密以后的图片还是依稀看的出来轮廓,
下面是以前的加密方法的加密效果:
加密后还是能够辨认出来,这不像是加密,倒像是在原有的照片上行加了一层帷幕。
如果用这个算法去加密你女神的照片,那可就太丢脸了。
二:字典加密解密原理
然后我自创了一个用于图片的加密方法,还没有想好名字,在这里就叫字典加密吧!
原理就非常简单啦!像素点是0--255之间的整数。如果将像素点用一个映射关系处理一下,就可以让像素点得排列完全混乱,比如说,让图片中像素点12对应51.那么图片中所有的值为12的像素点酒全部是51。如果要解密图片,就将加密后的图片中的像素点全部提取出来,然后将其中的51全部变成12,这样就变成了原来的图片。
其实就是用一个字典对应起来。
三:生成密码本
首先要做的就是这样的一个“密码本”,也就是一个字典,将0--255之间所有的数全部对应0-255中的另外一组数字,也就是data对应code。data相当于字典的key,code相当于字典的value。其中不能有重复的值存在,否则字典密码本就不是一一对应的关系了。
如何生成这样一个密码本。只需要用到下面的随机数生成代码:
import random
import numpy as np
after={}
solve_code={}
data=[]
for i in range(0,256):
data.append(i)
for i in range(0,256):
k=random.sample(data, 1)
solve_code[k[0]]=i
after[i]=k[0]
data.remove(k[0])
print(solve_code)
np.save("code.npy",after)
np.save("solve_code.npy",solve_code)
用生成随机数的方法,让0-255之间的数随机对应到0-255之间的其他数,然后存储成npy的加密本和解密本。实际上就是字典。然后把这些字典存储起来,就是一直可以用的密码本了!
四:真实图片加密
如何对下面的图片进行加密。
首先是讲图片读取成矩阵,用到的是python的图片处理库函数,也就是PIL,
from PIL import Image
im = Image.open('./test3.jpeg')
im2 = np.array(im)
用上面的三行代码就可以讲图片转化为numpy格式的矩阵,然后用三层for循环讲矩阵里的数字按照生成的密码加密,用映射关系一一对应。
for i in range(0,size1[0]):
for j in range(0,size1[1]):
for k in range(0,size1[2]):
new_array[i, j, k] =code[im2[i,j,k]]
最后将加密后的矩阵转化为图片,然后存储起来,这样就完成了图片的加密。加密效果如图
im3=Image.fromarray(np.uint8(new_array))
im3.show()
im3.save('flag.jpg')
完整地加密代码如下。解密代码只需要把密码本换成解密的字典即可。
import numpy as np
from PIL import Image
im = Image.open('./test3.jpeg')
im2 = np.array(im)
size1=im2.shape
print(size1)
code=np.load('code.npy',allow_pickle=True).item()
slove_code=np.load('solve_code.npy',allow_pickle=True).item()
#加密图片
print(code)
new_array=np.zeros(size1)
k1=0
print("进入循环")
for i in range(0,size1[0]):
for j in range(0,size1[1]):
for k in range(0,size1[2]):
new_array[i, j, k] =code[im2[i,j,k]]
#显示图片,保存图片
im3=Image.fromarray(np.uint8(new_array))
im3.show()
im3.save('flag.jpg')
作者|齐
编辑|齐
感谢大家观看
有钱的老板可打赏一下小编哦
扫描二维码
关注我们
QQ群:729683466
◰
参考来源
图片来源:pexels
百度图片