Seite 2 von 5

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 11:05
von Fire Spike

Code: Alles auswählen

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?
Tut mir leid, ich wollte das nachdem der Code funktioniert machen. War nicht böse gemeint.
Ich weiss nicht wie ich die zwei funktionen in einander verpacken soll :roll: .
Für den Thread und das blockweise verschlüsseln werde ich mich einlesen.
Kannst du mir noch sagen wie ich den Hintergrund der Tabs auf weiss setzen kann?
Währe dir dankbar wenn du mir noch diese Frage beantworten würdest.

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 12:24
von Sirius3
Ich benutze ttk nicht.

Was macht generiere_Schlüssel_verschlüsseln mehr als generiere_Schlüssel_entschlüsseln?

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 12:49
von Fire Spike
Salz erstellen und salz zurückgeben

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 12:56
von Sirius3
Dann ist ja alles klar?

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 13:28
von Fire Spike
kann ich den Salz parameter optional festlegen?

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 14:13
von Sirius3
Das wäre eine Möglichkeit.

Re: Verschlüsselungsprogramm

Verfasst: Freitag 18. Oktober 2019, 15:15
von Fire Spike
was haltest du von einer "Stromchiffrenverschlüsselung"?
braucht fast kein speicher und ist mit einer for schleife umsetzbar.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 13:05
von Fire Spike
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. :D

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()

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 14:35
von __blackjack__
@Fire Spike: Du kannst da nicht sinnvoll eine Stromverschlüsselung draus machen. Du verschlüsselst jedes einzelne Byte als Fernet-Token, womit aus jedem Byte 480 Bytes werden, wenn ich mich jetzt nicht verrechnet habe.

Warum da bei Dir mehr heraus kommt, könnte vielleicht am falschen Dateimodus "ab" liegen.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 14:39
von Fire Spike
wieso ist "ab" falsch? ich will ja bytes anhängen.
Und macht eine blockverschlüsselung mehr sinn? wenn ja wie kann ich das umsetzen?

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 15:05
von __blackjack__
@Fire Spike: Nein, Du willst keine Bytes anhängen, Du willst eine *neue* Datei erstellen.

Blockverschlüsselung macht Fernet bereits. Und das ist halt nicht für grosse Dateien gedacht, sondern für kleine bis mittelgrosse Nachrichten. Die als Text übermittelt/gespeichert werden sollen.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 15:33
von Fire Spike
wie kann ich dann bytes anhängen?
wie kann ich denn dateien verschlüsseln die ein paar hundert mb bis 1gb gross sind?

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 16:07
von Sirius3
Indem Du das, was Fenet macht, selbst nachprogrammierst.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 16:25
von Fire Spike
Nur so eine Frage: könntest du das? Wenn nein muss ich es gar nicht versuchen.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 16:52
von Sirius3
Die `encode` bzw. `decode`-Funktion von Fernet sind mit ihren Unterfunktionen nur eine Handvoll aufrufe anderer Crypto-Funktionen. Wenn Du verstehst, was diese Crypto-Funktionen machen, ist es kein großer Aufwand, das als Stream-Version nachzuprogrammieren.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 17:22
von Fire Spike
kannst du mir bitte sagen welche funktionen ich bearbeiten muss? 😇

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 17:28
von __blackjack__
@Fire Spike: Du willst keine Bytes anhängen. Das macht keinen Sinn.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 17:32
von Fire Spike
@__blackjack__: das problem ist behoben weil ich jetzt in anderes problem habe.🤒
Fire Spike hat geschrieben: Mittwoch 30. Oktober 2019, 17:22 kannst du mir bitte sagen welche funktionen ich bearbeiten muss? 😇

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 18:31
von __blackjack__
@Fire Spike: Du hast den Dateimodus jetzt also geändert?

Für das andere Problem musst Du Dir halt anschauen was die Methoden von der `Fernet`-Klasse machen.

Re: Verschlüsselungsprogramm

Verfasst: Mittwoch 30. Oktober 2019, 19:36
von Fire Spike
__blackjack__ hat geschrieben: Mittwoch 30. Oktober 2019, 18:31 @Fire Spike: Du hast den Dateimodus jetzt also geändert?
ja, auf r+b