OpenCv图像处理——图像加密和解密

一般情况下,图像的加密和解密过程是通过按位异或运算实现的。将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程。

一、基本原理

按位异或运算的基本规则如下表:

算子1算子2结果规则
000xor(0, 0) = 0
011xor(0, 1) = 1
101xor(1, 0) = 1
110xor(1, 1) = 0

8位灰度图像中,每一个像素由8位二进制表示,其范围在[0, 255]之间。下表阐述了利用密钥178,对像素值216加密和解密过程。

加密过程运算说明二进制十进制
bit_xor明文1101  1000216
密钥1011  0010178
运算结果密文0110  1010106
解密过程运算说明二进制十进制
bit_xor密文0110  1010106
密钥1011  0010178
运算结果明文1101  1000216

假设有需要加密的原始图像A,其像素值为:

17216856
228940
2748119

图像A的二进制表示为AB,其像素值为:

1010  11001010  10000011  1000
0001  01100101  10010010  1000
0001  10110011  00000111  0111

加密密钥图像为K,其像素值为:

132177156
1525670
2699162

图像K的二进制表示为KB,其像素值为:

1000  01001011  00011001  1100
1001  10000011  10000100  0110
0001  10100110  00111010  0010

接下来实现图像AB和图像KB的按位异或运算得到AKB:

0010  10000001  10001010  0100
1000  11100110  00010110  1110
0000  00010101  00111101  0101

图像AKB转换为十进制图像AK:

4024164
14297110
183213

可以看出将A图像加密后的图像AK已经发生了本质的变换,下面将AKB图像继续和密钥图像KB进行按位异或运算,得到图像XB:

1010  11001010  10000011  1000
0001  01100101  10010010  1000
0001  10110011  00000111  0111

将图像XB转换为十进制图像X:

17216856
228940
2748119

可以发现,x图像和原来的图像A完全一致。该过程详细解释了8位图像的加密和解密过程。在实际应用中,收发双方应该事先的规定好密钥图像,发送方利用密钥图像将图片加密,将密文发给接收方,然后接收方接到密文,然后用密钥进行解密,最终得到原始图像。

二、代码实现

import cv2
import numpy as np

demo = cv2.imread("demo.jpg", 0)
r, c = demo.shape
key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8)   # 生成随机的密钥图像

cv2.imshow("demo", demo)              # 显示原始图像
cv2.imshow("key", key)                # 显示密钥图像

encryption = cv2.bitwise_xor(demo, key)   # 加密
decryption = cv2.bitwise_xor(encryption, key)  # 解密

cv2.imshow("encryption", encryption)      # 显示密文图像
cv2.imshow("decryption", decryption)      # 显示解密后的图像

cv2.waitKey(-1)
cv2.destroyAllWindows()

                                             

                                       原始图像                                                                                                密钥图像

                                           

                                       密文图像                                                                                               解密后图像

 

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值