【问题标题】:Searching for a way to do Bitwise xor on images with keys寻找一种对带有键的图像进行按位异或的方法
【发布时间】:2020-12-24 09:04:26
【问题描述】:

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

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

在 xor 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'

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

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

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

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

感谢您的任何帮助。

【问题讨论】:

  • 加密是一个庞大的领域,需要出色的数学技能。简单的加密方法,就像您在代码中尝试的那样,太简单而无法破解。我建议你先研究一下various types of modern cypher actually work 是如何工作的。
  • @kemalsanli 抱歉,我没有看到任何问题。你已经加密工作了。你不是吗?你还有什么想要实现的吗? “正确的方式”是什么意思?
  • 加密不起作用,它给出了这个错误TypeError: Expected Ptr&lt;cv::UMat&gt; for argument 'src2' 我可以从我的密钥输入创建图像,我可以异或图像和密钥图像但这不是我想要的,我想用异或图像关键不是另一个图像。我正在为此询问正确的方法。我会编辑我的帖子对不起误解。

标签: python-3.x image encryption xor bitwise-xor


【解决方案1】:

以下 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()

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

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

另请注意,在存储加密图像时,必须使用不会更改图像数据(实际上是密文)的格式。否则,加载加密图像后,解密可能不正确甚至不可能,具体取决于算法。通常压缩数据并因此更改数据的格式是例如jpg,一种不改变数据的格式,例如bmp,参见例如here 了解更多详情。使用imwrite保存时可以通过文件扩展名控制格式。

【讨论】:

  • 感谢您的回答,这就是我想要的。我希望你有个美好的一天。 ^^
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 2019-09-29
  • 2022-10-03
  • 2016-06-09
  • 2016-07-03
  • 2011-03-09
  • 2018-07-30
  • 2021-10-30
相关资源
最近更新 更多