I have a code that i made, but something is going wrong. I need encripty some folders to get more security in my business, I am using AES script in python. It's generate 2 files, encrypt.py and decrypt. Encryptation is working nice, but when i execute the decrypt, it's give me a error.
Here is my code:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
backend = default_backend()
key = os.urandom(32) # 256 bit
iv = os.urandom(16) # 128 bit
# cryptografy
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
# loop all files and folders
for root, dirs, files in os.walk('.'):
# ignores main.py (that is the file name to not encrypt it)
if 'main.py' in files:
continue
# crypt files
for file in files:
# create a new encryptor
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
# read datas
file_path = os.path.join(root, file)
data = open(file_path, 'rb').read()
# adding padding
padder = padding.PKCS7(128).padder()
padded_data = padder.update(data) + padder.finalize()
# encrypts the data
cipher_data = encryptor.update(padded_data) + encryptor.finalize()
# writes the encrypted data to the file
file = open(file_path, 'wb')
file.write(cipher_data)
file.close()
# write the code for decryption in the file
decryptor_file = open('decryptor.py', 'w')
decryptor_file.write("import os\n")
decryptor_file.write("from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n")
decryptor_file.write("from cryptography.hazmat.backends import default_backend\n")
decryptor_file.write("from cryptography.hazmat.primitives import padding\n\n")
decryptor_file.write("backend = default_backend()\n")
decryptor_file.write("key = \"" + key.hex() + "\"\n")
decryptor_file.write("iv = \"" + iv.hex() + "\"\n\n")
decryptor_file.write("# descryptografy\n")
decryptor_file.write("cipher = Cipher(algorithms.AES(bytes.fromhex(key)), modes.CBC(bytes.fromhex(iv)), backend=backend)\n")
decryptor_file.write("decryptor = cipher.decryptor()\n\n")
decryptor_file.write("# loops all files and folders\n")
decryptor_file.write("for root, dirs, files in os.walk('.'):\n")
decryptor_file.write(" # decrypt files\n")
decryptor_file.write(" for file in files:\n")
decryptor_file.write(" # data reading\n")
decryptor_file.write(" file_path = os.path.join(root, file)\n")
decryptor_file.write(" data = open(file_path, 'rb').read()\n\n")
decryptor_file.write(" # decrypt data \n")
decryptor_file.write(" decrypted_data = decryptor.update(data) + decryptor.finalize()\n\n")
decryptor_file.write(" # remove padding\n")
decryptor_file.write(" unpadder = padding.PKCS7(128).unpadder()\n")
decryptor_file.write(" unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()\n\n")
decryptor_file.write(" # writes the data descrypted in the file\n")
decryptor_file.write(" file = open(file_path, 'wb')\n")
decryptor_file.write(" file.write(unpadded_data)\n")
decryptor_file.write(" file.close()\n\n")
decryptor_file.close()
# shows a alert message
print('All files and folders have been encrypted and the decrypt file has been created!')
Error that i got:
Traceback (most recent call last):
File "C:\Users\User\Desktop\cryptor\decryptor.py", line 23, in <module>
decrypted_data = decryptor.update(data) + decryptor.finalize()
File "C:\Program Files\Python38\lib\site-packages\cryptography\hazmat\primitives\ciphers\base.py", line 186, in finalize
data = self._ctx.finalize()
File "C:\Program Files\Python38\lib\site-packages\cryptography\hazmat\backends\openssl\ciphers.py", line 223, in finalize
raise ValueError(
ValueError: The length of the provided data is not a multiple of the block length.
Some help is apreciated!
Edit:
I will post my code working using text.txt to be encrypted. Maybe it help someone to help me :)
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import padding
backend = default_backend()
key = os.urandom(32) # 256 bit
iv = os.urandom(16) # 128 bit
# cryptography
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
# read from file
file = open('text.txt', 'rb')
data = file.read()
file.close()
# adding the padding
padder = padding.PKCS7(128).padder()
padded_data = padder.update(data) + padder.finalize()
# encrypt the data
cipher_data = encryptor.update(padded_data) + encryptor.finalize()
# write the encrypted data to the file
file = open('crypto.txt', 'wb')
file.write(cipher_data)
file.close()
# delete the old file
os.remove('text.txt')
# display alert message
print('Your file has been encrypted!')
# create the decryption file
decryptor_file = open('decryptor.py', 'w')
# write the decryption code to the file
decryptor_file.write("import os\n")
decryptor_file.write("from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes\n")
decryptor_file.write("from cryptography.hazmat.backends import default_backend\n")
decryptor_file.write("from cryptography.hazmat.primitives import padding\n\n")
decryptor_file.write("backend = default_backend()\n")
decryptor_file.write("key = \"" + key.hex() + "\"\n")
decryptor_file.write("iv = \"" + iv.hex() + "\"\n\n")
decryptor_file.write("# decryption\n")
decryptor_file.write("cipher = Cipher(algorithms.AES(bytes.fromhex(key)), modes.CBC(bytes.fromhex(iv)), backend=backend)\n")
decryptor_file.write("decryptor = cipher.decryptor()\n\n")
decryptor_file.write("# read file\n")
decryptor_file.write("file = open('crypto.txt', 'rb')\n")
decryptor_file.write("data = file.read()\n")
decryptor_file.write("file.close()\n\n")
decryptor_file.write("# decrypt data\n")
decryptor_file.write("decrypted_data = decryptor.update(data) + decryptor.finalize()\n\n")
decryptor_file.write("# remove padding\n")
decryptor_file.write("unpadder = padding.PKCS7(128).unpadder()\n")
decryptor_file.write("unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()\n\n")
decryptor_file.write("# write decrypted data to file\n")
decryptor_file.write("file = open('text.txt', 'wb')\n")
decryptor_file.write("file.write(unpadded_data)\n")
decryptor_file.write("file.close()\n\n")
decryptor_file.close()