Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1...

28
1 Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento automatico della lingua C) Rottura dei codici Fabio Scotti Laboratorio di programmazione per la sicurezza

Transcript of Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1...

Page 1: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 2: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 3: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 4: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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 .....

Page 5: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 6: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 7: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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 ;}

}

Page 8: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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 ;}

}

Page 9: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 10: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 11: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 12: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 13: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 14: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 15: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 16: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 17: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 18: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 19: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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;

}

Page 20: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 21: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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).

Page 22: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 23: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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

Page 24: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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&…

Page 25: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.

Page 26: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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’

Page 27: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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).

Page 28: Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 19 e 20 Crittografia I A) Tabella dei bigrammi B) Riconoscimento.

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.