#python #cryptography #python-imaging-library #mod
#python #криптография #python-imaging-library #мод
Вопрос:
Я пишу скрипт для шифрования и дешифрования изображения в python3 с использованием PIL. Здесь я преобразую изображение в массив numpy, а затем умножаю каждый элемент массива на 10. Теперь я заметил, что функция по умолчанию в PIL fromarray () преобразует каждый элемент массива в mod 256, если он больше 255, поэтому, когда я пытаюсь получить исходное значение матрицы, я не получаю исходное. Например, если исходное значение равно 40, то его 10-кратное значение равно 400, поэтому fromarray() преобразует его в 400 mod 256, что даст 144. Теперь, если я добавлю 256 к 144, у меня будет 400, а затем разделю на 10, что даст мне 40. Но если значение равно 54, то 10times равно 540, а 540 mod 256 равно 28. Теперь, чтобы вернуть исходное значение, мне нужно добавить 256 два раза, что даст мне 540. 540 — не единственное число, которое даст мне 28, когда я изменю его на 256. Поэтому я никогда не узнаю, когда добавлять 256 один раз, а когда два или более.
Вот код:
from PIL import Image
from numpy import *
from pylab import *
#encryption
img1 = (Image.open('image.jpeg').convert('L'))
img1.show() #displaying the image
img = array(Image.open('image.jpeg').convert('L'))
a,b = img.shape
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]= img[i][j]*10 #converting every element of the original array to its 10times
print(img)
imgOut = Image.fromarray(img)
imgOut.show()
imgOut.save('img.jpeg')
#decryption
img2 = (Image.open('img.jpeg'))
img2.show()
img3 = array(Image.open('img.jpeg'))
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]= ((img3[i1][j1])/10) #reverse of encryption
print(img3)
imgOut1 = Image.fromarray(img3)
imgOut1.show()
Теперь, когда функция делает мод своих элементов равным 256, я не могу вернуть исходное значение из значения mod. Как я могу получить исходное значение.Существуют ли какие-либо другие методы преобразования матрицы в изображение и наоборот, которые по умолчанию не изменят ее значение на любое число.
Теперь я не знаю, как справиться с этой проблемой. Любая помощь будет высоко оценена.Спасибо.
Комментарии:
1. вы немного запутались, потому что 256 не является простым числом, поэтому простого «умножить на это число» не существует. но почему вы «шифруете», умножая на 10? почему бы не использовать один из установленных методов?
2. На самом деле, я просто тестирую это, мой реальный проект заключается в шифровании изображения с использованием алгоритма RSA
3. тогда откажитесь от этого, попытка выяснить, как это изменить, когда ваш модуль не является простым, будет огромной тратой времени и болью. если вы настаиваете, попробуйте работать в модуле 257 и просто нормализуйте цвета изображения, чтобы соответствовать этому, поскольку ваш модуль является простым, должно быть легко найти обратный
Ответ №1:
Это неправильный способ сделать это. Вы никак не можете получить фактическое значение. После изменения значений на its mod of 256
вы не можете вернуть предыдущее значение обратно. Поскольку вы читаете изображение как 8bit depth JPEG
, у вас не может быть значения больше, чем 255
в numpy array
, поскольку нам нужно более 8 бит для хранения значения, которое больше, чем 255
в десятичной системе счисления. Итак, что вы можете сделать, так это прочитать изображение как изображение глубиной 8 бит, а затем преобразовать numpy.ndarray
изображение в 16-битное или 32-битное, как вы хотите. Вы можете сделать это с помощью img_array.astype(numpy.uint16)
или img_array.astype(numpy.uint32)
вы можете проверить тип с помощью print(img_array.dtype())
Если вы преобразуете массив numpy в uint16, то наибольшее значение, которое вы можете иметь в массиве, 2^16-1
а для uint32 это 2^32-1
.
Теперь вы можете сохранить массив, используя imageio
который может считывать и записывать изображение глубиной 16 бит.
`import imageio as io
img_array = io.imread('16bit.png')
io.imwrite('new16bit.png', img_array)`
Используйте .png в качестве файла без потерь и может хранить 16-битные данные.
PIL всегда преобразует 16-битный или 32-битный массив numpy в 8-битный.