python 3使用AES加密和解密图像

问题描述 投票:1回答:1

我正在使用AES加密和解密图像。我已经继承了代码,因此如果大家发现错误,请引导我。我正在尝试理解并修复代码。

    chunk_size = 64*1024
    output_file = filename+".enc"
    file_size = bytes(os.path.getsize(filename))
    IV = get_random_bytes(16)

    encryptor = AES.new(key, AES.MODE_CBC, IV)
    with open(filename, 'rb') as inputfile:
        with open(output_file, 'wb') as outf:
            outf.write(file_size)
            outf.write(IV)
            while True:
                chunk = bytes(inputfile.read(chunk_size))
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                   chunk = chunk + bytes(16 - len(chunk)%16)
                outf.write(encryptor.encrypt(chunk))

我的图片是66 kb,大约-67584字节。考虑到AES使用16字节工作,此代码应该会出错,但是会生成加密文件。当我尝试使用

解密时
def decrypt(key, filename):
        chunk_size = 64*1024
        output_file = filename[:-4]
        with open(filename, 'rb') as inf:
            filesize = bytes(inf.read(16))
            IV = inf.read(16)
            decryptor = AES.new(key, AES.MODE_CBC, IV)
            with open(output_file, 'wb') as outf:
                while True:
                    chunk = inf.read(chunk_size)
                    print(len(chunk))
                    if len(chunk)==0:
                        break
                    outf.write(decryptor.decrypt(chunk))
                outf.truncate(filesize)```

我收到如下错误

TypeError:需要一个整数(got类型字节)

并且当我以字节为单位键入块时,出现以下错误

输入字符串的长度必须是16的倍数

当我在源控制台上将文件大小显示为65536时,如何解决错误“长度为16的倍数”,我感到困惑。

python-3.x encryption
1个回答
2
投票

文件大小存储不正确。要以大字节序将文件大小存储在前16个字节中(尽管decrypt方法原本打算这样做,尽管实际上16个字节太大),请以加密方式替换:

file_size = bytes(os.path.getsize(filename))

file_size = os.path.getsize(filename).to_bytes(16, byteorder='big')

以及解密:

filesize = bytes(inf.read(16))

filesize = int.from_bytes(inf.read(16), byteorder='big')

通过这些更改,加密和解密将按预期工作。

注意:您使用零填充变量进行填充,并存储文件大小(可能仅)以在解密后删除填充。有一种更有效的方法,即PKCS7填充。这里,填充本身已包含要删除多少字节的信息。因此,不必存储文件大小(至少不必删除填充)。此外,PyCryptodome还通过方法padpad支持填充。

© www.soinside.com 2019 - 2024. All rights reserved.