Sistemi E Reti

Attacco Many Time PAD

Analisi della vulnerabilità Many-Time Pad. Studio dell'attacco crittografico derivante dal riutilizzo della chiave XOR e recupero dei dati in chiaro.

Durata

120 minuti

Software

XAMPP, VS Code

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 $vocabolario contenente diverse parole (es. ATTACCO, RITARDO, BASE, NAVI).
  • Scrivete un ciclo foreach che 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!

💡 Suggerimento Pro: Una volta trovata una parola corretta (es. "ATTACCO"), chiedi agli studenti di calcolare la chiave originale. Basta fare lo XOR tra il messaggio appena scoperto e il file cifrato intercettato all'inizio: $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

Sfida:
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:
  1. Qual era la parola originale del secondo messaggio.
  2. Qual era la chiave segreta utilizzata dal server.



Crittografia, Vulnerabilità, Many-Time Pad, XOR Attack,