opencv实现图片加密与解密

一、原理
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()

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用OpenCV实现视觉密码加密解密的Python示例代码: ```python import cv2 import numpy as np import random def encrypt(img_path, key): # 读入图片并转换为灰度图 img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 获取图片的高度和宽度 height, width = img.shape # 生成一个随机的加密矩阵 encrypt_matrix = np.zeros((height, width), dtype=np.uint8) for i in range(height): for j in range(width): encrypt_matrix[i][j] = random.randint(0, 255) # 将加密矩阵与密钥进行异或运算 key_matrix = np.zeros((height, width), dtype=np.uint8) key_matrix[:, :] = key encrypt_matrix = cv2.bitwise_xor(encrypt_matrix, key_matrix) # 将原始图片加密矩阵进行异或运算 encrypted_img = cv2.bitwise_xor(img, encrypt_matrix) # 返回加密后的图片加密矩阵 return encrypted_img, encrypt_matrix def decrypt(encrypted_img, encrypt_matrix, key): # 将加密矩阵与密钥进行异或运算 key_matrix = np.zeros(encrypt_matrix.shape, dtype=np.uint8) key_matrix[:, :] = key encrypt_matrix = cv2.bitwise_xor(encrypt_matrix, key_matrix) # 将加密后的图片加密矩阵进行异或运算得到原始图片 img = cv2.bitwise_xor(encrypted_img, encrypt_matrix) # 返回解密后的图片 return img # 测试代码 img_path = 'test.jpg' key = 123 encrypted_img, encrypt_matrix = encrypt(img_path, key) decrypted_img = decrypt(encrypted_img, encrypt_matrix, key) cv2.imshow('Original Image', cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)) cv2.imshow('Encrypted Image', encrypted_img) cv2.imshow('Decrypted Image', decrypted_img) cv2.waitKey(0) ``` 首先定义了一个 `encrypt` 函数和一个 `decrypt` 函数,分别用于加密解密一张图片。在加密过程中,首先读入图片并转换为灰度图,然后生成一个随机的加密矩阵,将加密矩阵与密钥进行异或运算,再将原始图片加密矩阵进行异或运算得到加密后的图片加密矩阵。在解密过程中,将加密矩阵与密钥进行异或运算,然后将加密后的图片加密矩阵进行异或运算得到原始图片。 接着,在测试代码中,定义了一个图片路径和一个密钥,并调用 `encrypt` 函数进行加密,再调用 `decrypt` 函数进行解密,并将原始图片加密后的图片解密后的图片分别显示出来,以便比较。 需要注意的是,由于这种加密方式只是将原始图片加密矩阵进行异或运算,因此加密后的图片可能会有一些噪点,解密后的图片可能会有一些模糊。如果需要更高的加密强度和解密质量,可以考虑使用其他更加复杂的加密算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值