Как зашифровать картинку в AES и получить на выходе картинку с хаотичными пикселями?
Суть задачи:
Нужно зашифровать картинку в AES и обратно получить хаотичный набор пикселей.
Как делаю я:
Читаю картинку по байтам и записываю в txt файл, кодирую этот файл и записываю зашифрованные байты в картинку, но при запуске картинки пишет:"Недопустимое разрешение"
код:
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
def read():
fileFirst = input('Введите название файла: ')
with open(fileFirst, 'rb') as byteImg:
byte_text = byteImg.read()
with open('byte_img_text.txt','wb') as re:
re.write(byte_text)
print(byte_text)
def encrypt():
key = get_random_bytes(16)
with open('byte_img_text.txt', 'rb') as txtToEntxt:
TextForEncrypt = txtToEntxt.read()
cipher = AES.new(key, AES.MODE_CTR)
byte_text_en = cipher.encrypt(TextForEncrypt)
with open('byte_img_text_en.txt', 'wb') as newF:
newF.write(byte_text_en)
def write():
with open('byte_img_text_en.txt', 'rb') as reWrite:
text = reWrite.read()
with open('end.jpg', 'wb') as wrWrite:
wrWrite.write(text)
print(text)
хорошие задачи студентам однако подкидывают. преподу респект - студентам думать и изучать.
исходим из предположения что png не сжат.
открываем исходный png через соотвествующую библиотечку. создаем целевой png.
далее берем цвета первого пикселя исходного png - шифруем - записываем в цвета первого пикселя целевого файла.
и так до конца.
закрываем png.
получаем правильный по формату png где цвета каждого пикселя зашифрованы.
и также в обратку.
алгоритм конечно писан вилами по воде :) но и тебе, студент, учитца надо.
берем цвета первого пикселя исходного png - шифруем - записываем в цвета первого пикселя целевого файла.
AES -- блочный шифр с фиксированным размером блока. Нельзя взять произвольное количество данных (цвета первого пикселя), заправить их в AES, взять часть того что получилось, заправить их обратно в цвета первого пикселя и ожидать, что обратное преобразование восстановит исходные цвета.
Собственно правильно тебе система пишет :)
Файл картинки кроме данных о цвете пикселей имеет еще и кучу данных описанных форматом, т.е. хранит внутри себя высоту, ширину, способ сжатия, дополнительную информацию вроде кординат съемки и названия фотоапарата...
т.е. зашифровав весь файл ты сделал эти данные нечитаемыми.
как проблему решить: первый вариант тебе описали, побайтно зашифровать ТОЛЬКО область пикселей.
Второй вариант- создаешь новый файл, пишешь туда заголовок для пнг со всеми нужными полями, а дальше зашифрованный целиком свой файл.
Проще всего сделать это с BMP файлом, у него простая структура заголовка, данные не сжимаются.
Шифровать нужно данные отдельно от заголовка. На выходе будет нормальная картинка, только вместо изображения - мусор из пикселей.