diff --git a/delivery1/lib/symmetric_encryption.py b/delivery1/lib/symmetric_encryption.py new file mode 100644 index 0000000..d2a2520 --- /dev/null +++ b/delivery1/lib/symmetric_encryption.py @@ -0,0 +1,55 @@ +import os +from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.backends import default_backend + +# Function to derive a 256-bit key from a password and salt +def derive_key(passwd, salt): + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=salt, + iterations=10000, + backend=default_backend() + ) + key = kdf.derive(passwd.encode()) + return key.hex() + + +# Function to encrypt a file using a password +def encrypt_file(passwd, input_file, output_file): + salt = os.urandom(16) + key = derive_key(passwd, salt) + iv = os.urandom(16) + cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend()) + encryptor = cipher.encryptor() + + with open(input_file, 'rb') as f: + plaintext = f.read() + + ciphertext = encryptor.update(plaintext) + encryptor.finalize() + + with open(output_file, 'wb') as f: + f.write(salt + iv + ciphertext) + + +# Function to decrypt a file using a password +def decrypt_file(passwd, input_file, output_file=None): + with open(input_file, 'rb') as f: + encrypted_data = f.read() + + salt = encrypted_data[:16] + iv = encrypted_data[16:32] + ciphertext = encrypted_data[32:] + key = derive_key(passwd, salt) + cipher = Cipher(algorithms.AES(key), modes.CFB(iv), backend=default_backend()) + decryptor = cipher.decryptor() + + plaintext = decryptor.update(ciphertext) + decryptor.finalize() + + if output_file is None: + return plaintext + else: + with open(output_file, 'wb') as f: + f.write(plaintext)