我正在使用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的倍数”,我感到困惑。
文件大小存储不正确。要以大字节序将文件大小存储在前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还通过方法pad
和pad
支持填充。