137 lines
3.7 KiB
Markdown
Executable File
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()
|
|
``` |