异或运算的基本规则
元素1 | 元素2 | 结果 | 规则 |
0 | 0 | 0 | 0 xor 0 = 0 |
0 | 1 | 1 | 0 xor 1 = 1 |
1 | 0 | 1 | 1 xor 0 = 1 |
1 | 1 | 0 | 1 xor 1 = 0 |
运算数相同,结果为0;运算数不同,结果为1。
任何数(0或1)与数值0异或,结果仍为自身。
任何数(0或1)与数值1异或,结果变为另外一个数。
如何数(0或1)与自身异或,结果为0。
根据上述异或运算规则,对数据a、数据b进行异或运算,可以得到数值c:
a xor b = c
c xor a = (a xor b) xor a = (a xor a) xor b = 0 xor b = b
c xor b = (a xor b) xor b = a xor (b xor b) = a xor 0 = a
因此,当上述a,b,c具有如下关系时:
a: 明文
b: 密钥
c: 密文,通过a xor b实现
可以对上述数据进行如下操作和理解:
加密过程:将明文a与密钥b进行异或,完成加密,得到密文c。
解密过程:将密文c与密钥b进行异或,完成解密,得到明文a。
位运算是针对二进制位进行的运算。按位异或是指将两个数值以二进制形式进行逐位异或运算。
利用按位异或可以实现对像素点的加密。在图像处理中,需要处理的像素点的像素值通常为灰度值,其范围通常为[0,255]。例如,某个像素点的像素值为216(明文),将数值178(该数值由加密者自由选定)作为密钥,让这两个数的二进制形式进行按位异或运算,即可完成加密,得到密文106。当需要解密时,将密文106与密钥178的二进制形式进行按位异或运算,即可得到原始像素点的像素值216(明文)。用bir_xor()表示按位异或,具体过程为
bit_xor(216,178) = 106
bit_xor(106,178) = 216
加密过程
运算 | 说明 | 二进制数 | 十进制数 |
bit_xor | 明文 | 11011000 | 216 |
bit_xor | 密钥 | 10110010 | 178 |
运算结果 | 密文 | 01101010 | 106 |
解密过程
运算 | 说明 | 二进制数 | 十进制数 |
bit_xor | 密文 | 01101010 | 106 |
bit_xor | 密钥 | 10110010 | 178 |
运算结果 | 明文 | 11011000 | 216 |
例如,甲乙双方可以通过协商预先确定一幅密钥图像K,双方各保存一份备用。在此基础上,甲乙双方利用密钥图像K可以进行图像的加密和解密处理。
例如,甲通过密钥图像K与原始图像O进行按位异或运算,得到加密图像S。加密图像S是杂乱无章的,其他人无法解读加密图像S内容。而乙可以将预先保存的密钥图像K与加密图像S进行按位异或运算,实现加密图像S的解密,获取原始图像O。
import cv2
import numpy as np
img = cv2.imread('D:/PixC/01.jpeg',0)
cv2.imshow('img',img)
print(img)
w,h = img.shape
key = np.random.randint(0,255,size = [w,h],dtype=np.uint8)
print(key)
cv2.imshow('key',key)
cv2.waitKey()
cv2.destroyAllWindows()
加密后
encryption = cv.bitwise_xor(img,key)
decryption = cv.bitwise_xor(encryption,key)
cv2.imshow('encryption',encryption)
cv2.imshow('decryption',decryption)