Krypto-Demo mit xinux-crypt.py: Unterschied zwischen den Versionen
| Zeile 11: | Zeile 11: | ||
== Vorbereitung == | == Vorbereitung == | ||
Auf '''Bob''' | Auf '''Bob''' | ||
| + | |||
<code>export ALICE_IP=192.168.16.213</code> | <code>export ALICE_IP=192.168.16.213</code> | ||
| + | |||
Auf '''Alice''' | Auf '''Alice''' | ||
| + | |||
<code>export BOB_IP=192.168.16.254</code> | <code>export BOB_IP=192.168.16.254</code> | ||
Version vom 4. Mai 2026, 14:36 Uhr
Krypto-Demo mit xinux-crypt.py
In dieser Übung wird eine vollständige Kommunikation zwischen zwei Rechnern simuliert. Beide Teilnehmer führen dieselben Schritte durch – aber in unterschiedlicher Reihenfolge. Es werden asymmetrische Schlüssel, digitale Signaturen, Diffie-Hellman Key Exchange und symmetrische Verschlüsselung mit Hash-Prüfung demonstriert.
Das Script macht kein Netzwerk – alle Dateien liegen im aktuellen Verzeichnis.
Die Übertragung erfolgt manuell per wget.
Vorbereitung
Auf Bob
export ALICE_IP=192.168.16.213
Auf Alice
export BOB_IP=192.168.16.254
Auf beiden Rechnern:
sudo apt install python3-cryptography
Arbeitsverzeichnis anlegen und wechseln:
mkdir ~/krypto && cd ~/krypto
Das Script herunterladen:
wget https://xinux.de/downloads/script/xinux-crypt.py
HTTP-Server starten (Terminal 1 – bleibt offen):
python3 -m http.server 8000
Alle weiteren Befehle im Terminal 2 ausführen.
Schritt 1 – Asymmetrisches Schlüsselpaar generieren
Auf beiden Rechnern:
python3 xinux-crypt.py --gen-asym-keys
| Datei | Inhalt | Sichtbarkeit |
|---|---|---|
priv.pem |
RSA Private Key | Geheim – niemals weitergeben! |
pub.pem |
RSA Public Key | Öffentlich – wird von der Gegenseite geholt |
Der Public Key wird im Terminal angezeigt – das ist der BEGIN PUBLIC KEY Block.
Dieser Wert ist nicht geheim und kann offen übertragen werden.
Schritt 2 – Public Key holen
Jeder holt den Public Key der Gegenseite. Wichtig: mit -O umbenennen,
damit der eigene pub.pem nicht überschrieben wird.
Alice holt Bob's Public Key:
wget http://<Bob-IP>:8000/pub.pem -O bob_pub.pem
Bob holt Alice's Public Key:
wget http://<Alice-IP>:8000/pub.pem -O alice_pub.pem
Schritt 3 – Namen signieren
Jeder signiert seinen eigenen Namen mit seinem Private Key:
Alice:
python3 xinux-crypt.py --sign Alice
Bob:
python3 xinux-crypt.py --sign Bob
Die Datei signatur.bin enthält die digitale Signatur.
Sie beweist: Nur wer den passenden Private Key besitzt konnte diese Signatur erzeugen.
Schritt 4 – Signatur holen
Jeder holt die Signatur der Gegenseite – wieder mit -O umbenennen:
Alice holt Bob's Signatur:
wget http://<Bob-IP>:8000/signatur.bin -O bob_signatur.bin
Bob holt Alice's Signatur:
wget http://<Alice-IP>:8000/signatur.bin -O alice_signatur.bin
Schritt 5 – Signatur prüfen
Name, Public-Key-Datei und Signatur-Datei werden explizit übergeben – so kann man beliebige Dateinamen verwenden ohne Verwechslungsgefahr.
Alice prüft Bob:
python3 xinux-crypt.py --verify Bob bob_pub.pem bob_signatur.bin
Bob prüft Alice:
python3 xinux-crypt.py --verify Alice alice_pub.pem alice_signatur.bin
Bei Erfolg erscheint:
✓ AUTHENTIFIZIERT: 'Alice'
Das bedeutet: Die Gegenseite besitzt den passenden Private Key zu dem Public Key den wir haben. Die Identität ist bestätigt.
Frage an die Teilnehmer: Was passiert wenn man --verify mit dem falschen Namen aufruft?
Schritt 6 – Diffie-Hellman Key Exchange
Diffie-Hellman ermöglicht es, ein gemeinsames Geheimnis zu berechnen – ohne dieses Geheimnis jemals zu übertragen.
Schritt 6a – Alice initiiert
Alice erzeugt die DH-Parameter und ihren Public Value:
python3 xinux-crypt.py --dh-init
| Datei | Inhalt |
|---|---|
dh_priv.pem |
Alice's DH Private Key (bleibt lokal!) |
dh_params.json |
p, g und Alice's DH Public Value → wird übertragen |
Bob holt die Parameter:
wget http://<Alice-IP>:8000/dh_params.json
Schritt 6b – Bob antwortet
Bob liest die Parameter, generiert seinen eigenen DH Key und berechnet das gemeinsame Geheimnis:
python3 xinux-crypt.py --dh-respond dh_params.json
| Datei | Inhalt |
|---|---|
dh_response.json |
Bob's DH Public Value → wird übertragen |
secret.bin |
Gemeinsamer AES-Key (lokal berechnet) |
Der AES-Key wird im Terminal angezeigt.
Alice holt Bob's Antwort:
wget http://<Bob-IP>:8000/dh_response.json
Schritt 6c – Alice berechnet das Geheimnis
python3 xinux-crypt.py --dh-finish dh_response.json
Alice berechnet nun denselben AES-Key wie Bob – aus Bob's Public Value und ihrem eigenen DH Private Key.
Beide vergleichen den angezeigten AES-Key – er muss identisch sein.
Das ist der Kern von Diffie-Hellman: Beide haben dasselbe Geheimnis berechnet, ohne es jemals übertragen zu haben.
Schritt 7 – Datei verschlüsseln und übertragen
Alice erstellt eine Textdatei und verschlüsselt sie:
echo "Hallo Bob, das ist geheim!" > nachricht.txt
python3 xinux-crypt.py --encrypt nachricht.txt --key secret.bin
| Datei | Inhalt |
|---|---|
nachricht.txt.enc |
IV + AES-CBC Ciphertext |
nachricht.txt.sha256 |
SHA256-Hash des Klartexts |
Der SHA256-Hash kann mit dem Systemtool verglichen werden:
sha256sum nachricht.txt
Bob holt beide Dateien:
wget http://<Alice-IP>:8000/nachricht.txt.enc
wget http://<Alice-IP>:8000/nachricht.txt.sha256
Schritt 8 – Datei entschlüsseln und Hash prüfen
Bob entschlüsselt die Datei:
python3 xinux-crypt.py --decrypt nachricht.txt.enc nachricht.txt.sha256 --key secret.bin
Das Script:
- entschlüsselt den Ciphertext mit dem gemeinsamen AES-Key
- berechnet den SHA256-Hash des entschlüsselten Inhalts
- vergleicht ihn mit dem übertragenen Hash
Bei Erfolg:
✓ INTEGRITÄT OK: Datei wurde nicht verändert!
Die entschlüsselte Datei liegt als nachricht.txt.dec vor.
Frage an die Teilnehmer: Was passiert wenn man ein Byte in der .enc Datei ändert bevor man entschlüsselt?
Übersicht der Dateien
| Datei | Erzeugt von | Übertragen | Beschreibung |
|---|---|---|---|
priv.pem |
--gen-asym-keys | Nein | RSA Private Key |
pub.pem |
--gen-asym-keys | Ja | RSA Public Key |
signatur.bin |
--sign | Ja | Digitale Signatur |
dh_priv.pem |
--dh-init | Nein | DH Private Key |
dh_params.json |
--dh-init | Ja | p, g, DH Public Value |
dh_response.json |
--dh-respond | Ja | DH Public Value (Responder) |
secret.bin |
--dh-respond / --dh-finish | Nein | Gemeinsamer AES-Key |
*.enc |
--encrypt | Ja | Verschlüsselte Datei |
*.sha256 |
--encrypt | Ja | SHA256-Hash des Klartexts |
*.dec |
--decrypt | – | Entschlüsselte Datei (lokal) |
Komplette Befehlsfolge
| Schritt | Alice | Bob |
|---|---|---|
| 1 | --gen-asym-keys |
--gen-asym-keys
|
| 2 | wget Bob/pub.pem -O bob_pub.pem |
wget Alice/pub.pem -O alice_pub.pem
|
| 3 | --sign Alice |
--sign Bob
|
| 4 | wget Bob/signatur.bin -O bob_signatur.bin |
wget Alice/signatur.bin -O alice_signatur.bin
|
| 5 | --verify Bob bob_pub.pem bob_sig.bin |
--verify Alice alice_pub.pem alice_sig.bin
|
| 6a | --dh-init |
wget Alice/dh_params.json -O alice_dh_params.json
|
| 6b | wget Bob/dh_response.json -O bob_dh_response.json |
--dh-respond alice_dh_params.json
|
| 6c | --dh-finish bob_dh_response.json |
– |
| 7 | --encrypt nachricht.txt |
wget Alice/nachricht.txt.enc -O alice_nachricht.txt.enc und wget Alice/nachricht.txt.sha256 -O alice_nachricht.txt.sha256
|
| 8 | – | --decrypt alice_nachricht.txt.enc alice_nachricht.txt.sha256
|