Расшифрованное изображение из шестнадцатеричной строки не может быть открыто - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть вопрос относительно двух моих кодов, над которыми я работаю. Цель этой программы - зашифровать изображение в формате .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), а затем сохраняю ее, она работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...