3.7 KiB
Executable File
3.7 KiB
Executable File
Datei-Verschlüsselung mit Python
Dieses Python-Skript verschlüsselt oder entschlüsselt Dateien rekursiv mit mehreren Fernet-Schlüsseln aus der Bibliothek cryptography.
Funktionen
- Mehrfache Verschlüsselung (
ROUNDS) - Automatische Schlüssel-Erstellung
- Speicherung der Schlüssel in
keys.txt - Versand der Schlüssel per Gmail
- Entschlüsselung mit umgekehrter Schlüssel-Reihenfolge
- Rekursive Verarbeitung aller Dateien im aktuellen Ordner
Voraussetzungen
Benötigte Bibliothek installieren:
pip install cryptography
Konfiguration
Passe diese Variablen an:
GMAIL_USER = "deine_mail@gmail.com"
GMAIL_APP_PASSWORD = "gmail_app_passwort"
RECEIVER_MAIL = "empfaenger@gmail.com"
Nutzung
Skript starten:
python encrypt.py
Danach auswählen:
e→ Dateien verschlüsselnd→ Dateien entschlüsseln
Sicherheitshinweise
- Die Datei
keys.txtenthält alle Schlüssel. - Ohne diese Schlüssel können die Dateien nicht entschlüsselt werden.
- Die Reihenfolge der Schlüssel ist wichtig.
- Vor Nutzung unbedingt ein Backup erstellen.
- Dateien aus
EXCLUDEwerden ignoriert.
Vollständiger Code
import pathlib
import smtplib
from email.message import EmailMessage
from cryptography.fernet import Fernet
GMAIL_USER = ""
GMAIL_APP_PASSWORD = ""
RECEIVER_MAIL = ""
EXCLUDE = {"encrypt.py", "keys.txt"}
ROUNDS = 10
def send_keys_via_mail(keys):
msg = EmailMessage()
key_text = "\n".join([f"Runde {i+1}: {k}" for i, k in enumerate(keys)])
msg.set_content(f"Bewahre diese Schlüssel gut auf (Reihenfolge ist wichtig!):\n\n{key_text}")
msg['Subject'] = f"🔒 Deine {len(keys)} Entschlüsselungs-Keys"
msg['From'] = GMAIL_USER
msg['To'] = RECEIVER_MAIL
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(GMAIL_USER, GMAIL_APP_PASSWORD)
smtp.send_message(msg)
print("E-Mail mit allen Schlüsseln wurde versendet.")
except Exception as e:
print(f"E-Mail Fehler: {e}. Keys werden NUR lokal gespeichert!")
def get_or_create_keys(count):
path = pathlib.Path("keys.txt")
if not path.exists():
keys = [Fernet.generate_key().decode() for _ in range(count)]
path.write_text("\n".join(keys))
send_keys_via_mail(keys)
return [k.encode() for k in keys]
return [k.encode() for k in path.read_text().splitlines()]
def process_files(mode, keys):
# Bei Decrypt müssen wir die Keys in umgekehrter Reihenfolge nutzen!
active_keys = keys[::-1] if mode == "decrypt" else keys
for path in pathlib.Path(".").rglob("*"):
if path.is_file() and path.name not in EXCLUDE:
try:
data = path.read_bytes()
for k in active_keys:
fernet = Fernet(k)
data = fernet.decrypt(data) if mode == "decrypt" else fernet.encrypt(data)
path.write_bytes(data)
print(f"{mode.capitalize()} erfolgreich: {path.name}")
except Exception as e:
print(f"Fehler bei {path.name}: {e} (Evtl. falscher Key oder Modus?)")
def main():
choice = input("Möchtest du (e)ncrypten oder (d)ecrypten? ").lower()
if choice == 'e':
keys = get_or_create_keys(ROUNDS)
process_files("encrypt", keys)
elif choice == 'd':
if not pathlib.Path("keys.txt").exists():
print("Fehler: keys.txt nicht gefunden!")
return
keys = [k.encode() for k in pathlib.Path("keys.txt").read_text().splitlines()]
process_files("decrypt", keys)
else:
print("Ungültige Auswahl.")
if __name__ == "__main__":
main()