Verschlüsselungsprogramm

Fragen zu Tkinter.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo, ich bin es mal wieder. :D

Ich habe einen Programm geschrieben das Dateien Ver und Entschlüsselt.
Meine probleme sind folgende.
1. wie kann ich den Hintergrund von root_Tab, Tab1 und Tab2 auf weiss setzen?
2. wie kann ich Salz_Ausgabe so konfigurieren dass er die ausgabe markieren und kopieren kann?
Ich googelte schon viel, aber ich wurde nicht fündig. Ich probierte auch schon vieles, aber nichts ging. :cry: :cry:

Ich sah nur noch die möglichkeit hier zu fragen.
Ich hoffe ihr könnt mir helfen.
Liebe Grüsse Fire Spike. :)

Code: Alles auswählen

import base64
import os
import binascii
import tkinter as tk
from tkinter import ttk
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

def generiere_Schlüssel_entschlüsseln(pw, salt):
    Passwort = pw.encode()
    salt = binascii.unhexlify(salt)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=100000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel

def generiere_Schlüssel_verschlüsseln(pw):
    global Salz_Ausgabe
    Passwort = pw.encode()
    salt = os.urandom(16)
    salt_hex = binascii.hexlify(salt)
    Salz_Ausgabe.config(text=salt_hex, fg="orange")
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=100000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel

def verschlüsseln(pw, Dateipfad):
    schlüssel = generiere_Schlüssel_verschlüsseln(pw)
    f = Fernet(schlüssel)
    with open(Dateipfad, "rb") as Datei:
        with open(Dateipfad + ".verschluesselt", "wb") as Datei_verschlüsselt:
            Datei_verschlüsselt.write(f.encrypt(Datei.read()))

def entschlüsseln(pw, Dateipfad, salt):
    schlüssel = generiere_Schlüssel_entschlüsseln(pw, salt)
    f = Fernet(schlüssel)
    with open(Dateipfad, "rb") as Datei:
        Pfad, Dateiname = os.path.splitext(Dateipfad)
        Dateiname.split(".")
        del Dateiname[-1]
        Dateiname = " ".join(Dateiname)
        with open(Pfad + Dateiname + ".entschluesselt", "wb") as Datei_entschlüsselt:
            Datei_entschlüsselt.write(f.decrypt(Datei.read()))
def main():
    global Salz_Ausgabe
    root = tk.Tk()
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
    root_Tab = ttk.Notebook(root)
    Tab1 = ttk.Frame(root_Tab) 
    Tab2 = ttk.Frame(root_Tab)
    
    root_Tab.add (Tab1, text="Entschlüsseln")
    root_Tab.add (Tab2, text="Verschlüsseln")
    root_Tab.pack(expand=1, fill='both')
       
    Info1 = tk.Label(Tab1, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text1 = tk.Label(Tab1, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe1 = tk.Entry(Tab1, bg="white")
    Passwort_Text1 = tk.Label(Tab1, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe1 = tk.Entry(Tab1, bg="white")
    Salz_Ausgabe = tk.Label(Tab2, text="...", bg="white")
    Salz_Ausgabe.grid(row=3, column=1, sticky=tk.W)
    Entschlüsseln = tk.Button(Tab1, text="entschlüsseln", command=lambda: entschlüsseln(Passwort_Eingabe1.get(), Dateipfad_Eingabe1.get(), Salz_Eingabe.get()), bg="white")
    Verschlüsseln = tk.Button(Tab2, text="verschlüsseln", command=lambda: verschlüsseln(Passwort_Eingabe2.get(), Dateipfad_Eingabe2.get()), bg="white")
    Salz_Text1 = tk.Label(Tab1, text="Bitte Salz eingeben", bg="white")
    Salz_Text2 = tk.Label(Tab2, text="Dieses Salz wird in der entschlüsselung verwendet: ", bg="white")
    Salz_Eingabe = tk.Entry(Tab1, bg="white")
    Info2 = tk.Label(Tab2, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text2 = tk.Label(Tab2, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe2 = tk.Entry(Tab2, bg="white")
    Passwort_Text2 = tk.Label(Tab2, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe2 = tk.Entry(Tab2, bg="white")

    Info1.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text1.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe1.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text1.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe1.grid(row=2, column=1, sticky=tk.W)
    Info2.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text2.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe2.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text2.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe2.grid(row=2, column=1, sticky=tk.W)
    Entschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    Verschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    Salz_Text2.grid(row=3, column=0, sticky=tk.W)
    Salz_Text1.grid(row=3, column=0, sticky=tk.W)
    Salz_Eingabe.grid(row=3, column=1, sticky=tk.W)
    root.mainloop()

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Dir wurde sicher schon gesagt, dass man Variablen klein_mit_unterstrich schreibt. Auch Abkürzungen solltest Du vermeiden, passwort ist viel lesbarer als pw. Vergiß gleich wieder, dass es `global` überhaupt gibt, es löst nichts, sondern macht nur den Code schwer lesbar. Alles was eine Funktion braucht, bekommt sie über ihre Argumente.

`entschlüsseln` funktioniert dann gar nicht: `splitext` trennt, wie der Name schon sagt, die Erweiterung ab, also alles, was nach dem letzten Punkt steht vom Rest, nicht Pfad vom Dateinamen. `split` liefert dann eine einelementige Liste, die aber gleich wieder verworfen wird. `del` kann nicht auf Strings angewendet werden. Warum Du dann einen Dateinamen mit Leerzeichen willst, weißt nur Du.

Zum eigentlichen Problem: es existiert nicht, weil normalerweise dieses Salz zusammen mit dem verschlüsselten Dateiinhalt gespeichert wird.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Wie kann ich das Salz dann auslesen? :?: ich sehe nichts in der doku. :?
das man global nicht verwendet weiss ich , aber es ging nicht ohne.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du schreibst das Salz in die Datei. Am Anfang, als erste 32 Bytes.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ist das Fernet egal?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Natürlich ist das Fernet egal, denn das bekommt ja nur den `schlüssel`.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Natürlich geht es ohne ``global`` sonst könnte man ja nicht sagen das man das so ziemlich grundsätzlich nicht verwendet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Wenn das Salz gespeichert habe muss ich es selbst auslesen und mit dem Salz den schlüssel generieren oder hat fernet dafür eine extrafunktion?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das machst Du selbst.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Danke Sirius3 ich werde es mal so versuchen.
Könntest du mir vielleicht noch bei frage Nr. 1 helfen?
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Im moment überarbeite ich die funktionen , aber ich stehe gerade auf dem schlauch :cry: . Könnt ihr mir helfen?(Frage unten) :D
Wie kann ich vom 32 byte der datei bis zum schluss auslesen. :?:
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst die ganze Datei lesen, und die ersten 32 Byte wegwerfen. Einfaches byte-objekt-slicing

Code: Alles auswählen

print(b"egal daten"[5:])
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Problem existiert schon wieder nicht, weil Du ja erst die 32 Byte liest, und der File-Pointer dann schon bei 32 steht, wenn Du den Rest der Datei lesen willst.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Danke, ist ja eigentlich logisch.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo das verschlüsseln giebt kein Fehler aber die Datei wird nicht um die 32 bytes grösser und beim entschlüsseln bekomme ich ein

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/media/usb/.Projekte/Python3/tkinter/Dateiverschluesseln.py", line 68, in <lambda>
    Entschlüsseln = tk.Button(Tab1, text="entschlüsseln", command=lambda: entschlüsseln(Passwort_Eingabe1.get(), Dateipfad_Eingabe1.get()), bg="white")
  File "/media/usb/.Projekte/Python3/tkinter/Dateiverschluesseln.py", line 50, in entschlüsseln
    Datei_entschlüsselt.write(f.decrypt(Dateiinhalt))
  File "/usr/lib/python3/dist-packages/cryptography/fernet.py", line 74, in decrypt
    timestamp, data = Fernet._get_unverified_token_data(token)
  File "/usr/lib/python3/dist-packages/cryptography/fernet.py", line 92, in _get_unverified_token_data
    raise InvalidToken
cryptography.fernet.InvalidToken
Mein jetziger code ist

Code: Alles auswählen

import base64
import os
import tkinter as tk
from tkinter import ttk
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

def generiere_Schlüssel_entschlüsseln(Passwort, salt):
    Passwort = Passwort.encode()
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=100000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel

def generiere_Schlüssel_verschlüsseln(Passwort):
    Passwort = Passwort.encode()
    salt = os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=100000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel, salt

def verschlüsseln(Passwort, Dateipfad):
    schlüssel, salt = generiere_Schlüssel_verschlüsseln(Passwort)
    f = Fernet(schlüssel)
    with open(Dateipfad, "rb") as Datei:
        with open(Dateipfad + ".verschluesselt", "wb") as Datei_verschlüsselt:
            Datei_verschlüsselt.write(salt + f.encrypt(Datei.read()))

def entschlüsseln(Passwort, Dateipfad):
    with open(Dateipfad, "rb") as Datei:
        salt = Datei.read(32)
        Dateiinhalt = Datei.read()
    schlüssel = generiere_Schlüssel_entschlüsseln(Passwort, salt)
    f = Fernet(schlüssel)
    Dateiname, Dateiendung = os.path.splitext(os.path.basename(Dateipfad))
    with open(os.path.dirname(Dateipfad) + Dateiname + ".entschluesselt", "wb") as Datei_entschlüsselt:
        Datei_entschlüsselt.write(f.decrypt(Dateiinhalt))
def main():
    root = tk.Tk()
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
    root_Tab = ttk.Notebook(root)
    Tab1 = ttk.Frame(root_Tab) 
    Tab2 = ttk.Frame(root_Tab)
    
    root_Tab.add (Tab1, text="Entschlüsseln")
    root_Tab.add (Tab2, text="Verschlüsseln")
    root_Tab.pack(expand=1, fill='both')
       
    Info1 = tk.Label(Tab1, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text1 = tk.Label(Tab1, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe1 = tk.Entry(Tab1, bg="white")
    Passwort_Text1 = tk.Label(Tab1, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe1 = tk.Entry(Tab1, bg="white")
    Entschlüsseln = tk.Button(Tab1, text="entschlüsseln", command=lambda: entschlüsseln(Passwort_Eingabe1.get(), Dateipfad_Eingabe1.get()), bg="white")
    Verschlüsseln = tk.Button(Tab2, text="verschlüsseln", command=lambda: verschlüsseln(Passwort_Eingabe2.get(), Dateipfad_Eingabe2.get()), bg="white")
    Info2 = tk.Label(Tab2, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text2 = tk.Label(Tab2, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe2 = tk.Entry(Tab2, bg="white")
    Passwort_Text2 = tk.Label(Tab2, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe2 = tk.Entry(Tab2, bg="white")

    Info1.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text1.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe1.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text1.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe1.grid(row=2, column=1, sticky=tk.W)
    Info2.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text2.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe2.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text2.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe2.grid(row=2, column=1, sticky=tk.W)
    Entschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    Verschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    root.mainloop()

if __name__ == "__main__":
    main()
In der Doku wird der Fehler nicht wirklich beschrieben.
Könnt ihr mir helfen?
Wahrscheinlich habe ich wieder etwas falsch umgesetzt. :x
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

› generiere_Schlüssel_entschlüsseln‹ und › generiere_Schlüssel_verschlüsseln‹ machen fast das selbe, bzw, die eine enthält die andere. Da sollte kein doppelter Code vorkommen.
Das Salz ist ja jetzt nur 16 Bytes lang. Wie kommst Du auf 32?
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

oh nein. ich probierte mal mit 32 bytes löschte aus versehen eine zeile machte diesen schritt rückgängig und das ging zu weit.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Der Code funktioniert jetzt. Danke Für eure hilfe, besonders Sirius3 :) :) :D :D
Jetzt ist immer noch die frage wie ich den Hintergrund der Tabs auf Weiss umfärben kann. Wenn möglich auch die Farbe von ttk.Notebook
Sieh nämlich hässlich aus!
Vielen dank voraus.
LG Fire Spike
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich habe noch ein paar Fragen:
1. Tabhintergrundfarbe weiss
2. könnt ihr mir ein gutes beispiel mit threading zeigen? Ich will noch eine Forschrittsanzeige hinzufügen.
3. soll ich auf eine Klasse umsteigen?
4. ist die sicherheit der verschlüsselung gut?

Liebe Grüsse Fire Spike

Code: Alles auswählen

import base64
import os
import tkinter as tk
from tkinter import ttk
from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

def generiere_Schlüssel_entschlüsseln(Passwort, salt):
    Passwort = Passwort.encode()
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel

def generiere_Schlüssel_verschlüsseln(Passwort):
    Passwort = Passwort.encode()
    salt = os.urandom(16)
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
                     length=32,
                     salt=salt,
                     iterations=1000000,
                     backend=default_backend()
                     )
    
    schlüssel = base64.urlsafe_b64encode(kdf.derive(Passwort))
    return schlüssel, salt

def verschlüsseln(Passwort, Dateipfad):
    schlüssel, salt = generiere_Schlüssel_verschlüsseln(Passwort)
    f = Fernet(schlüssel)
    with open(Dateipfad, "rb") as Datei:
        with open(Dateipfad + ".verschluesselt", "wb") as Datei_verschlüsselt:
            Datei_verschlüsselt.write(salt + f.encrypt(Datei.read()))

def entschlüsseln(Passwort, Dateipfad):
    with open(Dateipfad, "rb") as Datei:
        salt = Datei.read(16)
        Dateiinhalt = Datei.read()
    schlüssel = generiere_Schlüssel_entschlüsseln(Passwort, salt)
    f = Fernet(schlüssel)
    Dateiname, Dateiendung = os.path.splitext(os.path.basename(Dateipfad))
    with open(os.path.join(os.path.dirname(Dateipfad), Dateiname + ".entschluesselt"), "wb") as Datei_entschlüsselt:
        Datei_entschlüsselt.write(f.decrypt(Dateiinhalt))
def main():
    root = tk.Tk()
    root.title("Dateien ent/verschlüsseln")
    root.config(bg="white")
    root_Tab = ttk.Notebook(root)
    Tab1 = ttk.Frame(root_Tab) 
    Tab2 = ttk.Frame(root_Tab)
    
    root_Tab.add (Tab1, text="Entschlüsseln")
    root_Tab.add (Tab2, text="Verschlüsseln")
    root_Tab.pack(expand=1, fill='both')
       
    Info1 = tk.Label(Tab1, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text1 = tk.Label(Tab1, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe1 = tk.Entry(Tab1, bg="white")
    Passwort_Text1 = tk.Label(Tab1, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe1 = tk.Entry(Tab1, bg="white")
    Entschlüsseln = tk.Button(Tab1, text="entschlüsseln", command=lambda: entschlüsseln(Passwort_Eingabe1.get(), Dateipfad_Eingabe1.get()), bg="white")
    Verschlüsseln = tk.Button(Tab2, text="verschlüsseln", command=lambda: verschlüsseln(Passwort_Eingabe2.get(), Dateipfad_Eingabe2.get()), bg="white")
    Info2 = tk.Label(Tab2, text="Wichtig: Die Datei wird mit einer zusätzlichen\n Dateiendung gespeichert. Nicht überschrieben!\n", bg="white")
    Dateipfad_Text2 = tk.Label(Tab2, text="Bitte Dateipfad angeben", bg="white")
    Dateipfad_Eingabe2 = tk.Entry(Tab2, bg="white")
    Passwort_Text2 = tk.Label(Tab2, text="Bitte Passwort eingeben", bg="white")
    Passwort_Eingabe2 = tk.Entry(Tab2, bg="white")

    Info1.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text1.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe1.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text1.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe1.grid(row=2, column=1, sticky=tk.W)
    Info2.grid(row=0, columnspan=1, sticky=tk.W)
    Dateipfad_Text2.grid(row=1, column=0, sticky=tk.W)
    Dateipfad_Eingabe2.grid(row=1, column=1, sticky=tk.W)
    Passwort_Text2.grid(row=2, column=0, sticky=tk.W)
    Passwort_Eingabe2.grid(row=2, column=1, sticky=tk.W)
    Entschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    Verschlüsseln.grid(row=4, columnspan=1, sticky=tk.W)
    root.mainloop()

if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

›generiere_Schlüssel_entschlüsseln‹ und › generiere_Schlüssel_verschlüsseln‹ machen fast das selbe, bzw, die eine enthält die andere. Da sollte kein doppelter Code vorkommen. Die Variablennamen halten sich nicht an die Namenskonvention.
Warum muß man das immer duzende-male schreiben, und trotzdem ändert sich nichts daran?

Du benutzt anerkannte Verfahren zur Verschlüsselung, das ist also sicher.

Soll die Verschlüsselung im Hintergrund laufen, brauchst Du einen Thread, wie das geht, steht in der Dokumentation.
Soll der Thread mit der GUI kommunizieren, mußt Du erstens Blockweise verschlüsseln (ist eh besser, statt im Zweifel hunderte Megabytes in den Speicher zu laden), den Fortschritt in eine Queue schreiben und diese Queue von der GUI regelmäßig abfragen.

Du benutzt aber Fernet, das dafür gedacht ist, kurze Nachrichten zu verschlüsseln. Daher kann es kein blockweises Verschlüsseln. Dazu mußt Du Dich tiefer in die Thematik einlesen.
Antworten