Невозможно получить исходное изображение из зашифрованного изображения в Python с использованием PIL - PullRequest
0 голосов
/ 20 марта 2019

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

В сценарии я сначала преобразую изображение RGB в градации серого, а затем преобразую его в двумерный массив, затем для каждого элемента я применяю алгоритм 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]]

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

1 Ответ

0 голосов
/ 21 марта 2019

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

...