一、原理
https://editor.csdn.net/md/?articleId=115447561
请先阅读上面的一篇博客,了解图像像素。
如果有bit_xor(a,b) = c
则有bit_xor(c,a) = b, bit_xor(c,b) = a
具体如下图:
以一张灰度图为例子,每个像素点都是一个字节8位,是由8个0、1组成的二进制数A,取一个自定义的像素点B,将这个自定义像素点B与灰度图的一个像素点A进行按位异或运算得到一个新的像素点C,则bit_xor(C,B) = A。若将一张与灰度图像素点数量相等的自定义图片与灰度图按位异或则可以得到另一付图片,这付图片与自定义图片按位异或则可以得到原来的灰度图。
于是,这里将灰度图理解为明文,自定义图像理解为密匙,两者按位异或得到的图片为密文,密匙与密文按位异或可以得到明文。
以灰度图为例子:
'''
bit_xor(a,b) = c
bit_xor(c,a) = b
bit_xor(c,b) = a
从而实现图像加密和解密
'''
import cv2
import numpy as np
mingwen = cv2.imread("yaoguai_1.jpg",0) #明文
cv2.imshow("mingwen",mingwen)
row , column = mingwen.shape
mishi = np.random.randint(0,255,(row,column),dtype= np.uint8)#密匙
print(mishi)
cv2.imshow("mishi",mishi)
miwen = cv2.bitwise_xor(mingwen,mishi) #密文,bitwise_xor按位异或
print(miwen)
cv2.imshow("miwen",miwen)
mingwen_1 = cv2.bitwise_xor(mishi,miwen)#解密明文
cv2.imshow("mingwen_1",mingwen)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
第一张是明文,第二张是密匙,第三张是密文,第四张是解密后的明文
于是,当我们想与他人发送带有私密信息的图片时,可以事先约定一张密匙,双方可以通过密文通信,以此保证信息不会被第三方获取,另外,由于要保证双方的密文与密匙大小一致,所以一般可以通过手机的拍照保证密文与密匙大小一致
这里贴出彩色图的加密与解密
'''
bit_xor(a,b) = c
bit_xor(c,a) = b
bit_xor(c,b) = a
从而实现图像加密和解密
'''
import cv2
import numpy as np
mingwen = cv2.imread("yaoguai_1.jpg") #明文
cv2.imshow("mingwen",mingwen)
row , column, dimension = mingwen.shape
mishi = np.random.randint(0,255,(row,column,dimension),dtype= np.uint8)#密匙
print(mishi)
cv2.imshow("mishi",mishi)
miwen = cv2.bitwise_xor(mingwen,mishi) #密文,bitwise_xor按位异或
print(miwen)
cv2.imshow("miwen",miwen)
mingwen_1 = cv2.bitwise_xor(mishi,miwen)#解密明文
cv2.imshow("mingwen_1",mingwen)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果: