from codecs import encode import rsa from create_keys import get_keys, get_private_key, get_symmetric_key from cryptography.fernet import Fernet from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives.asymmetric import padding # encrypt blockstring with name from contract def encrypt_data(contract, block_string): # create symmetric key for transaction and retrieve pubkey from contract symmetric_key = get_symmetric_key(contract) pubkey = get_keys(contract) # create chiper and encrypt data using symmetric key chiper = Fernet(symmetric_key) data = str(chiper.encrypt(block_string))[2:-1] # encrypt semmetric key with pubkey and cast to string encrypted_key = str(rsa.encrypt(symmetric_key,pubkey))[2:-1] return data, encrypted_key # decrypt t form contract name def decrypt_data(name, t): # retrieve private key private_key = get_private_key(name) # decript symmetric key en_key = encode(t.encrypted_key.encode().decode('unicode_escape'),"raw_unicode_escape") key = rsa.decrypt(en_key, private_key) # decrypt data with decrypted semmetric key cipher = Fernet(key) decrypted_data = cipher.decrypt(bytes(t.data, 'utf-8')) # decode and retrun data return decrypted_data.decode('utf8').replace("'", '"')