我创建了一个小脚本来加密和解密文件,但是该文件为零字节,并且未创建解密的文件
代码:
from hashlib import md5
from Crypto import Random
from Crypto.Cipher import AES
import os
from Crypto import *
def encrypt(in_file, out_file, key, iv):
bs = AES.block_size
cipher = AES.new(key, AES.MODE_CBC, iv)
finished = False
while not finished:
chunk = in_file.read(1024 * bs)
if len(chunk) == 0 or len(chunk) % bs != 0:
padding_length = bs - (len(chunk) % bs)
chunk += bytes(padding_length) * chr(padding_length)
finished = True
out_file.write(cipher.encrypt(chunk))
def decrypt(in_file, out_file, key, iv):
bs = AES.block_size
cipher = AES.new(key, AES.MODE_CBC, iv)
next_chunk = ''
finished = False
while not finished:
chunk, next_chunk = next_chunk, cipher.decrypt(in_file.read(1024 * bs))
if len(next_chunk) == 0:
padding_length = ord(chunk[-1])
if padding_length < 1 or padding_length > bs:
raise ValueError("bad decrypt pad (%d)" % padding_length)
if chunk[-padding_length:] != (padding_length * chr(padding_length)):
raise ValueError("bad decrypt")
chunk = chunk[:-padding_length]
finished = True
out_file.write(chunk)
in_file = open('C:/Users/saeed/Desktop/ImportantFolder/arrest.jpg', 'rb')
out_file = open('C:/Users/saeed/Desktop/ImportantFolder/arrest_enc.jpg', 'wb')
key = os.urandom(32)
iv = os.urandom(16)
encrypt(in_file, out_file, key, iv)
in_file.close()
out_file.close()
print('Encrypted!')
in_file = open('C:/Users/saeed/Desktop/ImportantFolder/arrest_enc.jpg', 'rb')
out_file = open('C:/Users/saeed/Desktop/ImportantFolder/arrest_dec.jpg', 'wb')
decrypt(in_file, out_file, key, iv)
in_file.close()
out_file.close()
print('Decrypted!')
被加密的文件,_是创建但为零字节,并且在代码停止时不能解密。它被卡在加密过程中,从不打印加密!错误:
Traceback (most recent call last):
File "C:/Users/saeed/IdeaProjects/encryptor/encryption.py", line 41, in <module>
encrypt(in_file, out_file, key, iv)
File "C:/Users/saeed/IdeaProjects/encryptor/encryption.py", line 15, in
encrypt
chunk += padding_length * chr(padding_length)
TypeError: can't concat bytes to str
这是什么意思,我该如何修复?
从文件读取时,读取数据的类型是bytes
类型而不是str
类型。如果您使用chunk += bytes( padding_length )
,则将填充物附加到块上。