十六进制字符串中的解密图像无法打开

时间:2018-04-28 21:53:18

标签: python encryption

我对我正在处理的两个代码有疑问。该程序的目的是加密.png格式的图像。然后,我将处理将加密图像显示为位图图像。最后,我想将其解密为原始图像。

到目前为止,我只是在拍摄图像 - >将其转换为十六进制 - >在ECB模式下通过DES加密并将其解密。

然而,当我尝试在解密后显示图像时,我遇到了问题!代码本身很好,并没有给任何回溯。

但保存并打算打开的图像会出现以下错误:

  

"无法加载图片' 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)之后立即保存字符串然后保存它时,它工作正常。

0 个答案:

没有答案
相关问题