1. Il Problema: La scomparsa della chiave
Se cifriamo due messaggi diversi ($M_1$ e $M_2$) con la stessa chiave ($K$), otteniamo due testi cifrati ($C_1$ e $C_2$).
Cosa succede se un attaccante intercetta entrambi e applica lo XOR tra di loro?
Dimostrazione Matematica:
L'attacco si basa sulla cancellazione della chiave segreta tramite l'operatore XOR:
C1 ⊕ C2 = (M1 ⊕ K) ⊕ (M2 ⊕ K)
1. Espressione iniziale (Intercettazione):
L'attaccante esegue lo XOR tra i due testi cifrati intercettati (C1 e C2):
C1 ⊕ C2 = (M1 ⊕ K) ⊕ (M2 ⊕ K)
2. Applicazione della Proprietà Associativa:
Questa proprietà ci permette di rimuovere o spostare le parentesi per raggruppare i termini in modo diverso:
M1 ⊕ K ⊕ M2 ⊕ K
3. Applicazione della Proprietà Commutativa:
Possiamo cambiare l'ordine degli operandi per avvicinare le due chiavi (K):
M1 ⊕ M2 ⊕ (K ⊕ K)
4. Semplificazione (Proprietà di Involuzione):
Poiché ogni valore combinato con se stesso dà zero (K ⊕ K = 0), la chiave scompare dal calcolo:
C1 ⊕ C2 = M1 ⊕ M2
Risultato: La chiave è sparita! L'attaccante ha ora in mano il risultato dello XOR tra i due messaggi originali.
2. Generazione della vulnerabilità
In questa fase, simuliamo l'errore di un amministratore di sistema che riutilizza la stessa chiave per due comunicazioni diverse.
<?php
// 1. Messaggi (devono avere la stessa lunghezza)
$m1 = "ATTACCO_H10"; // 11 caratteri
$m2 = "RITARDO_H12"; // 11 caratteri
// 2. La chiave deve coprire interamente i messaggi
$chiave_segreta = random_bytes(strlen($m1));
// 3. Cifratura
$c1 = $m1 ^ $chiave_segreta;
$c2 = $m2 ^ $chiave_segreta;
echo "<b>Cifrato 1 (HEX):</b> " . bin2hex($c1) . " (Lunghezza: " . strlen($c1) . " byte)<br>";
echo "<b>Cifrato 2 (HEX):</b> " . bin2hex($c2) . " (Lunghezza: " . strlen($c2) . " byte)<br>";
// 4. Dimostrazione dell'attacco
$risultato_xor = $c1 ^ $c2; // Questo risultato è uguale a ($m1 ^ $m2)
?>
Una volta che l'attaccante ottiene il risultato di M1 ⊕ M2
(chiamato spesso XOR sum o delta), la chiave è sparita, ma i messaggi sono ancora "mescolati" tra loro. Per risalire ai testi in chiaro si utilizza una tecnica chiamata Crib Dragging.
3. L'attacco dell'intercettatore
Supponiamo di essere l'attaccante. Abbiamo intercettato $C1 e $C2, ma non conosciamo la chiave.
Istruzioni:
- Esegui lo XOR tra i due testi cifrati intercettati.
- Analizza il risultato ottenuto.
- Prova a eseguire lo XOR tra il risultato e una parola "probabile" (detta crib) che pensi possa essere contenuta nel primo messaggio.
Attacco Automatizzato con Dizionario (Crib Dragging)
In questo esercizio, simuleremo un attaccante che ha intercettato il Delta ($M_1 \oplus M_2$) e possiede un elenco di termini tecnici usati solitamente nelle comunicazioni militari.
Istruzioni:
- Create un array chiamato
$vocabolariocontenente diverse parole (es. ATTACCO, RITARDO, BASE, NAVI). - Scrivete un ciclo
foreachche prenda ogni parola del dizionario e provi a fare lo XOR contro il Delta. - Sfida: Poiché non sapete in quale posizione si trova la parola, per ora ipotizziamo che inizi all'indice 0.
<?php
// 1. IL DELTA INTERCETTATO (Risultato di C1 ^ C2)
// Rappresenta M1 ^ M2. La chiave è già sparita.
$delta_hex = "0b0a071a0d0e0a0b1c110a";
$delta = hex2bin($delta_hex);
// 2. IL VOSTRO VOCABOLARIO (Cribs)
// ESERCIZIO: Aggiungete altre parole che pensate possano essere nei messaggi
$vocabolario = ["SPOSTA", "ATTACCO", "RITARDO", "OBIETTIVO", "CANCELLA"];
echo "<h5>Tentativi di Decifratura:</h5>";
foreach ($vocabolario as $parola_probabile) {
// Calcoliamo la lunghezza della parola per non andare fuori limite
$len = strlen($parola_probabile);
// ESERCIZIO: Eseguite lo XOR tra la parola probabile e la parte corrispondente del delta
// Suggerimento: usate substr($delta, 0, $len) per prendere solo i byte necessari
$risultato_emerso = substr($delta, 0, $len) ^ $parola_probabile;
echo "Provando con '<b>$parola_probabile</b>' in M1, su M2 appare: <i>$risultato_emerso</i><br>";
}
?>
Come capire se la parola è corretta?
Gli studenti devono osservare l'output:
- Se il risultato emerso è una sequenza di simboli strani (es.
%&/), la parola del vocabolario è errata. - Se il risultato emerso è una parola italiana leggibile (es.
RITARDO), allora avete trovato contemporaneamente una parte di M1 e una parte di M2!
$chiave = $c1 ^ "ATTACCO...";
<?php
// XOR tra i due testi cifrati (Simulazione attacco)
$risultato_attacco = $c1 ^ $c2;
echo "XOR dei Cifrati (HEX): " . bin2hex($risultato_attacco) . "<br>";
// Se l'attaccante ipotizza che il primo messaggio contenga "ATTACCO"
$ipotesi = "ATTACCO";
$recupero_parziale = $risultato_attacco ^ $ipotesi;
echo "Possibile parte del secondo messaggio: " . $recupero_parziale;
?>
4. Esercitazione
Un server ha inviato due stringhe cifrate con la stessa chiave:
C1 = 0b0a071a e C2 = 04051c11 (in HEX).
Sapendo che la prima parola originale era "CASA", scrivi uno script PHP per scoprire:
- Qual era la parola originale del secondo messaggio.
- Qual era la chiave segreta utilizzata dal server.