Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1...
-
Upload
leonora-masini -
Category
Documents
-
view
217 -
download
3
Transcript of Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1...
1 Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
Lezione 19 e 20Crittografia I
A) Tabella dei bigrammiB) Riconoscimento automatico della linguaC) Rottura dei codici
Fabio Scotti
Laboratorio di programmazione per la sicurezza
2 Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
Lezione 19 e 20
Fabio Scotti
Laboratorio di programmazione per la sicurezza
Tabella dei bigrammi
Obiettivi :
• Comprendere come la tabella dei bigrammi sia composta e come possa essere usata per il riconoscimento automatico di una lingua sia uno strumento utile e per la rottura dei codici crittografici
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
3
Tabella dei bigrammi
• La frequenza delle lettere in una lingua è una peculiarità che, se misurata da un programma, aiuta a riconoscere la lingua e a rompere il codice di Cesare.
• La tabella dei bigrammi è la frequenza con la quale compaiono COPPIE di lettere in una lingua.
• La tabella dei bigrammi è uno strumento che discrimina ancora meglio una lingua e può essere utile nella rottura di altri codici crittografici.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
4
Esempio
Frequenza lettere:
...n=65, A, freq= 0.103848n=66, B, freq= 0.013314n=67, C, freq= 0.103848n=68, D, freq= 0.063906n=69, E, freq= 0.071895n=70, F, freq= 0.026628n=71, G, freq= 0.037279n=72, H, freq= 0.005326
Tabella bigrammi:
Spazio A B C D ...Spazio 1 473 90 596 640 ...A 824 0 55 88 63 ..B 0 32 64 0 0 .C 0 136 0 125 0 .D 22 139 0 0 6 .....
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
5
Lettura della tabella
Tabella bigrammi:
Spazio A B C D...
Spazio 1 473 90 596 640 ...
A 824 0 55 88 63 ..
B 0 32 64 0 0 .
C 0 136 0 125 0 .
D 22 139 0 0 6 .
....Come iniziano le parole in questa lingua
Come finiscono le parole in questa lingua
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
6
Creazione della tabella (1)
• E’ una tabella che deve contenere percentuali (rapporto fra interi, quindi numeri razionali).
• La rappresentiamo in memoria come una matrice di float:
float bigrammi [256][256]; // ascii
float bigrammi [512][512]; // ascii estesa
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
7
Creazione della tabella (2)
char c1, c2 ;float bigrammi[256][256];int numero_Bigram , temp1, temp2, i1 , i2;
… // apro in lettura il file e memorizzo il puntatore in Fp… // inizializzo la matrice bigrammi a zero
while ( fscanf(Fp, "%c", &c1) == 1 ){
while ( fscanf(Fp, "%c", &c2) == 1 ){
if (( c1 < 0 ) || ( c1 > 256 )) || (( c1 < 0 ) || ( c1 > 256 )) { // sono nella tabella ASCII ?
… // inserire codice }
temp1 = (int) c1; // cast raccomandabiletemp2 = (int) c2; // cast raccomandabile
bigrammi[temp1][temp2] = bigrammi[temp1][temp2] + 1;
numero_Bigram = numero_Bigram + 1 ;}
}
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
8
Creazione della tabella (3)
// normalizazzione della matrice
for (i=0; i1<256; i1++) // normalizzazione dei conteggi{
for (i=0; i2<256; i2++) // normalizzazione dei conteggi{
bigrammi[i1][i2] = bigrammi [i1][i2] / numero_Bigram * 100 ;}
}
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
9
Utile funzione Uscita IngressiA a àB bC cD dE e è éF fG gH hI i ìJ jK kL lM mN nO o òP pQ qR rS sT tU u ùV vW wX xY yZ z
char converti(char);
Con questa funzione, si converte, carattere per carattere, un testo in una sequenza di caratteri maiuscoli prima di calcolare la frequenza delle lettere.
10 Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
Lezione 19 e 20
Fabio Scotti
Laboratorio di programmazione per la sicurezza
Riconoscimento della lingua automatcoObiettivi :
• Essere in grado di scrivere programmi per l'identificazione automatica della lingua di un testo
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
11
Riconoscimento automatico
• Il riconoscimento automatico della lingua è utile in molte applicazioni quali:– gli editor di testo (l’impiego dei dizionari dei
sinonimi, la correzione automatica, ecc..);– in campo crittografico (rottura codici
crittografici semplici).
• In particolare ci focalizziamo sul riconoscimento automatico della lingua in base alla distribuzione delle lettere.
• Vengono esaminati i testi non crittati.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
12
Tabella delle frequenze
Frequenza lettere:
Lingua a b
Francese 26 20
Inglese 26 21,2
Italiano 26 20,5
Russo 31 26,5
Spagnolo 26 21
Tedesco 26 21,2
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
13
Metodo di riconoscimento (1)
Esamino il file
Calcolo la frequenza delle lettere
Confronto le frequenzecon quelle note
Determino la lingua
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
14
Metodo di riconoscimento (2)
Esamino il file
Calcolo la frequenza delle lettere
Confronto le frequenzecon quelle note
Determino la lingua
Nel mezzo del cammin di nostra vita …
A = 25,6%B = 19,8%
La lingua più vicina
è l’italiano
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
15
Usando tutte le frequenze
AA
BB
CC
D D
E E
…
PERCENTUALE DI OCCORRENZA (frequenza lettera)
10%
5%
AB C D E …
Scarto percentuale
10%
5%
Lettere
Lettere
LINGUA INCOGNITA
ITALIANO
La somma totale degli scarti è la distanza fra la lingua
incognita e l’italiano
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
16
Progettazione del programma (1)
Cosa serve:
• una funzione produci_frequenza() che dato un file ritorna il vettore delle frequenze delle lettere;
• una funzione calcola_Distanza() che dati due vettori di frequenze ritorna una distanza fra le due lingue.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
17
Progettazione del programma (2)
Come funzionerà il programma:
• usando produci_frequenza():
– dati dei file di testo in italiano, inglese, francese, ecc..., si calcolano le loro frequenze;
– si calcola la frequenza delle lettere del file di lingua incognita;
• usando calcola_Distanza() si confrontano le frequenze del file di lingua incognita con quelle dei file di lingua nota;
Possiamo affermare che il file di lingua incognita è
scritto nella lingua che ha minore scarto totale.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
18
Programma riconoscimento (2)
// qui carichiamo le frequenze di riferimentoproduci_frequenza( "promessiSposi.txt“ , frequenze_ITA , LUN_ALFABETO );produci_frequenza( "othello.txt" , frequenze_ENG , LUN_ALFABETO );produci_frequenza( "marsigliese.txt" , frequenze_FRA , LUN_ALFABETO ); produci_frequenza( "sconosciuta.txt" , frequenze_incognita , LUN_ALFABETO );
// confrontiamo le frequenze // (aggiungere il codice che controlla il massimo)distanza = calcola_Distanza(frequenze_incognita, frequenze_ITA , LUN_ALFABETO );printf("la lingua incongnita dista %f dall'ITALIANO \n" , distanza ) ;
distanza = calcola_Distanza(frequenze_incognita, frequenze_FRA , LUN_ALFABETO );printf("la lingua incongnita dista %f dal FRANCESE \n" , distanza ) ;
distanza = calcola_Distanza(frequenze_incognita, frequenze_ENG , LUN_ALFABETO );printf("la lingua incongnita dista %f dall'INGLESE \n" , distanza ) ;
getchar();exit(0);} // main
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
19
Programma riconoscimento (3)
float calcola_Distanza(float frequenze_1[], float frequenze_2[] , int lunghezza_alfabeto )
{
float distanza;
distanza = 0 ;
// distanza euclidea (applico Pitagora in N dimensioni con N= lunghezza_alfabeto)
for( i = 0; i < lunghezza_alfabeto ; i = i+1 )
{
distanza = distanza + (frequenze_1[i]- frequenze_2[i])*(frequenze_1[i]- frequenze_2[i]);
}
distanza = sqrtf( distanza ); // sqrtf radice quadrata per float
return distanza;
}
20 Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
Lezione 19 e 20
Fabio Scotti
Laboratorio di programmazione per la sicurezza
Rottura dei codici
Obiettivi :
• Comprendere come il riconoscimento automatico di una lingua sia uno strumento utile per la rottura dei codici crittografici
• Essere in grado di scrivere programmi per l'identificazione automatica della lingua di un testo e la rottura dei codici
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
21
Esempi di rottura di codice
• Iniziamo ad esplorare le tecniche per rompere i codici crittografici più semplici: il codice di Cesare e i codici a sostituzione.
• In questa lezione descriviamo i procedimenti e vediamo alcuni programmi ausiliari utili.
• Nelle prossime lezioni scriveremo programmi che automaticamente romperanno il codice.
• Lavoriamo nell’ipotesi di conoscere la lingua nel quale è stato scritto il messaggio crittato (ipotesi successivamente rimuovibile).
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
22
Rottura del codice di Cesare
1. Calcolare le frequenze delle lettere nella lingua in cui si immagina sia scritto il messaggio crittato.
2. Calcoliare le frequenze delle lettere nel messaggio crittato.
3. Sovrapporre le distribuzioni: una delle due viene fatta traslare fino a quando si ottiene la migliore sovrapposizione.
4. La quantità di lettere di cui si è dovuto traslare l'alfabeto della distribuzione costituisce la chiave del cifrario.
3.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
23
Esempio
AA
B
B
CC
D
D
EE …
PERCENTUALE DI OCCORRENZA (frequenza lettera)10%
5%
Lettere
MESSAGGIO CRITTATO
Chiave = 0
Z
Z
A
BC D
F
E …
10%
5%
Z
P A
Q B R C S DT E …
10%
5%
Lettere
Lettere
O Z
Chiave = 1A
B
C
D
E
Chiave = 15
ITALIANO
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
24
Rottura del codice con sostituzione (1)
• Nel caso del codice di Cesare basta trovare UNA chiave per decrittare tutto il codice.
• Nei codici con sostituzione occorre trovare la chiave con la quale è stata crittata ogni lettera.
Ac B&…
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
25
Rottura del codice con sostituzione (2)
• Si utilizza l’approccio con le frequenze di lettera oppure con i bigrammi.
• Perché la statistica possa essere di supporto, occorre che il testo cifrato sia abbastanza lungo.
• E’ anche possibile unire molteplici testi crittati, ma occorre essere certi che siano stati crittati con lo stesso metodo e con la stessa chiave.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
26
Rottura del codice con sostituzione (3)
• In primis si cerca di associare le vocali (frequenza maggiore) guardando le frequenze di lettera, poi le consonanti.
Crittato Lingua Decrittazione
‘k’: 25,8% ‘a’:26% ‘k’’a’
‘b’:20%
‘c’: 7%
…
‘s’: 20,1% ‘b’:20% ‘s’’b’
…
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
27
Rottura del codice con sostituzione (4)
• In secundis si risolvono eventuali dubbi confrontando la tabella dei bigrammi ottenuta dal codice crittato e quella della lingua.
Crittato Lingua Decrittazione
“df”: 0,25%“ab”:0,26% ‘d’’a’ e ‘f’’b’
…
• Questo approccio permette dei controlli incrociati. Ad esempio si controlla se tutti i bigrammi mostrano ‘d’’a’ ecc.. (si usa la conversione maggiormente presente).
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza
28
Controllo del successo
• Per automatizzare il tutto, occorre un criterio per stabilire automaticamente se la rottura del codice ha avuto successo.
• Quando i programmi di decrittazione propongono una soluzione, è possibile verificare che le parole presenti nella soluzione appartengano a dei dizionari.
• Ad esempio se nessuna parola decrittata appartiene ad un dizionario, allora la chiave è sbagliata e occorre provare a decrittare con altre chiavi.