У меня есть вопрос относительно двух моих кодов, над которыми я работаю. Цель этой программы - зашифровать изображение в формате .png. Затем я поработаю над отображением зашифрованного изображения в виде растрового изображения. И, наконец, я хотел бы расшифровать его в исходное изображение.
Пока что я просто работаю над тем, чтобы взять изображение -> преобразовать его в шестнадцатеричный формат -> зашифровать с помощью DES в режиме ECB и расшифровать его обратно.
Однако у меня возникает проблема при попытке отобразить изображение после его расшифровки! Сам код в порядке и не дает никакой трассировки.
Но изображение, которое было сохранено и я намереваюсь открыть, выдает следующую ошибку:
"Не удалось загрузить изображение 'newSavedImage.png'. Неустранимая ошибка чтения PNG
файл изображения: не файл PNG "
from PIL import Image
import binascii
import blockcipher as bc
def load_image(img_name):
with open(img_name, 'rb') as f:
img_obj = f.read()
img_obj = binascii.hexlify(img_obj)
# binascii.a2b_hex(img_obj.replace(' ', ''))
return img_obj
def save_image(img_obj):
temp = open("newSavedImage.png", "wb") # with original image extension
# write into the object by decoding base64 object
temp.write(binascii.unhexlify(img_obj))
temp.close()
def choose_encr(img_obj):
key, encr_img = bc.myDESencr(img_obj, 1)
encr_img = binascii.hexlify(encr_img)
return key, encr_img
def decrypt(encr_obj, key):
orig_img = bc.myDESdecr(encr_obj, key, 1)
orig_img = binascii.hexlify(orig_img)
return orig_img
if __name__ =="__main__":
img_str = 'pic3.png' # the img is in my working dir
img = load_image(img_str)
# save_image(img)
key, enc = choose_encr(img)
img = decrypt(enc, key)
save_image(img)
и это мой код для шифрования DES, который я использую
from Crypto.Cipher import DES3, DES
from Crypto import Random
import Crypto.Util
# mode is integer values ranging from 1 to 4
def myDESencr(orig_image, mode):
# generate random key
key = Random.get_random_bytes(8)
# pad if not byte size of % 8
orig_image = pad(orig_image)
# instantiation with the right mode
if mode == 1:
des = DES.new(key, DES.MODE_ECB)
encrypted_image = des.encrypt(orig_image)
return key, encrypted_image
def myDESdecr(encr_image, key, mode):
if mode == 1:
des = DES.new(key, DES.MODE_ECB)
orig_image = des.decrypt(encr_image)
return orig_image
def pad(orig_image):
while len(orig_image) % 8 != 0:
orig_image += b'\0'
return orig_image
Итак, суть моей проблемы в том, что после того, как я расшифрую зашифрованную шестнадцатеричную строку и сохраню ее, она выдаст мне фатальную ошибку для изображений .png.
Кроме того, когда я сохраняю строку сразу после того, как вызываю load_image (img_name), а затем сохраняю ее, она работает нормально.