【问题标题】:Cannot retrieve Original image from Encrypted image In Python using PIL无法使用 PIL 在 Python 中从加密图像中检索原始图像
【发布时间】:2019-03-20 10:54:29
【问题描述】:

我正在编写一个可以使用 RSA 算法加密和解密图像的脚本。我的公钥是 (7, 187),私钥是 (23,187) 现在加密的计算是正确的,就像图像矩阵中的一个条目一样,41 加密的值为 46。但是当解密发生时没有给出适当的结果,例如 46 它给出了 136,并且对于加密矩阵中的每个 46 条目,我得到的结果是解密矩阵中的 136。我不知道为什么会这样。当我在 python 提示符(或 shell)中进行相同的计算时,它给出了正确的答案。

在脚本中,我首先将 RGB 图像转换为灰度,然后将其转换为 2d numpy 数组,然后对于每个元素,我应用 RSA 算法(键),然后将其保存为图像。然后我在加密矩阵中应用解密密钥,然后问题就出现了。代码如下:

from PIL import Image
import numpy as np
from pylab import * 
#encryption

img1 = (Image.open('image.jpeg').convert('L')) 
img1.show()

img = array((Image.open('image.jpeg').convert('L')))
a,b = img.shape #saving the no of rows and col in a tuple
print('\n\nOriginal image: ')
print(img)
print((a,b))
tup = a,b

for i in range (0, tup[0]):
    for j in range (0, tup[1]):
        img[i][j]= (pow(img[i][j],7)%187)


print('\n\nEncrypted image: ')
print(img)
imgOut = Image.fromarray(img)
imgOut.show()
imgOut.save('img.bmp')

#decryption

img2 = (Image.open('img.bmp'))
img2.show()
img3 = array(Image.open('img.bmp'))
print('\n\nEncrypted image: ')
print(img3)
a1,b1 = img3.shape
print((a1,b1))
tup1 = a1,b1

for i1 in range (0, tup1[0]):
    for j1 in range (0, tup1[1]):
        img3[i1][j1]= ((pow(img3[i1][j1], 23))%187) 
print('\n\nDecrypted image: ')
print(img3)
imgOut1 = Image.fromarray(img3)
imgOut1.show()
print(type(img))  

矩阵的值:

原图:

[[41 42 45 ... 47 41 33]

[41 43 45 ... 44 38 30]

[41 42 46 ... 41 36 30] ...

[43 43 44 ... 56 56 55]

[45 44 45 ... 55 55 54]

[46 46 46 ... 53 54 54]]

加密图像:

[[ 46 15 122 ... 174 46 33]

[46 87 122 ... 22 47 123]

[ 46 15 7 ... 46 9 123] ...

[87 87 22 ... 78 78 132]

[122 22 122 ... 132 132 164]

[7 7 7 ... 26 164 164]]

解密图片:

[[136 70 24 ... 178 136 164]

[136 111 24 ... 146 141 88]

[136 70 96 ... 136 100 88] ...

[111 111 146 ... 140 140 1]

[24 146 24 ... 1 1 81]

[96 96 96 ... 52 81 81]]

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 很奇怪你得到46作为加密值,因为你的原始图像应该有dtypeuint8pow(np.uint8(41),7)%187评估为86,而不是46
  • 那怎么解决呢?
  • 我什至无法重现该问题,更不用说解决它了。当我运行您的代码时,我在加密图像中得到 86 而不是 46。你确定你得到了 46?
  • 是的,我很确定。顺便说一句,这是用 python 3.7 编写的。
  • 那我就不知所措了。能否提供样张图片?

标签: python image encryption python-imaging-library mod


【解决方案1】:

我认为你会更好地使用 pow() 函数的第三个参数,它会在内部为你做模数。

这是一个没有加载图像复杂性的小示例 - 想象一下它是从黑色到白色的灰度渐变。

# Make single row greyscale gradient from 0..255
img = [ x for x in range(256) ]

# Create encrypted version
enc = [ pow(x,7,187) for x in img ]

# Decrypt back to plaintext
dec = [ pow(x,23,187) for x in enc ]

它似乎从 0..187 解密回原始值,哪里出错了 - 大概是因为溢出?也许比我聪明的人能够解释这一点 - 如果你知道,请为我添加评论!

【讨论】:

  • 这在此脚本中不起作用,因为img[i][j]numpy.ndarray,并且要使用pow() 的第三个参数,我需要将所有参数设置为int
  • 为此,我需要将img 的每个值转换为int 数据类型,如temp,然后只有我可以使用它。
  • 您可以使用img.tolist() 轻松地将Numpy 数组制作成列表。但是,我的意思是使用pow() 的第三个参数,而不是让您使用列表。
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多