Ошибка расшифровки - может быть связана с фернетом - PullRequest
0 голосов
/ 26 марта 2020

Я создаю облачное шифрование, когда я вхожу, чтобы удалить пользователя и расшифровать файл, возникает ошибка:
(я использую python 2.7 и библиотеку fe rnet, любые предложения, что это может быть связано с?)

[*] Welcome to secure cloud storage application!(Server side)
[*] Removing user..
[*] Generating new symmetric key and re-encrypting all files..
[*] Decrypting file: secret1.txt...
Traceback (most recent call last):
  File "drive.py", line 161, in <module>
    main()
  File "drive.py", line 128, in main
    decrypt(f, f_list)
  File "C:\Third_Year\Telecom\CSU34031_Project2\decrypt.py", line 9, in decrypt
    decoded = f.decrypt(encoded.encode())
  File "C:\Python27\lib\site-packages\cryptography\fernet.py", line 74, in decrypt
    timestamp, data = Fernet._get_unverified_token_data(token)
  File "C:\Python27\lib\site-packages\cryptography\fernet.py", line 89, in _get_unverified_token_data
    raise InvalidToken
cryptography.fernet.InvalidToken
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from cryptography.fernet import Fernet

def decrypt(f, file_list):
    for file in file_list:
        print("[*] Decrypting file: " + file['title'] + "...")
        encoded = file.GetContentString()
        decoded = f.decrypt(encoded.encode())
        file.SetContentString(decoded.decode())
        file.Upload()

Этот код взаимодействует с приводом, вызывает функцию дешифрования, эта функция может содержать ошибку в функции дешифрования.

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from cryptography.fernet import Fernet
from encrypt import encrypt
from decrypt import decrypt
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
import os
import shutil

# Shows all the users that are part of the admin's group
def show_users():
    subs = os.listdir('group/')
    print("[*] -------------------- Users --------------------")
    print("[*]")
    for sub in subs:
        print("[*] " + sub)
    print("[*]")
    print("[*] -------------------- Users --------------------")    
    print("[*]")

# Shows all the files in the folder of the drive
def show_files(f_list):
    print("[*] -------------------- Files --------------------")
    print("[*]")
    for file in f_list:
        print("[*] " + file['title'])
    print("[*]")
    print("[*] -------------------- Files --------------------")
    print("[*]")

# Clears terminal and prints logo
def logo():
    os.system('cls' if os.name == 'nt' else 'clear')
    print("   _____        _____        _____                 ")
    print("  / ____|      / ____|      / ____|         /\     ")
    print(" | (___       | |          | (___          /  \    ")
    print("  \___ \      | |           \___ \        / /\ \   ")
    print("  ____) |  _  | |____   _   ____) |  _   / ____ \  ")
    print(" |_____/  (_)  \_____| (_) |_____/  (_) /_/    \_\ ")
    print("[*] Welcome to secure cloud storage application!(Server side)")


def main():
    logo()

    # Google Authentication
    auth = GoogleAuth()
    auth.LocalWebserverAuth()
    drive = GoogleDrive(auth) 

    # Grab the symmetric key.. if it doesn't exist, generate a new one
    try:
        f = open('keys/symmetric_key.txt', 'rb')
        key = f.read()
        print("[*] Your symmetric key: '" + key + "'")
    except:
        key = Fernet.generate_key()
        f = open('keys/symmetric_key.txt', 'w')
        f.write(key)
        print("[*] Your symmetric key: '" + key + "'")
    f = Fernet(key)

    # Grabbing list of files in folder of drive.. change the id here to change folder.
    f_list = drive.ListFile({'q':"'1YJTCXT_lXNmfWHRCoiOSO2EurMGMqFd6' in parents and trashed=false"}).GetList()

    # Guts of the program..
    finished = False
    logo()
    print("[*]")
    # Present admin with list of options..
    while not finished:
        option = input("[*] Enter 1 to encrypt files.\n[*] Enter 2 to decrypt files.\n[*] Enter 3 to add a user.\n[*] Enter 4 to remove a user.\n[*] Enter 5 to list files.\n[*] Enter 6 to list users.\n[*] Enter 7 to quit.\n[*] ")
        logo()
        print("[*]")
        # Encrypts all files in the folder of the drive..
        if option is 1:
            encrypt(f, f_list)

        # Decrypts all files in the folder of the drive..
        elif option is 2:
            decrypt(f,f_list)

        # Adds a user to the group.. basically just creates a new folder whose name is the 
        # name of the user, and generates an rsa key and stores it in that folder. 
        elif option is 3:
            username = raw_input("[*] Enter username: ")
            if os.path.exists("group/" + str(username)):
                print("[*] Username taken.")
                print("[*]")
            else:
                print("[*] Adding user " + str(username) + "..")
                # Creating dir for user..
                os.mkdir("group/" + str(username))

                print("[*] Generating keys for user..")
                # Generating private key..
                private_key = rsa.generate_private_key(
                public_exponent=65537,
                key_size=2048,
                backend=default_backend())

                # Serialising keys for storing..
                private_serialized = private_key.private_bytes(
                encoding=serialization.Encoding.PEM,
                format=serialization.PrivateFormat.PKCS8,
                encryption_algorithm=serialization.NoEncryption())

                # Storing private key..
                file = open("group/" + str(username) + "/private_key.txt", "w")
                file.write(private_serialized)
                file.close()
                print("[*] Added user " + str(username) + "!")
                print("[*]")

        # Removes a user.. basically deletes the folder whose name is the same as the users, 
        # decrypts all the files in the folder of the drive, generates a new symmetrics key,
        # and re-encrypts all the files in folder of the drive.
        elif option is 4:
            show_users()
            username = raw_input("[*] Enter username: ")
            logo()
            if os.path.exists("group/" + str(username)):
                print("[*] Removing user..")
                shutil.rmtree("group/" + str(username))
                print("[*] Generating new symmetric key and re-encrypting all files..")
                decrypt(f, f_list)
                key = Fernet.generate_key()
                file = open('keys/symmetric_key.txt', 'w')
                file.write(key)
                file.close()
                f = Fernet(key)
                print("[*] New symmetric key: " + key)
                encrypt(f, f_list)
                print("[*]")
                logo()
                print("[*]\n[*] Deleted user " + username + "!\n[*]")
            else:
                print("[*] Username does not exist.. enter '6' to see list of users.")
                print("[*]")

        # Shows all files in the folder of the drive..
        elif option is 5:
            show_files(f_list)

        # Shows all users in the admin's group..
        elif option is 6:
            show_users()

        # Exit()
        elif option is 7: 
            print("[*] Thanks for using the program!")
            finished = True

        else:
            print("[*] Please pick one of the options listed below..")
            print("[*]")

if __name__ == "__main__":
    main()

...