我对我正在处理的两个代码有疑问。该程序的目的是加密.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)之后立即保存字符串然后保存它时,它工作正常。