寻找一种使用键对图像进行按位异或的方法

Searching for a way to do Bitwise xor on images with keys

我正在寻找使用密钥加密图像的方法,第一个输入应该是这样的图像:

第二个输入如下所示: key = "01010100 01110010 10101110 01110001 10110000 01100001 01010010 10110001 10110011 10110011 10000000 01011100 01010010 01011100 11010011 00011000 10100100"(或者我可以将其转换为另一种类型,但这是我的原始数据)

异或后 image^key 输出应如下所示:

到目前为止我尝试了什么?

import cv2
import numpy as np
 
demo = cv2.imread("koala.jpeg")
key = "01010100 01110010 10101110 01110001 10110000 01100001 01010010 10110001 10110011 10110011 10000000 01011100 01010010 01011100 11010011 00011000 10100100"
r, c, t = demo.shape

 

 
 
encryption = cv2.bitwise_xor(demo, key) # encryption
decryption = cv2.bitwise_xor(encryption, key) # decryption
 
cv2.imshow("encryption", encryption) # Display ciphertext image
cv2.imshow("decryption", decryption) # Display the decrypted image
 
cv2.waitKey(-1)
cv2.destroyAllWindows()

这是输出:

Traceback (most recent call last):
  File "/Users/kemal/Documents/Python/pyImage/xor.py", line 10, in <module>
    encryption = cv2.bitwise_xor(demo, key) # encryption
TypeError: Expected Ptr<cv::UMat> for argument 'src2'

我的问题是,对我的图像和密钥进行异或运算的正确方法是什么?

现在我已经成功加密了两张图片,但是当我想用密钥加密我的图片时,它不起作用。

实际上我知道这是错误的加密方法,也许我可以尝试将我的密钥转换为图像,但我相信有一种正确的方法可以做到这一点,我想学习。感谢您提供任何帮助。

如果此库不是执行此加密的正确方法,我也可以更改库并使用其他库,没有任何限制。对我来说唯一重要的是输入和输出。

感谢您的帮助。

以下Python程序:

  • 显示原图,

  • 按键后显示加密图像,

  • 按键后显示解密图像,

  • 按下一个键后删除所有图像。

请注意,根据图像的大小,每次加密和解密可能需要几秒钟。

import cv2
import numpy as np
from numpy import random

# Load original image
demo = cv2.imread(<path to jpeg>)
r, c, t = demo.shape

# Display original image
cv2.imshow("Original image", demo)
cv2.waitKey()

# Create random key
key = random.randint(256, size = (r, c, t))

# Encryption
# Iterate over the image
encrypted_image = np.zeros((r, c, t), np.uint8)
for row in range(r):
    for column in range(c):
        for depth in range(t):
            encrypted_image[row, column, depth] = demo[row, column, depth] ^ key[row, column, depth] 
            
cv2.imshow("Encrypted image", encrypted_image)
cv2.waitKey()

# Decryption
# Iterate over the encrypted image
decrypted_image = np.zeros((r, c, t), np.uint8)
for row in range(r):
    for column in range(c):
        for depth in range(t):
            decrypted_image[row, column, depth] = encrypted_image[row, column, depth] ^ key[row, column, depth] 
            
cv2.imshow("Decrypted Image", decrypted_image)

cv2.waitKey()
cv2.destroyAllWindows()

加载后,原始图像存储在具有 r 行、c 列和 t 0 到 255 之间的颜色值的 3D 数组中。
接下来,生成一个密钥,该密钥对应于一个相同大小的数组,其元素是随机生成的。
对于加密,它迭代原始图像并将图像数组的每个值 ix 与密钥数组的相应值进行异或。
对于解密,对加密图像执行类似的迭代,并将加密图像数组的每个值与密钥数组的相应值进行异或运算。

请注意,此逻辑不应被视为正确方式,而是一种可能的方式。它基于 one-time-pad 加密,按规定使用时在信息理论上是安全的。然而,这并没有在这里实现,因为密钥必须随机选择 true,而这里它是随机选择 pseudo。对于一次一密,密钥必须与消息一样长,即密钥数组必须与图像数据一样大。原则上,也可以使用其他算法,例如AES,但是实现起来更复杂(关于填充、IV 等)。

另请注意,在存储加密图像时,必须使用不改变图像数据(实际上是密文)的格式。否则加载加密图片后,根据算法的不同,可能解密不正确,甚至无法解密。通常压缩数据并因此更改数据的格式是例如jpg,不改变数据的格式是例如。 bmp,参见例如here 了解更多详情。用imwrite.

保存时可以通过文件扩展名控制格式