Ich hatte wie gesagt eine stromchffrenverschlüssellung vor, aber jetzt habe ich folgende probleme:
1. eine 28.3 kb grosse datei wird zu 2.8 mb gross und das ist relativ viel. Das liegt wahrscheinlich daran dass das Fernet immer noch zusätzliche daten speichert. wie kann ich das verhindern so das die daten nur ein einiges mal gespeichert werden?
2. wie kann ich die einzelnen bytes trennen? wenn frage 1 gelöst ist giebt es dieses problem nicht mehr!
Ich würde mich auf eine Antwort freuen.
Code: Alles auswählen
# Notizen
# --------
# hex in int = int('deadbeef', 16)
# --------
# Ende
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(passwort, salt=False):
passwort = passwort.encode()
return_tuple = False
if not salt:
salt = os.urandom(16)
return_tuple = True
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=1000000,
backend=default_backend()
)
schlüssel = base64.urlsafe_b64encode(kdf.derive(passwort))
if return_tuple:
return schlüssel, salt
else:
return schlüssel
def verschlüsseln(passwort, dateipfad):
with open(dateipfad, "rb") as datei:
with open(dateipfad + ".verschluesselt", "ab") as datei_verschlüsselt:
schlüssel, salt = generiere_Schlüssel(passwort)
f = Fernet(schlüssel)
datei_verschlüsselt.write(salt)
for i in range(os.path.getsize(dateipfad)):
byte = datei.read(1)
datei_verschlüsselt.write(f.encrypt(byte))
def entschlüsseln(passwort, dateipfad):
dateiname, dateiendung = os.path.splitext(os.path.basename(dateipfad))
with open(dateipfad, "rb") as datei:
with open(os.path.join(os.path.dirname(dateipfad), dateiname + ".entschluesselt"), "ab") as datei_entschlüsselt:
salt = datei.read(16)
schlüssel = generiere_Schlüssel(passwort, salt)
f = Fernet(schlüssel)
for i in range(os.path.getsize(dateipfad) - 16):
byte = datei.read(1)
datei_entschlüsselt.write(f.decrypt(byte))
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_button = tk.Button(tab1, text="entschlüsseln", command=lambda: entschlüsseln(passwort_eingabe1.get(), dateipfad_eingabe1.get()), bg="white")
verschlüsseln_button = 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_button.grid(row=4, columnspan=1, sticky=tk.W)
verschlüsseln_button.grid(row=4, columnspan=1, sticky=tk.W)
root.mainloop()
if __name__ == "__main__":
main()