import io import os import struct import tempfile from Crypto.Cipher import AES def encrypt_file(key, in_file, out_file, chunksize=64 * 1024): """ Encrypts a file using AES (CBC mode) with the given key. key: The encryption key - a string that must be either 16, 24 or 32 bytes long. Longer keys are more secure. in_file: Name of the input file or tempfile out_file: Name of the output file or tempfile chunksize: Sets the size of the chunk which the function uses to read and encrypt the file. Larger chunk sizes can be faster for some files and machines. chunksize must be divisible by 16. """ if type(in_file) is str: filesize = os.path.getsize(in_file) input = open(in_file, 'rb') elif type(in_file) is io.BufferedRandom or tempfile.SpooledTemporaryFile: in_file.seek(0, 2) filesize = in_file.tell() in_file.seek(0) input = in_file else: print("Unable to encrypt Input " + str(in_file) + " of type " + str(type(in_file))) return if type(out_file) is str: output = open(out_file, 'wb') elif type(out_file) is io.BufferedRandom or tempfile.SpooledTemporaryFile: output = out_file else: print("Unable to encrypt to Output " + str(out_file) + " of type " + str(type(out_file))) return cipher = AES.new(key, AES.MODE_CBC) output.write(struct.pack('