无法使用PIL从Python中的加密图像检索原始图像

时间:2019-03-20 10:54:30

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

我正在编写一个脚本,可以使用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 ... 146141141 88]

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

[111111146 ... 140140 1]

[24 146 24 ... 1 1 81]

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

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

1 个答案:

答案 0 :(得分:0)

我认为使用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解密回原始值,出现错误-大概是因为溢出?也许比我更聪明的人可以解释这一点-如果您知道,请为我添加评论!