Не удается получить исходное изображение из зашифрованного изображения В Python с использованием PIL

Я пишу скрипт, который может шифровать и расшифровывать изображение с помощью алгоритма RSA. Мой открытый ключ (7, 187), а закрытый ключ (23 187), теперь расчет для шифрования правильный, как для записи в матрице изображения, 41 зашифрованное значение равно 46. Но когда происходит расшифровка не дает соответствующего результата, например, для 46 он дает 136, и для каждой записи 46 в матрице шифрования результат, который я получаю, равен 136 в матрице дешифрования. И я не знаю, почему это происходит. Когда я делаю тот же расчет в приглашении (или оболочке) Python, он дает правильный ответ.

В сценарии я сначала преобразовываю изображение 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]]

Любая помощь будет оценена. Благодарю вас.


person Dutta    schedule 20.03.2019    source источник
comment
Странно, что вы получаете 46 в качестве зашифрованного значения, потому что исходное изображение должно иметь dtype uint8, а pow(np.uint8(41),7)%187 оценивается как 86, а не 46.   -  person Stop harming Monica    schedule 20.03.2019
comment
Тогда как решить проблему?   -  person Dutta    schedule 20.03.2019
comment
Я не могу даже воспроизвести проблему, не говоря уже о том, чтобы решить ее. Я получаю 86 вместо 46 в зашифрованном изображении, когда запускаю ваш код. Вы уверены, что получите 46?   -  person Stop harming Monica    schedule 21.03.2019
comment
да я почти уверен. Кстати, это написано на python 3.7.   -  person Dutta    schedule 21.03.2019
comment
Тогда я в растерянности. Можете ли вы предоставить образец изображения?   -  person Stop harming Monica    schedule 21.03.2019
comment
на самом деле я решил проблему. Спасибо за твою заботу. если вы хотите, вы можете помочь мне с этим ‹stackoverflow.com/questions/55282063/  -  person Dutta    schedule 21.03.2019


Ответы (1)


Я думаю, вы добьётесь большего успеха, используя 3-й параметр функции 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, где что-то идет не так - предположительно из-за переполнения? Может быть, кто-то умнее меня сможет это объяснить - пожалуйста, добавьте комментарий для меня, если вы знаете!

person Mark Setchell    schedule 21.03.2019
comment
Это не будет работать в этом сценарии, так как img[i][j] является numpy.ndarray, и для использования 3-го параметра pow() мне нужно, чтобы все параметры были int - person Dutta; 21.03.2019
comment
Чтобы это работало, мне нужно взять каждое значение img в тип данных int, например temp, тогда только я смогу это использовать. - person Dutta; 21.03.2019
comment
Вы можете легко превратить массив Numpy в список с помощью img.tolist() Однако я хочу использовать 3-й параметр для pow(), чтобы не заставлять вас использовать список. - person Mark Setchell; 21.03.2019