写在前面
最近混沌理论的课程要求俩人一组进行图像的加密和解密,即一个人来对一张图像进行加密,另一个人对加密后的图像进行解密。🥗🥗🥗对图像加密的方式有很多种,很自然的想法就是在图像中加入一些随机的噪点,让原始图像变得不清晰。当然方法太多太多,感兴趣的小伙伴可以在评论区说说你的想法喔🍐🍐🍐
先来说一下这节我的思路【我也是才学,加密方式不好勿喷👰👰👰】对于加密:我主要采用的是对一张图像的三个通道分别进行加密,具体加密方式是通过生成随机矩阵来和不同通道的图像进行异或运算。对于解密:解密者需要得到加密后的图像和生成的随机矩阵方可解密。下面直接看代码:
首先是导入一些必要的库及定义了一个画图的函数【这样方便后面画图啦】
import cv2 #opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows()
加密
img = cv2.imread('Lenna.png') cv_show('img',img) # 颜色通道获取 b,g,r=cv2.split(img) Rand = np.random.randint(0, 256, size=(3,256, 256), dtype=np.uint8) np.save("Rand.npy", Rand) #将Rand数组存储下来 # 分别对3个通道进行异或 b_rand = cv2.bitwise_xor(b, Rand[0]) g_rand = cv2.bitwise_xor(g, Rand[1]) r_rand = cv2.bitwise_xor(r, Rand[2]) img_encryption = cv2.merge((b_rand,g_rand,r_rand)) cv_show('img_encryption',img_encryption) cv2.imwrite('img_encryption.png',img_encryption) #保存加密图像
输出结果:
解密
Rand1 = np.load("Rand.npy") #将Rand数组读取出来 img_encryption = cv2.imread('img_encryption.png') #读取加密图像 b_rand,g_rand,r_rand=cv2.split(img_encryption) b_rec = cv2.bitwise_xor(b_rand, Rand1[0]) g_rec = cv2.bitwise_xor(g_rand, Rand1[1]) r_rec = cv2.bitwise_xor(r_rand, Rand1[2]) img_decode = cv2.merge((b_rec,g_rec,r_rec)) cv_show('img_decode',img_decode)
输出结果:
思考
我们这里可以进行一些思考,即是否可以采用其他的一些加密方式,这里提供我的一些思路【随便想的,不一定保证正确】:
- 不采用随机矩阵进行异或,而是让图片自身进行异或,这样的好处是解密时不需要提供随机矩阵,而是仅仅提供一张加密后图片即可进行解密,坏处也很明显,那就是不安全。
- 能否改变图片的通道顺序对其加密
- 对一张图像进行卷积进行加密,然后利用反卷积解密
感兴趣的大家可以一些来思考,把灵感留在评论区,万分感谢🙏🙏🙏