ricerche |
|
|||||
modulo 2: STORIA DELLA CRITTOGRAFIA . . . . . . . . . . . . . .
Metodo della sostituzione
3.1.1 Sostituzione a traslazione fissa
3.1.2 Sostituzione a traslazione variabile
3.1.3 Sostituzione alfabetica
Metodo della trasposizione
Metodo a chiave privata (crittografia simmetrica)
3.3.1 Limiti della crittografia simmetrica
Metodo a due chiavi pubblica/privata (crittografia asimmetrica)
3.4.1 Limiti della crittografia asimmetrica
La crittografia ibrida
3.5.1 PGP
Generazione e gestione delle chiavi crittografiche
Crittoanalisi
Keyboard sniffers
TEMPEST
Lettura della memoria
Lettura della cache del disco
Packet sniffers
Cavalli di Troia
Cattive password
modulo 5: LA FIRMA DIGITALE . . . . . . . . . . . . . . . . . .
Fiducia della firma: web of trust
modulo 6: LA CRITTOGRAFIA IN INTERNET . . . . . . . . . . .
SSL: ( Secure Socket Layer )
Bibliografia
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 1
" 2
" 5
" 5
" 7
" 8
" 10
" 12
" 13
" 14
" 17
" 19
" 21
" 27
Innanzi tutto che cosa è la crittografia? Per crittografia si intende la scienza che si occupa di individuare metodi o protocolli crittografici che rendano il contenuto di un messaggio o di un documento comprensibile solo a determinate persone. E' un po' come quando da bambini ci si divertiva ad inventare degli alfabeti in codice per comunicare in segreto con i nostri amici beh quelli possono essere considerati a tutti gli effetti dei metodi di crittazione molto primitivi forse anche poco sicuri, ma pur sempre metodi per crittare un nostro messaggio
Un tempo erano solo spie e militari che si preoccupavano di tenere segreti i propri messaggi. Oggi, la rivoluzione telematica ha aperto un nuovo mercato dove la riservatezza è essenziale per i computer che immagazzinano e si scambiano una quantità sempre più elevata di dati personali.
Chi si trova ogni giorno immerso nel commercio elettronico, ma anche chi semplicemente ha a cuore la riservatezza delle proprie comunicazioni personali, non può negare l'importanza delle tecniche per ottenere la confidenzialità dei dati ora che buste sigillate e schedari chiusi a chiave sono sostituiti da semplici bit.
Nonostante ciò, alcuni governi, come quello statunitense, si oppongono a tecniche che sarebbero impossibili da violare. Il sistema più noto per ottenere confidenzialità in un messaggio è quello di crittografarlo. Per evitare l'impenetrabilità dei messaggi crittografati gli Stati Uniti vorrebbero introdurre una possibilità di controllo 'entrando dalla porta di servizio' che alcuni studi hanno rivelato però controproducente dato che questa "entrata riservata" potrebbe essere scoperta da malintenzionati. Negli ultimi anni è sorta una controversia sull'uso di una crittografia talmente forte da essere impossibile da decifrare da chi non possiede la chiave corretta. Mentre molte aziende e i loro clienti la vedono come un mezzo per mantenere la riservatezza e minimizzare le frodi, alcuni governi, come quello di Washington, la considerano come un veicolo potenziale con cui i terroristi possono sfuggire all'autorità pubblica.
In questo testo ho cercato di esporre con la maggiore completezza possibile le varie tecniche e i numerosi algoritmi di crittografia, dal più semplice al più complesso, e dei sistemi per forzare i testi crittografati da questi algoritmi.
STORIA DELLA CRITTOGRAFIA
La crittografia come modifica volontaria del testo esisteva già al tempo degli egiziani nel 1900 a.C. (tomba del faraone Knumotete II). La parola crittografia ha origine greca e significa 'nascosto'. Un'altra parola correlata è steganografia che significa scrittura nascosta. Un esempio legato all'antichità è di scrivere messaggi segreti non sull'argilla che ricopriva le tavolette, ma sulle stesse tavolette che venivano poi ricoperte d'argilla e sembravano non usate.
Gli Spartani per crittare un messaggio segreto di tipo militare usavano 2500 anni fa una striscia di papiro avvolta a spirale attorno ad un bastone (che costituirà la chiave di decodifica). Una volta scritto il messaggio in verticale sul papiro questo veniva consegnato al destinatario che, con un bastone dello stesso diametro poteva leggere il messaggio in chiaro. Questo metodo è di trasposizione perché il messaggio è in chiaro ma l'ordine delle lettere è da scoprire.
Tra il 360 e il 390 venne compilato da Enea il tattico, generale della lega arcadica, il primo trattato di cifre il cui XXI modulo tratta appunto di messaggi segreti. In questo viene descritto un disco sulla zona esterna del quale erano contenuti 24 fori, ciascuno corrispondente ad una lettera dell'alfabeto. Un filo, partendo da un foro centrale, si avvolgeva passando per i fori delle successive lettere del testo: all'arrivo, riportate le lettere sul disco, si svolgeva il filo segnando le lettere da esso indicate: il testo si doveva poi leggere a rovescio. Le vocali spesso erano sostituite da gruppi di puntini
Un altro metodo, questa volta di sostituzione, è stato inventato da Giulio Cesare: la chiave è un numero n stabilito e si sostituisce ogni lettera del messaggio con l'ennesima seguente.
Esempio: pippo con chiave 3 diventa snssr.
Questo metodo è facilmente attaccabile perchè basta confrontare la frequenza delle lettere nella lingua italiana con la frequenza dei simboli usati nel messaggio cifrato. Bisogna inoltre considerare che le chiavi possibili sono solo 26, quindi al limite con un brute force si potrebbe scovare la chiave. Data la bassa complessità [tanto bassa non è, numero di combinazioni possibili: 26!=4*(10^26)] del metodo usato da Cesare è chiaro che non fosse infallibile, ma dati i risultati militari è stato efficace! Il metodo di Cesare ha ispirato un sistema usato ancora oggi, il ROT-l3 dove la chiave è appunto 13, quindi A->N, B->O, etc.
Il metodo che usavano gli ebrei è detto ATBASH. La sostituzione avviene utilizzando questa tabella dove le lettere della seconda riga sono scritte in ordine decrescente:
a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a
Messaggio: Il Libro di Geremia
Testo Cifrato: Ro Oryil wr Tvivnrz
Lo storico greco Polibio inventò una tecnica di codifica legando le lettere a una coppia di numeri che ne indicava la posizione in una tabella. La coppia di numeri era comunicata nella notte attraverso delle torce. Ecco un esempio di tabella:
|
|
|
|
|
|
|
a |
b |
c |
d |
e |
|
f |
g |
h |
i j |
k |
|
l |
m |
n |
o |
p |
|
q |
r |
s |
t |
u |
|
v |
w |
x |
y |
z |
pippo diventa (3,5) (2,4) (3,5) (3,5) (3,4)
Se la disposizione delle lettere nella tabella non seguono l'ordine alfabetico si capisce la difficoltà di trovare la chiave che in questo caso è la tabella.
L'imperatore romano Augusto usava invece un altro interessante metodo di sostituzione usando come chiave un'altra parola o frase. La chiave e il testo avevano un corrispettivo numerico, il testo cifrato risultava una sfilza di numeri ottenuti come somma fra testo e chiave.
Esempio (testo: spippolatori, chiave: decifralo):
a |
b |
c |
d |
e |
f |
g |
h |
I |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
z |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
testo in chiaro |
s |
p |
i |
p |
p |
o |
l |
a |
t |
o |
r |
i |
chiave |
d |
e |
c |
i |
f |
r |
a |
l |
o |
d |
e |
c |
valore 13testo |
|
|
|
|
|
|
|
|
|
|
|
|
valore chiave |
|
|
|
|
|
|
|
|
|
|
|
|
valore cifrato |
|
|
|
|
|
|
|
|
|
|
|
|
testo cifrato |
z |
u |
n |
b |
v |
h |
m |
m |
m |
s |
z |
n |
Se la somma (valore cifrato) eccede 21 si ricomincia dalla a; ciò equivale a fare una somma modulo 21. La decifrazione è una semplice sottrazione. La criptoanalisi di questo metodo non beneficia della frequenza delle lettere della lingua usata. Questo metodo può essere attaccato con un brute force utilizzando un dizionario di parole. Ovviamente ci si può difendere non usando come chiave parole di senso compiuto, ma un insieme di lettere generate in maniera casuale.
E, se ogni volta si cambia la chiave generandola casualmente, stiamo usando un metodo chiamato One-Time Pad, che è difficile da superare senza conoscere la chiave e generando in maniera davvero' casuale la chiave (e non è facile perchè si può ottenere solo osservando fenomeni casuali naturali). Occorre notare che non bisogna usare questo metodo per due diversi messaggi con la stessa chiave perchè la differenza tra testo cifrato e testo in chiaro è uguale e, in unione a un brute force, aiuta di parecchio la criptoanalisi di questo metodo. Infatti, trascurando il discorso della somma modulo 21 per semplificare il discorso risulta che:
Cifrato1 = Testo1 + Chiave
Cifrato2 = Testo2 + Chiave
Sottraendo si ha:
Altri metodi usatissimi per centinaia di anni prevedevano la sostituzione delle singole parole con altre che costituivano la chiave. Spesso si usavano più metodi insieme. Siamo nel quindicesimo secolo quando nasce la crittografia moderna con Leon Battista Alberti, artista rinascimentale poliedrico, amico di un funzionario pontificio che gli chiese di inventare un metodo di crittografia. L'idea partì dall'osservazione che un criptoanalista può essere aiutato dalle caratteristiche di una lingua come le frequenza delle lettere, le sillabe impossibili o più frequenti, le sequenze di lettere caratteristiche come le desinenze. Per rendere più difficile il lavoro del criptoanalista altro non c'era da fare se non cambiare durante il procedimento l'alfabeto da cui pescare la lettera cifrata: questo è il sistema polialfabetico.
Altro esempio di cifratura con il sistema del polialfabeto è quello inventato da un tedesco contemporaneo dell'Alberti: Johannes Trithemius. Il sistema fa uso di una tabella che si chiama tabula recta, formata da 26 righe (tante quante le lettere dell'alfabeto inglese) riportanti ognuna un alfabeto scalato di una posizione rispetto a quello precedente. La tabella si usa così: la prima lettera da cifrare rimane la stessa, la seconda si cifra con il secondo alfabeto, la terza lettera userà il terzo alfabeto e così via fino a ricominciare dal primo alfabeto dopo la ventiseiesima lettera. Per rendere difficile il lavoro dei criptoanalisti si può usare un alfabeto disordinato o, meglio ancora (è più facile da ricordare e comunicare al destinatario del messaggio) una frase chiave.
L'uso della crittografia continua intensificandosi sempre di più e migliorandosi con il tempo fino ad avere importanza tale da cambiare il corso della storia durante le due guerre mondiali quando appaiono le prime macchine elettriche per cifrare i messaggi ma, soprattutto, per la criptoanalisi. I tedeschi usarono per tutta la seconda guerra mondiale una macchia chiamata Enigma che avrebbe dovuto cifrare i messaggi in maniera sicura. Così non successe, perchè inglesi e polacchi unendo le loro forze furono in grado di decifrare quasi tutti i messaggi intercettati. L'Enigma era una macchina elettromeccanica con contatti, lampadine, rotori e una tastiera. Ogni lettera veniva cifrata con un alfabeto diverso dando luogo ad un numero sproposito di combinazioni che rendevano la decodifica teoricamente impossibile per l'epoca. Ma ciò non fermò gli inglesi che trassero grande beneficio dai messaggi decodificati.
Per anni la regola generale è stata di creare algoritmi semplici e di impiegare chiave molto lunghe per rendere difficile la vita al criptoanalista. Oggi l'orientamento è opposto data la potenza di calcolo di cui si può disporre per fare un bruteforce, quindi si creano algoritmi complicatissimi da decifrare in modo che anche se il nostro avversario avesse parecchio materiale su cui condurre un'analisi, gli sarebbe pressoché inutile.
Oggi la crittografia serve per il commercio elettronico, l'autenticazione, la riservatezza delle informazioni e in centinaia di altri campi e spesso non ce ne rendiamo neanche conto.
Le due principali operazioni che si applicano ai messaggi per codificarli sono: la sostituzione e la trasposizione.
Per sostituzione si intende quell'operazione che permette di cambiare ciascuna lettera di un testo con un'altra, seguendo una regola nota come chiave di cifratura. I metodi più noti sono:
sostituzione a traslazione fissa: detta L la lunghezza dell'alfabeto in uso, normalmente L=26, e K la quota di traslazione, con K<=L, si sostituisce ogni lettera con quella che la segue di K posti in ordine alfabetico, cioè
valore = (valore+K) mod L
dove K ha il significato di chiave di codifica e decodifica. Sotto è riportato un programma in C che esegue tale codifica.
/ ** ** ** ** ** ** ** ** ** ** **
* CRIPTO_1.C *
* codifica con il metodo della sostituzione a traslazione fissa *
** ** ** ** ** ** ** ** ** ** **/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define KEY 1
#define RETURN 13
void main(void)
messaggio_chiaro[i]=0;
messaggio_codificato[i]=0;
printf('nin chiaro: %s',messaggio_chiaro);
printf('nin codice: %s',messaggio_codificato);
}
Forzare un messaggio codificato con questo metodo è veramente banale, dato che è sufficiente provare tutte e 26 le chiavi fino a che si trova il messaggio in chiaro. Questo metodo di forzatura è detto brute forcing.
sostituzione a traslazione variabile, in cui si adotta una chiave della stessa lunghezza del messaggio, composta da tanti valori di K, uno per ogni lettera del messaggio stesso. Per rappresentare efficacemente la chiave si adottano invece di valori numerici, gli equivalenti valori ASCII a partire da A; cioè se K vale 'A' significa traslazione 0, 'B' equivale a traslazione 1, e così via. Questo metodo richiede però una chiave molto lunga, e poiché è facilmente individuabile si preferisce usarla una sola volta. Per questo motivo si ricorre ad un quaderno in cui ogni ina riporta una possibile chiave a traslazione variabile e si utilizza ogni volta una ina nuova (metodo noto con il nome di one-time pad).
Sotto è riportato un elementare esempio di implementazione con questa tecnica.
/ ** ** ** ** ** ** ** ** *************
* CRIPTO_2.C *
* codifica con il metodo della sostituzione a traslazione variabile *
** ** ** ** ** ** ** ** *************/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define KEY 'BNFDJPLMBVCXZASQWEJHFHYBCJDFIRLSRCVGHJMNMKLIUYGFDCF'
#define RETURN 13
#define LMAX 20
void main(void)
messaggio_chiaro[i]=0;
messaggio_codificato[i]=0;
printf('nin chiaro: %s',messaggio_chiaro);
printf('nin codice: %s',messaggio_codificato);
}
sostituzione alfabetica, si adotta una chiave composta da tutte le lettere dell'alfabeto, distribuita casualmente e si sostituisce ogni lettera del messaggio originale con quella che occupa il medesimo posto, in ordine alfabetico, nella chiave. In tal modo la chiave ha una lunghezza inferiore alla precedente, e si è perso il vincolo dell'ordine alfabetico. Questo metodo, come gli altri, ha almeno un grave inconveniente: ogni linguaggio ha una distribuzione di frequenza delle lettere del proprio alfabeto che è notevolmente regolare e l'analisi delle lettere del testo crittografato consente di individuare agevolmente le lettere più frequenti e quelle più rare.
Ad esempio la distribuzione percentuale nella lingua inglese è:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E |
T |
A |
O |
N |
I |
R |
S |
H |
L |
D |
C |
U |
P |
F |
M |
W |
Y |
B |
G |
V |
K |
Q |
X |
J |
Z |
Poiché anche le parole hanno una distribuzione non uniforme, dalla ricerca delle più probabili è relativamente semplice decrittare totalmente il messaggio. Sotto è riportato un programma che implementa questa tecnica.
/ ** ** ** ** ** ** ** ** *************
* CRIPTO_2.C *
* codifica con il metodo della sostituzione alfabetica *
** ** ** ** ** ** ** ** *************/
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define KEY 'QMALZPWNSKXOEBDJCIRVFHGUTY'
#define RETURN 13
void main(void)
messaggio_chiaro[i]=0;
messaggio_codificato[i]=0;
printf('nin chiaro: %s',messaggio_chiaro);
printf('nin codice: %s',messaggio_codificato);
}
Metodo della trasposizione
Nel metodo detto a trasposizione si spostano le lettere che compongono il messaggio. Per fare ciò si può suddividere il testo da codificare privato di qualsiasi carattere non letterale, in tanti gruppi composti da un numero di lettere pari alla lunghezza della chiave e disporli sequenzialmente come in una matrice, per righe: in tal modo ad ogni colonna corrisponde un elemento della chiave e ci saranno tante righe quanti blocchi si riusciranno a fare. Il testo cifrato sarà composto dalla sequenza ordinata in base al valore dei singoli elementi della chiave, delle rispettive colonne di questa matrice. Questa codifica può essere svelata avendo un'idea del contenuto del messaggio e sfruttando la correlazione tra le singole lettere di un dato linguaggio. Con probabili presenze di sequenze di lettere, si effettuano vari ricerche ipotizzando una certa lunghezza di chiave: una volta individuata la sua misura, si procede come per le codifiche precedenti.
Nella ina seguente è riportato un programma che implementa questa tecnica.
/ ** ** ** ** ** ** ** ** *************
* CRIPTO_2.C *
* codifica con il metodo della trasposizione *
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define KEY 2,1,3
#define LKEY 3
#define NBLOC 3
void main(void)
;
char messaggio[NBLOC][LKEY],tasto;
printf('CODIFICA DI TRASPOSIZIONEn');
printf('nImmetti il messaggio composto obbligatoriamente
da %d caratteri alfabetici: ',LKEY*NBLOC);
do
while(i<LKEY*NBLOC);
printf('nin chiaro: ');
for(i=0;i<LKEY*NBLOC;i++) printf('%c',messaggio[i/LKEY][i%LKEY]);
printf('nin codice: ');
for(j=0;j<LKEY;j++)
for(i=0;i<NBLOC;i++)
printf('%c',messaggio[i][chiave[j]-l]);
}
Tutti i metodi crittografici descritti sono stati ben presto abbandonati perché non portavano a soluzioni pienamente soddisfacenti. Le ricerche di questi ultimi anni hanno determinato degli standard riconosciuti, che si indirizzano fondamentalmente verso due filosofie distinte: quella a chiave privata, in cui gli utenti devono mantenere nascosta la loro chiave, e quella a due chiavi, di cui una pubblica e l'altra privata.
Metodo a chiave privata (crittografia simmetrica)
Nella crittografia a chiave privata, detta anche convenzionale o simmetrica, la stessa chiave viene utilizzata sia per cifrare, sia per decifrare il messaggio e deve essere nota solo al mittente e al destinatario (privata, appunto). Questa tecnica viene usata per lo più quando si devono proteggere documenti in locale, sui propri dischi fissi o per rendere sicuro il trasporto di informazioni in un collegamento tra due computer. Gli algoritmi simmetrici disponibili oggi sono numerosi (DES, Triplo-DES, CAST, IDEA etc . ) ed utilizzano tecniche di cifratura spesso assai complicate con chiavi che partono dai 40 bit fino ad arrivare a 256 bit di lunghezza e sono molto veloci nelle operazioni di cifratura-decifratura (il DES arriva ad oltre 1 Gigabit = 1 miliardo di bit al secondo in implementazioni HW e oltre 20 Megabit = 20 milioni di bit al secondo in implementazioni SW).
Il DES (Data Encryption Standard) fu adottato nel 1977 dal governo americano come standard e sviluppato dall'IBM. E' uno dei sistemi di crittografia più sofisticato e contemporaneamente semplice da implementare a livello hardware: si basa su una chiave da 56 bit che opera in 18 stadi in cascata su blocchi di testo da 64 bit, detti ECB (Electronic Code Book).
Il primo e l'ultimo stadio operano solo una trasposizione indipendente dalla chiave, una inversa dell'altra. I sedici stadi intermedi effettuano la medesima operazione di permutazione non lineare e XOR bit a bit tra parte dei dati e porzioni diverse di chiave, in modo da produrre in uscita al sistema una stringa di 64 bit dipendente da 64 bit di ingresso e dalla chiave. L'operazione globale è tale da far sì che la modifica di un singolo bit della stringa d'ingresso o della chiave ha la medesima probabilità di ripercuotersi su uno qualsiasi dei bit della stringa cifrata. Applicando un ECB già crittografato ad un ulteriore processo di codifica con la medesima chiave si riottiene il messaggio originale, il che permette allo stesso dispositivo DES di funzionare sia da codificatore che da decodificatore.
L'operazione di ogni stadio intermedio è così composta: si suddividono i 64 bit entrati in due campi, che chiameremo Ain e Bin. Il campo Bin viene trasferito senza alcuna trasformazione nel rispettivo Aout. Il campo Bout si ottiene facendo un operazione di OR esclusivo tra Ain e una funzione dipendente da Bin e dalla parte chiave relativa a questo stadio.
Un'altra caratteristica interessante di questo algoritmo è che un eventuale errore in un bit della chiave o dei 64 bit da codificare comporta una variazione media del 50% della stringa in uscita: questa proazione dell'errore nel testo codificato assicura una buona protezione contro le possibili alterazioni da parte di estranei ed inoltre non influenza gli altri blocchi da 64 bit che compongono l'intero messaggio. Il pacchetto errato viene immediatamente individuato e isolato.
Gli algoritmi a chiave simmetrica attualmente più in uso sono:
DES
(Data Encryption Standard). Nato nel 1970, è diventato grazie al suo ampio utilizzo uno standard del governo americano. L'algoritmo è progettato per cifrare e decifrare attraverso operazioni di permutazione e sostituzione blocchi di dati di 64 bit, tramite una chiave lunga 56 bit. Per la sua esigua lunghezza, la chiave è individuabile, tra tutte le possibili sequenze di 56 bit, utilizzando adeguate risorse di calcolo. Una variante del DES, il Triple-DES, si basa sull'impiego ripetuto (tre volte consecutive) dell'algoritmo DES con tre chiavi differenti.
IDEA
(International Data Encryption Alghorithm). Allo stesso modo dell'algoritmo DES, IDEA utilizza operazioni di permutazione e sostituzione su blocchi di 64 bit, però con chiavi di lunghezza 128 bit che lo rendono molto più sicuro. IDEA è brevettato negli Stati Uniti e in molti Stati europei. L'utilizzo per scopi non commerciali è comunque libero.
RC4
Sviluppato da Ron Rivest presso RSA Data Security, il codice di questo algoritmo è rimasto segreto per 7 anni (dal 1987 al 1994) fino a quando qualcuno, in anonimo, lo ha pubblicato sulle News Usenet. L'algoritmo, oltre ad essere veloce, utilizza chiavi di differente lunghezza. Si basa essenzialmente sulla generazione casuale di numeri che vengono combinati con il plaintext attraverso l'operazione XOR. RC4 viene soprattutto utilizzato in applicazioni per la sicurezza di connessioni Web.
Metodo
a chiave privata
Limiti della crittografia simmetrica
Molti algoritmi simmetrici hanno un elevato livello di sicurezza (Triplo DES, CAST o IDEA), e quasi tutti basano la loro forza sulla difficoltà (impossibilità) di individuare la chiave usata per generare il crittogramma che hanno prodotto. Per decifrare un messaggio, è necessario conoscere la preziosissima chiave che lo ha cifrato; questo comporta tuttavia un problema: dovendo spedire un messaggio cifrato a qualcuno, è necessario prima far pervenire la chiave a quest'ultimo: come? Serve un canale sicuro, attraverso il quale si possa trasmetterla senza il timore che qualcuno che stia ascoltando abbia la possibilità di interpretare i messaggi, e quindi di impossessarsi della chiave. Se si disponesse di un canale sicuro, però, non servirebbe la crittografia. Inoltre i canali sicuri non possono essere ottenuti facilmente e sono fuori dalla portata dei normali utenti, che, tra l'altro, preferiscono gestire da soli la propria sicurezza.
Il problema si amplifica quando le persone con cui comunicare in maniera confidenziale sono più di una: si è costretti a trasmettere la chiave a più corrispondenti, aumentando il rischio di duplicazioni. E' da scartare subito l'ipotesi di spedire una chiave diversa per ogni persona con cui comunicare, perché ci si troverebbe ogni volta con il problema di doverlo fare in maniera sicura, oltre al dover gestire una improponibile mole di chiavi.
Supponendo comunque di aver trovato il modo per farlo, che fare se la chiave viene rubata ad un proprio corrispondente? Se poi quest'ultimo è una persona distratta e la perde o, peggio ancora, da incosciente la distribuisce a qualcun altro senza autorizzazione? Oltre ad aver perso un amico, si sarebbe costretti a generarne un'altra, a rispedirgliela (magari non solo a lui), e a cifrare di nuovo tutti i documenti cifrati precedentemente con la chiave compromessa. Quest'ultima è una questione importante: con la crittografia simmetrica si è costretti a demandare agli altri il compito di gestire le proprie chiavi segrete.
Senza contare poi, che sicuramente qualche corrispondente non sarà stato avvertito della compromissione della chiave, e continuerà, fiducioso, a spedire documenti confidenziali cifrati con essa. Usata da sola, la crittografia simmetrica può essere ottima per proteggere i dati in locale, quelli che risiedono, ad esempio, sul nostro disco fisso, ma è assolutamente inadatta nelle applicazioni che prevedono lo scambio di messaggi, come nella posta elettronica. La soluzione a questo problema è rappresentata dalla crittografia asimmetrica.
Metodo a due chiavi pubblica/privata (crittografia asimmetrica)
Una categoria di sistemi di crittografia, introdotta alla fine degli anni '70 è quella che parte dal seguente presupposto: se due utenti devono comunicare, ciascuno di loro deve possedere la chiave segreta opportuna, ed in precedenza era relativamente banale passare dalla chiave di codifica a quella di decodifica. La chiave è quindi un segreto condiviso da più utenti e di conseguenza poco affidabile.
E' necessario invece distinguere tra fase di crittografia, in cui si fa ricorso ad una certa chiave che chiameremo Key_T (cioè chiave di chi trasmette), e fase di decifrazione, che utilizza una seconda chiave Key_R (chiave di chi riceve). Se si riesce a fare in modo che il dedurre Key_R da Key_T sia impossibile, o costituisca almeno un processo troppo lungo e difficile tanto da scoraggiarne il tentativo, allora la chiave Key_T può essere resa nota e messa a disposizione di tutti gli utenti, in un ipotetico elenco (tipo quello telefonico) di chiavi di codifica. A questo punto il mittente usa la sua chiave Key_T per crittografare un dato messaggio, e il destinatario, utilizzando la sua chiave Key_R che è privata e specifica per quel particolare interlocutore chiamante, e la chiave Key_T del mittente che è pubblica, è in grado di decifrare correttamente il messaggio.
Metodo
a due chiavi privata
Di seguito viene presentato un possibile algoritmo di codifica che soddisfa alle precedenti specifiche, sviluppato al MIT da un gruppo di ricercatori, tra cui W. Diffie e M. Hellman, e basato su una funzione intera, nota come discrete-log trapdoor.
L'utente A vuole ricevere messaggi codificati: a partire da due numeri primi (a) e (b) molto grandi, ne determina il prodotto, che rappresenta il generatore (g) del sistema. Calcolato il valore h=(a-l)(b-l) determina la sua chiave segreta Key_R che sceglie tra i numeri primi rispetto ad h, e la chiave che renderà pubblica Key_T, in modo che
(Key_R*Key_T) mod h = 1
Per concretizzare con un esempio banale, scegliendo a=3 e b=11 si ricava il valore g=33 e si possono fissare Key_R=3 e Key_T=7. Se l'utente B vuole inviare un messaggio ad A, ricerca nell'elenco pubblico la chiave di A, cioè la coppia di valori Key_T (=7) e g (=33), e per ogni carattere applica la formula
T = M Key_T mod g
Dove M rappresenta il valore di un blocco di messaggio da trasmettere e T la relativa versione codificata da trasmettere. La dimensione del blocco deve essere tale da richiedere un numero n di bit tale che 2n<g.
Nel nostro esempio simbolico, con g=33 possiamo operare con blocchi massimi di 6 bit ciascuno, mentre in realtà si opera su 64 256 bit. Se il nostro messaggio fosse composto dalla semplice codifica ASCII della parola 'ABC', la sua codifica originale sarebbe 41 hex, 42 hex e 43 hex, che riportato in forma binaria:
Raggruppandoli in informazioni di 6 bit e tradotti in decimale otteniamo:
167 mod 33 = 25
207 mod 33 = 26
97 mod 33 = 15
37 mod 33 = 9
Quindi il messaggio crittografato sarà:
E' utile ricordare che chiunque può inviare questo messaggio, in quanto la chiave di trasmissione è pubblica. Il destinatario invece è l'unico che può decrittare questo testo, utilizzando la formula duale, cioè:
R= TKey_R mod g
e riotterrà il messaggio originale.
A partire da questa tecnica crittografica, conosciuta come metodo di Diffie-Hellman, sono state sviluppate varie alternative più o meno efficaci finalizzate a risolvere alcune questioni ancora aperte. Una delle critiche principali, rivolta dalle grandi aziende, è che l'intero sistema si poggia sull'onestà dell'unico funzionario che possiede la chiave di decifrazione. Per ovviare a ciò è stato sviluppato un sistema, ideato sempre al MIT da S. Micali e noto come fair crypto system, in cui la chiave privata è ottenuta a partire da cinque distinti interi mediante la seguente relazione
Key_R = (R1 + R2 + R3 + R4 +R5) mod g
Ogni intero viene scelto e custodito privatamente da altrettanti funzionari, e solo la tecipazione di tutti, ognuno per la sua componente, permette la ricostruzione della chiave di decifrazione, mentre uno da solo non può né risalire alla chiave globale né arrecare un grave danno se decade in sicurezza.
I protocolli crittografici a chiave pubblica attualmente più usati sono:
RSA
(Rivest Shamir Adelman). E' l'algoritmo a chiave pubblica più conosciuto e utilizzato. Può essere impiegato sia per cifrare sia per firmare digitalmente un messaggio. E' considerato molto sicuro quando utilizza chiavi lunghe (512 bit=poco sicuro, 1024 bit=sicuro, 2048 bit=molto sicuro). La sicurezza di RSA si basa sulla difficoltà di fattorizzare grandi numeri interi. E' brevettato negli Stati Uniti fino al 20 settembre 2000, mentre è liberamente utilizzabile altrove.
DSS/DIFFIE-HELLMANN
E' una versione modificata dell'algoritmo di Diffie-Hellmann, sviluppata da Taher Elgamal. La sicurezza dell'algoritmo si basa sulla difficoltà di calcolare un logaritmo discreto in un campo finito. Il brevetto negli Stati Uniti è scaduto il 29 aprile 1997. Viene utilizzato all'interno di PGP (Pretty Good Privacy).
Gli algoritmi di crittografia asimmetrica richiedono l'uso di numerosi e complessi calcoli con valori spesso assai elevati, e questo ne rende le implementazioni software estremamente inefficienti: se il DES sforna 20 Mbit al secondo su una macchine Pentium 100 Mhz, l'RSA arriva, sulla stessa macchina, a circa 20 Kbit al secondo con chiavi da 512 bit (si vedrà più avanti, tra l'altro, che una chiave da soli 512 bit è insicura). La crittografia asimmetrica, quindi, non è utilizzabile per cifrare-decifrare file di una certa lunghezza soprattutto se la si deve usare di frequente. In implementazioni hardware la situazione non cambia: 1 Gbit al secondo per il DES e 300 Kbit al secondo per l'RSA.
Come si è visto, i sistemi di crittografia simmetrica sono efficienti, e sicuri fino a quando la chiave rimane segreta. Gli algoritmi di crittografia a chiave pubblica, invece, risolvono il problema della trasmissione delle chiavi, ma sono lenti nelle operazioni di cifratura-decifratura. I punti deboli di entrambi i sistemi vengono superati dalla cosiddetta crittografia ibrida: il messaggio viene cifrato con un algoritmo simmetrico, usando una chiave casuale creata al momento (session key); tale chiave viene poi cifrata con un algoritmo asimmetrico e trasmessa assieme al messaggio stesso. Chi riceve, prima decifra la chiave simmetrica che accomna il messaggio, e con essa poi decifra quest'ultimo. La session key, non essendo eccessivamente lunga (tipicamente 128 bit), non richiede molto tempo per essere cifrata-decifrata con un algoritmo a chiave pubblica. Molti sono i programmi disponibili per la crittografia ibrida, tra cui PGP (Pretty Good Privacy); solitamente essi permettono di scegliere tra più algoritmi di crittografia simmetrica (PGP offre anche la possibilità di scegliere tra Diffie_Hellman versione ELGamal e RSA per gli algoritmi asimmetrici).
Pretty Good Privacy (PGP) di Phil Zimmerman è il programma di crittografia per eccellenza. Lo scopo principale di PGP é quello di permettere la trasmissione cifrata di messaggi di posta elettronica fra utenti diversi attraverso Internet. In realtà le operazioni possibili sono molteplici. Il PGP utilizza due algoritmi di crittografia: il sistema a chiavi pubbliche RSA e quello a chiavi private IDEA.
Il suo funzionamento é molto semplice: ammettiamo che l'utente A voglia spedire all'utente B un messaggio. PGP cifra tale messaggio utilizzando l'IDEA e una chiave K generata casualmente. Occorrerà spedire all'utente B la chiave K da utilizzare per decifrare il messaggio (ricordiamo che l'IDEA é un algoritmo che utilizza la stessa chiave per cifrare e decifrare il messaggio).
Il PGP risolve brillantemente il problema utilizzando l'RSA. L'utente A, infatti, inserisce la chiave K nel messaggio cifrandola con la chiave Pubblica di B. In questo modo solo B può, con la propria chiave Privata, recuperare la chiave K ed usarla per leggere il resto del messaggio criptato con l'IDEA.
L'RSA, per come é stato definito, permette un'altra importante operazione: l'autenticazione di un messaggio. Se il messaggio viene cifrato utilizzando la chiave privata S invece della chiave pubblica P, si ottiene un messaggio criptato che può essere decriptato utilizzando soltanto la chiave pubblica P. Ma allora, se solo chi é in possesso di S può aver cifrato il messaggio, possiamo star tranquilli che il messaggio é autentico. E' come se l'autore del messaggio, cifrandolo con S, lo avesse firmato.
PGP prevede comunque la creazione di archivi pubblici elettronici che contengano le chiavi pubbliche dei vari utenti. E' importante che si dia la massima diffusione alla propria chiave pubblica perché ciò evita che l'analista C possa frapporsi tra A e B spedendo ad entrambi la propria chiave pubblica facendo credere loro che si tratti invece della chiave pubblica di A o di B. In questo modo C sarebbe in grado di intercettare e leggere ogni messaggio spedito da A a B e viceversa.
Negli ultimi anni è nata la necessità che gli algoritmi di crittografia e le loro implementazioni vengano resi pubblici. Questo consente ai crittologi di tutto il mondo di verificarne la bontà del progetto e l'assenza di punti deboli (casuali o voluti che siano). Se l'algoritmo di crittografia è noto, l'unico elemento che rimane non noto è la chiave, e su di essa deve fondarsi l'intera sicurezza del sistema crittografico.
E' di fondamentale importanza allora, che la generazione delle chiavi sia di altissima qualità. Se il generatore usato è debole, lo sarà l'intero sistema di crittografia. Una chiave, per essere forte, deve essere una sequenza di bit totalmente casuale. La sequenza non deve contenere ridondanze ed i suoi elementi non devono avere nessuna correlazione né fra loro, né con il sistema che li ha generati, intendendo con sistema l'insieme uomo-macchina-parametri ambientali. In poche parole, deve essere altamente entropica.
Per quanto riguarda poi la lunghezza delle chiavi stesse, occorre differenziare tra chiavi simmetriche e chiavi asimmetriche (pubblica-privata). Negli algoritmi simmetrici, un crittogramma generato con una chiave da 56 bit (es. DES) resiste non più di una decina di ore agli attacchi di macchine specializzate del costo di qualche centinaio di milioni.
Il Triplo-DES lavora con l'equivalente di chiavi simmetriche da 112 bit, e quindi le chiavi possibili sono 2112. Quest'ultimo è un numero formidabile. Per dare un'idea dell'enorme (per il momento e per ancora molto tempo irraggiungibile) difficoltà di costruire una macchina che possa 'spazzolare' una così elevata quantità di chiavi, si supponga di avere a disposizione un chip in grado di portare a termine un milione di cifrature-decifrature in Triplo DES al secondo. Non soddisfatti, costruiamo una macchina con un milione di questi chip in parallelo. Questa nostra prodigiosa meraviglia sarebbe in grado di elaborare qualcosa come 1012 (mille miliardi !) di cifrature-decifrature al secondo. Ora:
2112= 5.19 x 1033 operazioni di cifratura-decifratura
5.19 x 1033 / 1012 = 5.19 x 1021 secondi
Visto in secondi non dice nulla, ed anche esprimendolo come 1.65 x 1014 anni non si ha ancora la percezione delle dimensioni. Forse ci si riesce ad impressionare osservando che è un tempo diecimila volte maggiore dell'età stimata dell'universo (che è di circa 15 miliardi di anni). Nel caso della crittografia asimmetrica, le chiavi aumentano parecchio di dimensione: si parte dai 512 bit fino ad arrivare ai 4096 bit. In ogni caso, la scelta della lunghezza deve tenere conto della efficienza dell'algoritmo di cifratura, dei valore dei dati da proteggere e di quanto tempo si vuole mantenerli protetti. Proteggere la lista della spesa con una chiave da 8192 (!!!) bit ha lo stesso senso che proteggere il codice di lancio di un missile nucleare intercontinentale con una chiave da 16 bit.
A VOLTE LA CRITTOGRAFIA E' INUTILE
A volte anche il sistema di crittografia più forte può essere inutile. Perché? Perché qualcuno che vuole raggiungere delle informazioni segrete, non ha bisogno necessariamente di complicati lavori di crittoanalisi da fare. Ecco alcuni possibili attacchi:
Crittoanalisi
Keyboard sniffers
TEMPEST
Lettura della memoria
Lettura della cache del disco
Packet sniffers
Cavalli di Troia
Cattive password
4.1 Crittoanalisi
Parallelamente alla crittografia si è sviluppata un'altra disciplina il cui scopo è quello di individuare delle tecniche (attacchi) per scoprire (rompere) il contenuto di messaggi cifrati senza conoscere la chiave di cifratura. Tale disciplina è nota come crittoanalisi.
La capacità di un protocollo crittografico di resistere agli attacchi viene definita 'robustezza': più un protocollo è robusto, più sofisticati sono gli attacchi a cui deve essere sottoposto per essere compromesso. Due sono i parametri fondamentali che caratterizzano la robustezza di un protocollo crittografico:
la dimensione della chiave
la difficoltà di invertire l'algoritmo di codifica
Il primo attacco che viene considerato per valutare la robustezza di un protocollo crittografico è basato sulla ricerca esaustiva (o a 'forza bruta') nello spazio delle chiavi. L'attacco viene portato a termine assumendo di conoscere l'algoritmo di codifica e un testo cifrato.
Questo attacco consente di rompere tutti i protocolli crittografici che usano chiavi la cui lunghezza è attorno ai 40 bit. In questo caso lo spazio delle chiavi contiene 1.099 miliardi di elementi diversi. Recentemente l'algoritmo a chiave simmetrica DES è stato 'rotto' evidenziando l'inadeguatezza di questo algoritmo per proteggere informazioni particolarmente 'sensibili'. Chiariamo subito che non sono state trovate debolezze, nell'implementazione dell'algoritmo, che permettono di risalire al messaggio senza essere in possesso della chiave. L'attacco all'algoritmo eseguito dalla Cryptography Research è stato del tipo descritto sopra, cioè si provano tutte le possibili chiavi in sequenza fino a quando non si giunge ad un messaggio che possa essere considerato valido. Tutti gli algoritmi crittografici sono soggetti a questo tipo di attacco; il mezzo per combatterlo è quello di aumentare la lunghezza della chiave (o chiavi) in modo da aumentare sensibilmente il numero delle combinazioni possibili.
Come ho già detto in precedenza, l'algoritmo DES utilizza chiavi a 56 bit, cioè è possibile utilizzare esattamente 256 (circa 72 milioni di miliardi) chiavi differenti per poter cifrare un messaggio. All'inizio degli '70 (anno di ideazione) tale valore sembrava più che sufficiente per ripararsi da possibili attacchi a forza bruta, grazie anche alle scarse e costosissime risorse di calcolo disponibili a quei tempi. Il continuo aumento della potenza di calcolo disponibile, ad un prezzo sempre più basso, ha permesso il finanziamento di alcuni progetti mirati a decifrare brani di messaggi cifrati con DES. L'ultimo, finanziato dalla Electronic Frontier Foundation, ha portato alla costruzione di un sistema apposito chiamato Deep Crack. Il costo dell'investimento è stato di poco più di 200.000 dollari. Deep Crack è un chip specializzato che implementa in hardware l'algoritmo DES per cifrare e decifrare in rapida sequenza lo stesso blocco di 64 bit del messaggio con tutte le chiavi possibili. La frequenza del Deep Crack è di 40 Mhz che consente di esaminare 2.500.000 chiavi al secondo per ogni unità di elaborazione. Ogni chip contiene 24 unità di elaborazione, per una capacità di analisi di 60 milioni di chiavi al secondo.
Nell'ultimo modulo della mia tesina ho parlato più specificatamente del brute forcing, come introduzione al mio programma in C.
Keyboard sniffers
Ci sono dei programmi che leggono i tasti quando vengono battuti. Un avversario potrebbe installare questo tipo di software sul vostro sistema, quindi potrebbe leggere la vostra password mentre la usate durante la cifratura dei tuoi documenti. Ci sono vari metodi per fare ciò. Per esempio, ci sono un sacco di strumenti per il 'keyboard sniffing' sulla rete come ad esempio quelli per il Dos. Sto parlando di questo tipo di software perchè e' un po' più complicato installare programmi su sistemi Unix, visto che e' necessario un accesso alla root. Ma come può un avversario installare questo tipo di software sul vostro sistema? Per esempio tramite un virus. Notate che non e' necessario scaricare virus di tipo TSR a tale fine. Infatti un virus di boot può fare tranquillamente questo tipo di lavoro.
TEMPEST
Nel 1985, lo scienziato olandese Wim van Eck pubblicò un documento riguardante i rischi di intercettazione provocati dalle emissioni elettromagnetiche delle unità video. Il suo lavoro provò che le unità video (CRT) le CPU e/o le periferiche, emettevano una radiazione elettromagnetica simile alle onde radio che poteva essere intercettata da una postazione remota ad una certa distanza e con poco sforzo. La risposta del governo americano a questo tipo di monitoraggio fu TEMPEST. TEMPEST sta per Transient ElectroMagnetic PulsE STandard ed e' uno standard per la protezione da emissione di onde elettromagnetiche dei sistemi di computer. Così il governo degli Stati Uniti creò questo standard per misurare le emissioni elettromagnetiche dei computer e definire i limiti per la sicurezza sul monitoraggio. Gli standard sono definiti nel documento NACSIM 5100A (classificato dalla NSA - National Security Agency). Non e' neanche troppo costoso installare un congegno e puntare una antenna per effettuare delle intercettazioni TEMPEST. Per esempio, qualcuno potrebbe installare tale congegno all'interno di un furgone e puntare un'antenna in modo da leggere tutto quello che state digitando - e vedendo - sul vostro computer. Così, per evitare questo problema, le parti del tuo computer dovrebbero essere certificate, in altre parole, dovrebbero essere effettivamente schermate.
Lettura della memoria
In un sistema multi-utente quale quello Unix, e' possibile leggere la memoria fisica della macchina da qualsiasi persona con i necessari privilegi (di solito i privilegi di root). Se hai privilegi di root ad esempio, puoi accedere alla memoria virtuale del sistema (/dev/kmem) e leggere la ina di un utente.
Lettura della cache del disco
In un ambiente multi-tasking come Windows, i dati sono riversati dalla memoria su disco e viceversa. Questo accade su sistemi che usano la memoria virtuale. Infatti il sistema operativo simula una RAM (Random Access Memory) di dimensioni molto superiori a quella reale dividendo i dati in ine che sono riversate sul/da disco. Le ine usate più frequentemente sono all'interno della RAM, ma le altre sono registrate all'interno dell'hard disk. Quando un programma richiede una particolare ina che non e' sulla RAM, il sistema operativo la carica. In altre parole, i dischi sono una sorta di 'finta' estensione della RAM. Di solito i dati riversati su disco sono memorizzati all'interno di un file di swap. Bene, in un ambiente di rete, chiunque ha accesso alla macchina, può leggere un file di swap, o persino rubarlo.
Packet sniffers
Se non usate un qualsiasi tipo di utility di cifratura o un protocollo di rete sicuro, inviate la vostra passphrase sulla rete come testo in chiaro. Perciò un 'packet sniffer' installato tra il vostro terminale e l'host al quale state inviando la passphrase (e dovreste notare che fra voi e l'host destinatario ci sono vari nodi dove si possono installare dei packet sniffer), può facilmente catturare questa informazione. Per esempio, i packet sniffer possono essere sensibili a certe parole come Visa, MasterCard e così via. Per questa ragione dovreste evitare di inviare numeri di sectiune di credito senza usare un protocollo sicuro. Inoltre, per evitare questo problema, prima di tutto non dovreste inviare alcuna password via e-mail senza usare un qualche tipo di programma di cifratura (come PGP per esempio)! Poi, potreste usare una password 'one-time' (una password utile solamente una volta; una volta usata diventa inutilizzabile e deve essere necessariamente cambiata), così, anche se un packet sniffer cattura la vostra password, non importa, infatti il tizio che ha 'sniffato' non può usarla, perché e' già stata usata una volta!
Cavalli di Troia
Cos'è un cavallo di Troia? E' un programma apparentemente innocuo che fa tutte le cose che vi aspettate che debba fare. Ma e' in realtà un programma subdolo che, come il cavallo di Troia di Ulisse, contiene delle istruzioni pericolose all'interno. Quelle istruzioni possono registrare la vostra passphrase segreta e, se e' disponibile un modem, inviarla ad un host predefinito. Purtroppo, non puoi rilevare un cavallo di Troia prima che la sua azione subdola si manifesti. Gli antivirus non possono rilevare i cavalli di Troia, perché questi sembrano proprio degli innocui e normali programmi.
Cattive password
Un grosso problema diffuso sulla rete è quello delle cattive password. Spesso la gente sceglie delle cattive password, come i nomi di persone, le date, parole comuni e così via. Il problema e' che alcuni programmi - chiamati password cracker - possono trovare facilmente questo tipo di password. I password crackers usano dizionari per tentare tutte le parole continuamente fino a quando non trovano la giusta password. Se provate un buon password cracker su una macchina di media potenza, diciamo una macchina di tipo Pentium, potreste trovare una cattiva password in qualche ora! Per questa ragione dovreste evitare di scegliere il vostro nome od il cognome, la vostra data di nascita, nomi di persone, parole comuni, nomi di paesi, animali e così via come password! Perciò dovreste usare un qualche tipo di frase (non usate proverbi! Alcuni password cracker avanzati conoscono i proverbi) che potete ricordare, poi prendete le iniziali di ogni parola della frase e riunitele insieme per formare la vostra password. Per esempio una frase come questa: 'il Mio Cane Mangia 2 Salsicce Ogni Settimana!' e' una frase corretta. La password e': MCM2SOS! Inoltre dovreste usare segni di punteggiatura, numeri e caratteri speciali. Nell'esempio precedente infatti, ci sono 6 lettere 1 numero ed un segno di punteggiatura.
LA FIRMA DIGITALE
Strettamente collegata al concetto di crittografia, la firma digitale è un'strumento che mi permette di autentificare i documenti trasferiti nella rete. L'autenticazione è il procedimento con il quale si può provare (certificare) l'identità del mittente e l'autenticità del contenuto, in modo da essere sicuri che il messaggio non sia stato modificato o alterato durante il viaggio a causa di una manomissione o di semplici errori di trasmissione. Autenticando il messaggio infatti il suo contenuto non viene criptato e rimane quindi leggibile a tutti, viene però aggiunta in coda una firma elettronica cioè una stringa di bits che appare come una serie di caratteri illeggibili alla fine del messaggio.
Questa firma si ottiene codificando attraverso la chiave crittografica quello che tecnicamente si chiama digest o hash del contenuto del messaggio, cioè il rimescolamento di tutto ciò che abbiamo inserito nel testo. Il rimescolamento è determinato in modo univoco attraverso l'algoritmo di hashing, cioè una serie di operazioni matematiche e logiche talvolta molto complesse che hanno lo scopo di creare una specie di riassunto del messaggio ottenendone una stringa rappresentativa (tipo il checksum di un file ma più complesso), in modo tale che dati 2 messaggi diversi essi abbiano sempre 2 digests differenti e dato un digest non sia mai possibile invertire il processo ottenendo il messaggio originale né creare un messaggio apposito che abbia lo stesso digest dato. Ovviamente il 'sempre' va preso con le dovute cautele in senso probabilistico, in pratica oggi si sono messi a punto algoritmi di hashing che riducono la possibilità di avere 2 digests uguali da messaggi diversi a 1 su circa 4 miliardi di possibilità.
Ricevuto il messaggio firmato elettronicamente, il destinatario decifra la firma, attraverso la chiave crittografica, ottenendo così il digest calcolato dal mittente e lo confronta con il digest da lui ricalcolato applicando nuovamente l'algoritmo di hashing alla parte in chiaro del messaggio ricevuto. Se i due digests sono uguali si ha la garanzia che il contenuto non è stato modificato ed è proprio quello scritto dal mittente, poiché dato un digest (quello criptato nella firma) è praticamente impossibile riuscire a scrivere un altro messaggio (da sostituire a quello in chiaro) che restituisca lo stesso digest.
Dato che la chiave usata per firmare il digest è in possesso di una sola persona, è ovvio che la mail è stata spedita e firmata proprio dal mittente, inteso non come il possessore dell'indirizzo email da cui proviene il messaggio ma come colui che ha la chiave che ha firmato il messaggio (solo lui infatti ha la chiave usata per codificare il digest), in questo modo sono sicuro che il documento ricevuto è autentico.
Il principale algoritmo per la firma digitale è il DSA.
DSA Digital Signature Algorithm
Sviluppato dal NIST per essere utilizzato all'interno del Digital Signature Standard (DSS), utilizza una chiave pubblica per verificare l'identità del mittente e l'integrità dei dati inviati dallo stesso. Tramite uno schema a chiave pubblica utilizza una coppia di trasformazioni per generare e verificare un valore chiamato firma. E' stato proposto dalla NIST come alternativa all'RSA.
Come si firma un messaggio con un protocollo a chiave asimmetrica
Come fa Luigi a fidarsi che quello ricevuto è un messaggio inviato da Roberto e non da un impostore che lo vuole mandare in bancarotta? Semplicemente utilizza la chiave pubblica di Roberto per verificare che la firma al messaggio sia proprio la sua. Luigi in questo modo è anche sicuro che nessuno nel frattempo abbia cambiato il nome delle azioni o il consiglio di vendere anziché acquistare.
5.1 Fiducia della firma: web of trust
Il sospetto che potrebbe sorgere ad un utente che riceve una chiave pubblica è che la chiave ricevuta non appartenga effettivamente alla persona a cui desidera scrivere. Ciò implica che non ci si può fidare nemmeno della firma digitale di quell'utente. Infatti la garanzia di autenticità di una firma digitale si ha solo se si ha la certezza che la chiave pubblica che la verifica matematicamente appartiene realmente al suo ufficiale proprietario. E' possibile che un utente malintenzionato sostituisca la chiave di un utente con una chiave pubblica creata apposta per poter intercettare le comunicazioni riservate di quell'utente. Chiariamo il problema con un esempio.
Franco genera sul proprio computer una coppia di chiavi e inserisce come nome e indirizzo di posta elettronica le informazioni di Peppe. Successivamente invia ad un keyserver la chiave pubblica così generata. Sara, che vuole scrivere un messaggio confidenziale a Peppe, richiede ad un keyserver la chiave pubblica di Peppe e riceve quella falsa creata ad arte da Franco. Sara, ignara del falso, scrive il messaggio, lo cifra con la falsa chiave e lo invia a Peppe. Franco intercetta il messaggio lo decifra (lui può, ha la chiave privata corrispondente!), lo legge e/o lo modifica, lo cifra con la vera chiave di Peppe (che lui conosce) e lo invia all'ignaro Peppe.
Per evitare che simili casi si verifichino, si può far apporre una firma digitale alla chiave pubblica da un ente o persona della quale entrambe le parti si fidano. Se le firme sono di persone di nostra fiducia, che sappiamo non spenderebbero il loro nome se non fossero sicure della corrispondenza tra il proprietario e la chiave, esse ci garantiscono dell'autenticità della chiave pubblica e quindi della firma digitale che abbiamo verificato. Continuando l'esempio, supponiamo che Sara e Peppe si fidino entrambi di Tito. Questi, dopo aver verificato che la chiave pubblica di Peppe gli appartenga effettivamente appone la propria firma (tramite la propria chiave privata) sulla chiave di Peppe. Sara, quando riceverà la chiave pubblica di Peppe, controllerà che su di essa ci sia la firma di Tito. Trovandola, potrà essere sicura che quella è la chiave di Peppe.
Quante più firme di persone che godono della nostra fiducia ha una chiave, tanto maggiore è il grado di fiducia nella sua autenticità che possiamo riporvi. Poiché la sequenza delle firme non è organizzata secondo alcuna gerarchia formale che attribuisce maggiore o minore valore all'una o all'altra, ma ha valore in funzione della fiducia nelle singole firme, si crea una rete di fiducia nota come 'Web of Trust'. Si noti che il Web of Trust è personale e non formalizzato da enti e/o istituzioni.
LA CRITTOGRAFIA IN INTERNET
Sebbene il problema della sicurezza all'interno delle reti di calcolatori sia sempre stato motivo di grande attenzione da parte degli addetti ai lavori, con la crescita esponenziale degli utenti di Internet e con il progressivo affermarsi di strumenti commerciali e finanziari basati sul web, la crittografia e la sua applicazione nella ricerca di sistemi per l'implementazione di transazioni sicure sono al momento uno dei temi che richiedono più energie agli esperti di applicazioni nell'area Internet.
La sicurezza della transazione dipende almeno da tre fattori principali:
Sistemi - la sicurezza fisica dei server è uno dei primi temi da affrontare: qualsiasi sia la piattaforma, sarà bene analizzare la tipologia di struttura che si occupa del routing verso il resto della rete sia dal punto di vista dei meccanismi passivi che attivi (gateway, router, firewall, proxy, ecc.).
Software dedicati alla fornitura dei servizi - pensiamo, ad esempio, ad un web server: anche dalla conurazione di questo software può dipendere la sicurezza dei dati scambiati con l'esterno.
Protocolli - il protocollo, sia esso a livello di rete che a livello applicativo, è un altro elemento delicato della sicurezza: introdurre meccanismi crittografici in quest'area può essere molto efficace e in alcuni casi (per esempio transazioni commerciali sicure) indispensabili. Osservando la ura seguente si nota come la sicurezza del protocollo si può scalare a diversi livelli.
Nel caso a), il meccanismo crittografico è introdotto con il protocollo di trasporto: in questo modo tutti gli strati applicativi sovrastanti potranno contare su una connessione sicura e il programmatore può eventualmente diminuire l'overhead dell'applicazione dedicato alla gestione della sicurezza transazionale. Nel caso b) la situazione è opposta: il meccanismo di trasporto non fornisce alcuna garanzia, siamo quindi obbligati ad intervenire con protocolli di sicurezza a livello di applicazione.
Come noto, la comunicazione su cui si basa Internet è resa possibile (a livello di trasferimento delle informazioni) dal protocollo TCP/IP. Tale protocollo però non è in grado di garantire la privatezza di quanto è trasmesso; questo inconveniente diventa particolarmente grave nel caso di VPN (Virtual Private Network) ovvero di reti private che basano parte della loro architettura sul trasporto attraverso una rete pubblica: basti pensare ad esempio a un'azienda con molti uffici in luoghi geograficamente distribuiti che vuole impiegare Internet per trasferire dati tra le diverse sedi in modo economico e sicuro. In questo caso l'unica soluzione è nell'impiego di un protocollo IP sicuro come l'IPSEC. Si tratta di un protocollo pubblico che si basa sulla modifica dei pacchetti IP: ogni pacchetto subisce una modifica dell'intestazione che oltre al normale IP Header conterrà un'intestazione di autenticazione IPSEC contenente i dati per autenticare l'origine seguita dai dati criptati; solo il destinatario avrà modo di effettuare le operazioni di traduzione per il corretto trasferimento ai livelli OSI superiori. Mentre questo meccanismo è particolarmente indicato in una rete locale, per altri tipi di servizi (tipicamente le transazioni commerciali su rete pubblica) può essere più idoneo l'uso di protocolli di più alto livello, come il Secure Socket Layer (SSL).
SSL: ( Secure Socket Layer )
SSL è un protocollo aperto basato sulla crittografia, non proprietario (cioè è interamente disponibile), sviluppato da Netscape nel 1994 per la comunicazione sicura via web. Il protocollo opera tra il livello di trasporto dello stack TCP-IP e i protocolli per le applicazioni quali HTTP (Hyper Text Transfert Protocol) per le trasmissioni web, NTTP (Network News Transfert Protocol) per le News Usenet, e SMTP (Simple Mail Transfert Protocol) per l'invio e la ricezione delle mail. Tramite SSL vengono forniti i seguenti servizi:
Autenticazione del server, attraverso certificati digitali (scoraggiando in questi modi gli impostori); opzionalmente può essere effettuata anche una autenticazione del client (browser).
Trasmissione confidenziale attraverso la cifratura delle informazioni (per prevenire l'intercettazione delle informazioni);
Integrità dei dati (contro le alterazioni).
SSL utilizza un sistema di crittografia a chiave pubblica, per l'autenticazione del server e del client, ed una chiave simmetrica, che deve essere concordata ad ogni connessione tra il server e il client, per la cifratura delle informazioni trasmesse.
SSL mette a disposizione differenti algoritmi:
RSA algoritmo a chiave asimmetrica e certificati X.509 per l'autenticazione del server e del client;
DES, TRIPLE-DES, RC4 algoritmi a chiave simmetrica per cifratura della informazioni;
MD5, SHA per la generazione del message digest dei messaggi inviati.
La combinazione di algoritmi utilizzati viene chiamata suite. Al momento della connessione il client e il server concordano quale suite utilizzare. In generale, i due concordano il metodo con cifratura più forte che hanno in comune.
Vediamo brevemente come avviene il processo per una connessione con SSL:
Il client apre una connessione verso il server e gli invia un messaggio chiamato 'CLIENTHELLO' che include la versione SSL utilizzata, quali algoritmi utilizza per la cifratura del canale di trasmissione, e la propria chiave pubblica.
Il server risponde con un messaggio 'SERVERHELLO' contenente il proprio certificato cifrato con la chiave pubblica del client.
Il client verificata l'autenticità del server (controlla la presenza, sul certificato della firma di una autorità di certificazione di cui il client si fida) e invia al server una richiesta per ottenere una chiave di sessione.
Il server genera la chiave di sessione e la invia cifrata con la chiave del client allo stesso.
Il client e il server si inviano rispettivamente messaggi per la conferma della chiave di sessione.
Inizia la comunicazione sicura tra il server e il client.
Quando vogliamo contattare un server HTTP che supporta l'utilizzo di SSL sarà sufficiente sostituire il classico https:// che utilizziamo solitamente con https:// dove la esse finale significa secure. Le connessioni SSL sono visibilmente più lente rispetto a quello ordinarie. Per poter utilizzare SSL l'utente non deve acquistare nessun software aggiuntivo; è sufficiente l'utilizzo di un browser. Quando entriamo in un sito del genere, ad esempio quello di una banca o di una società di trading on line, il browser visualizza un lucchetto giallo (ura sopra) nella barra inferiore.
Brute forcing viene definito quel metodo di ricerca della password che fa uso di tutte le combinazioni possibili, e viene utilizzato quando la complessità di un algoritmo di crittazione ne rende praticamente impossibile un recupero istantaneo. Facciamo un esempio banale. Ammettiamo che io faccia indovinare a una persona un numero che ho pensato e gli dicessi che è di 3 cifre. Egli non potrebbe sapere a priori secondo logica quale numero abbia pensato, non ci può quindi arrivare per 'intuizione', né ha modo di leggermi nel pensiero. Per cui, visto che non gli ho messo un limite come tentativi decide per ordine di provare tutti i casi possibili. Ecco, in questo modo sta facendo un brute forcing. Bisogna tener conto che nella realtà non saremo noi mentalmente a tentare un brute forcing ma un programma scritto ad hoc per questo (in molti casi macchine con chip concepiti proprio per il brute forcing), che forzerà tutte le possibili combinazioni una alla volta. Inutile dire che se la password è abbastanza forte, il brute forcing può richiedere dei tempi spropositati prima di arrivare a trovare la giusta combinazione.
Prendiamo come esempio il software Word 97. E' un programma avanzato di elaborazione testi e ci permette di aumentare la riservatezza dei nostri documenti vincolandoli ad una password, nel momento del salvataggio, con la quale viene crittato il nostro documento. Questo protocollo di crittazione viene definito a chiave simmetrica. Le password di Word 97 insieme agli altri prodotti Office 97 (e successivi) usano degli algoritmi abbastanza buoni che obbligano all'uso del brute forcing per un loro recupero. Specifico '97 perché le precedenti versioni di word o excel usavano dei protocolli di crittazione così semplici che le passwords potevano essere recuperate tramite algoritmo istantaneamente. Per quanto riguarda il brute forcing è importante conoscere quante sono le possibili combinazioni che dovremo provare. Queste le sappiamo facendo:
N^M dove N è la quantità di caratteri che possono virtualmente essere presenti nella nostra password ed M è la lunghezza massima.
Nel caso di Word 97 possiamo inserire una password di lunghezza max pari a 15 caratteri utilizzando 96 tipi di caratteri differenti, tra maiuscole, minuscole e simboli ascii. Se avessimo scelto una password di 15 caratteri, avremmo avuto, calcolatrice alla mano 96^15=542.086.379.700.000.000.000.000.000.000 combinazioni!! A questo punto però entra in gioco la bontà del nostro programma e la velocità del nostro processore, perché ora ci interessa sapere quante combinazioni saremmo stati in grado di provare in un secondo. Ecco ora di seguito una tabella che mostra i tempi di brute forcing utilizzando un programma della Soft4you per il recovery di password di Office 97 su un Pentium II 200 Mhz:
lungh.pwd |
26 (lettere minuscole) |
36 (lettere minuscole + numeri) |
56 (lettere min. e maiusc.) |
96 (tutti i caratteri) |
|
istantanea |
1 minuto |
6 minuti |
71 minuti |
|
10 minuti |
50 minuti |
5 ore |
5 giorni |
|
4 ore |
30 ore |
12 giorni |
15 mesi |
|
5 giorni |
45 giorni |
20 mesi |
121 anni |
|
4 mesi |
5 anni |
86 anni |
11.600 anni |
|
9 anni |
163 anni |
4469 anni |
+ 1 milione anni |
Come vedete, se la lunghezza della password è superiore a 8 caratteri, il recupero tramite brute forcing su un computer domestico, considerando una password tipo 'a45/.KG_?' diventa molto problematico per non dire quasi impossibile. Per cui se si vuole sfruttare bene la protezione messa a punto per un documento di word 97 conviene scegliere una password di almeno 8 caratteri che comprenda lettere minuscole, maiuscole, numeri e altri segni ascii. E bisogna sperare che nel documento non ci sia materiale che possa interessare la CIA o altri organizzazioni molto grosse se no non penso bastino 10 caratteri per fare sogni tranquilli) E tutto poi è relativo a quanto sono disposti a spendere gli altri per sapere il contenuto del nostro documento tutto il resto è numeri.
Prendiamo ora in considerazione un'altro programma, molto diffuso, il compattatore Winzip. Un file da noi zippato può essere anche vincolato a password e con questa crittato (anche questo fa uso di un protocollo a chiave simmetrica). Ora, Winzip ci consente di inserire una password lunga fino a 100 caratteri. Winzip fino alla versione 7 (quella attuale), utilizza il formato di crittazione standard Zip 2 Encryption. E' un protocollo efficiente contro attacchi domestici, ma non a livello del protocollo DES o RSA per le chiavi pubbliche. La giustificazione per cui nel programma Winzip non viene utilizzato un protocollo più forte è che:
1. altre utility Zip non sarebbero in grado di decifrarlo;
2. negli Stati Uniti il governo impone delle severe restrizioni all'esportazione di algoritmi di crittazione.
Nonostante questo, tenete conto che i vari password cracker per Winzip utilizzabili sui nostri pc arrivano a fare al massimo 1 milione di tentativi al secondo, e anche considerando la possibilità di dividere il lavoro su più computer, comunque, se la password è come nel caso di word 97, abbastanza lunga e 'varia', richiederebbe per un utente domestico un tempo spropositato per trovarla. Diverso è il caso in cui la nostra password non è una successione random di lettere e numeri ma una parola o + parole combinate tra di loro. Perché a quel punto verrà utilizzato un metodo di approccio più pratico del brute forcing, che è quello del dictionary search. Il punto è questo. Il più delle volte le passwords sono scelte da 'persone', e le persone usano determinate parole più di altre. Ci sono vocabolari appositi che contengono un database di tutte queste parole più frequenti. Buoni vocabolari ne contengono centinaia di migliaia. Con questo sistema, un intero vocabolario potrà essere controllato in pochi minuti.
FREQUENZE RELATIVE E PERCENTUALI DELLE LETTERE SINGOLE
A ----------> 0,114
B ----------> 0,011
C ----------> 0,042
D ----------> 0,038
E ----------> 0,111
F ----------> 0,009
G ----------> 0,018
H ----------> 0,011
I -----------> 0,104
J -----------> 0,000
K ----------> 0,000
L ----------> 0,064
M ----------> 0,029
N ----------> 0,064
O ----------> 0,099
P ----------> 0,028
Q ----------> 0,006
R ----------> 0,065
S -----------> 0,051
T ----------> 0,068
U ----------> 0,035
V ----------> 0,023
W ----------> 0,000
Y ----------> 0,000
X ----------> 0,000
Z-----------> 0,008
Ipotizziamo di intercettare un file crittato e di conoscere la tecnica di crittografia utilizzata su di esso (il mio programma in C decritta solo file codificati con il metodo di sostituzione a traslazione fissa, ma il suo scopo è solamente quello di dimostrare l'efficacia dell'analisi delle frequenze che invece può essere utilizzata per qualsiasi tipo di algoritmo).
Noi sappiamo che è stato utilizzato il metodo di sostituzione a traslazione fissa quindi crittografiamo il file con le 26 possibili chiavi (dalla 'A' alla 'Z') ottenendo così 26 possibili files originali. Per stabilire quale di questi è quello giusto analizziamo le loro distribuzioni di frequenza delle lettere singole ottenendo una tabella come quella precedente per ogni possibile chiave. Il testo decrittografato esatto sarà quello che avrà una tabella delle frequenze molto simile a quella generale riportata sopra. Detto matematicamente, se
la decodifica esatta avrà v che si approssima a 0. Nell'esempio:
KEY K |
|
P |
o |
s |
s |
i |
b |
i |
l |
i |
|
d |
e |
c |
o |
d |
i |
f |
i |
c |
h |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
V |
a |
f |
x |
x |
z |
|
w |
r |
|
t |
r |
c |
u |
f |
|
d |
r |
|
u |
f |
d |
r |
e |
z |
|
z |
c |
|
k |
v |
d |
g |
f |
|
t |
r |
d |
s |
z |
v |
i |
r |
|
b |
g |
y |
y |
a |
|
x |
s |
|
u |
s |
d |
v |
g |
|
e |
s |
|
v |
g |
e |
s |
f |
a |
|
a |
d |
|
l |
w |
e |
h |
g |
|
u |
s |
e |
t |
a |
w |
j |
s |
|
c |
h |
z |
z |
b |
|
y |
t |
|
v |
t |
e |
w |
h |
|
f |
t |
|
w |
h |
f |
t |
g |
b |
|
b |
e |
|
m |
x |
f |
i |
h |
|
v |
t |
f |
u |
b |
x |
k |
t |
|
d |
i |
a |
a |
c |
|
z |
u |
|
w |
u |
f |
x |
i |
|
g |
u |
|
x |
i |
g |
u |
h |
c |
|
c |
f |
|
n |
y |
g |
j |
i |
|
w |
u |
g |
v |
c |
y |
l |
u |
|
e |
j |
b |
b |
d |
|
a |
v |
|
x |
v |
g |
y |
j |
|
h |
v |
|
y |
j |
h |
v |
i |
d |
|
d |
g |
|
o |
z |
h |
k |
j |
|
x |
v |
h |
w |
d |
z |
m |
v |
|
f |
k |
c |
c |
e |
|
b |
w |
|
y |
w |
h |
z |
k |
|
i |
w |
|
z |
k |
i |
w |
j |
e |
|
e |
h |
|
p |
a |
i |
l |
k |
|
y |
w |
i |
x |
e |
a |
n |
w |
|
g |
l |
d |
d |
f |
|
c |
x |
|
z |
x |
i |
a |
l |
|
j |
x |
|
a |
l |
j |
x |
k |
f |
|
f |
i |
|
q |
b |
j |
m |
l |
|
z |
x |
j |
y |
f |
b |
o |
x |
|
h |
m |
e |
e |
g |
|
d |
y |
|
a |
y |
j |
b |
m |
|
k |
y |
|
b |
m |
k |
y |
l |
g |
|
g |
j |
|
r |
c |
k |
n |
m |
|
a |
y |
k |
z |
g |
c |
p |
y |
|
i |
n |
f |
f |
h |
|
e |
z |
|
b |
z |
k |
c |
n |
|
l |
z |
|
c |
n |
l |
z |
m |
h |
|
h |
k |
|
s |
d |
l |
o |
n |
|
b |
z |
l |
a |
h |
d |
q |
z |
|
j |
O |
g |
g |
i |
|
f |
a |
|
c |
a |
l |
d |
o |
|
m |
a |
|
d |
o |
m |
a |
n |
i |
|
i |
l |
|
t |
e |
m |
p |
o |
|
c |
a |
m |
b |
i |
e |
r |
a |
|
k |
P |
h |
h |
j |
|
g |
b |
|
d |
b |
m |
e |
p |
|
n |
b |
|
e |
p |
n |
b |
o |
j |
|
j |
m |
|
u |
f |
n |
q |
p |
|
d |
b |
n |
c |
j |
f |
s |
b |
|
l |
q |
i |
i |
k |
|
h |
c |
|
e |
c |
n |
f |
q |
|
o |
c |
|
f |
q |
o |
c |
p |
k |
|
k |
n |
|
v |
g |
o |
r |
q |
|
e |
c |
o |
d |
k |
g |
t |
c |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
z |
e |
w |
w |
y |
|
v |
q |
|
s |
q |
b |
t |
e |
|
c |
q |
|
t |
e |
c |
q |
d |
y |
|
y |
b |
|
j |
u |
c |
f |
e |
|
s |
q |
c |
r |
y |
u |
h |
q |
|
La codifica esatta è quindi "oggi fa caldo ma domani il tempo cambiera".
Per dimostrare l'efficacia del brute forcing con l'ausilio della
crittoanalisi ho implementato in linguaggio C un semplice editor che
crittografa e decrittografa file con il metodo di sostituzione a traslazione
fissa. Facendo partire l'eseguibile si accede alla schermata iniziale:
Per crittografare
Si ha la possibilità di scrivere direttamente un testo all'interno della finestra superiore, utilizzando i tasti alfanumerici e il BACKSPACE per cancellare, oppure di aprire un file già esistente schiacciando F1 per accedere al menu FILE e scegliendo poi il comando "Apri . ".
Quando ho il mio messaggio nella finestra superiore premo F2 e accedo a un menu che mi richiede la chiave di crittografia. Dopo che l'ho scelta ottengo il mio messaggio crittografato
Per decrittografare
Mi posiziono nella finestra inferiore con il tasto TAB e inserisco il messaggio crittato (aprendo un file o scrivendolo). Accedendo al menu Decrittografa con il tasto F3 il programma chiede se posseggo o meno la chiave. Se la conosco non devo fare altro che inserirla, altrimenti il programma in automatico studierà la distribuzione di frequenza dei 26 possibili messaggi originali; in entrambi i casi otterrò il messaggio desiderato.
Il programma permette inoltre di salvare o aprire file e di gestire i file *.crp e *.txt creati
Il sorgente è lungo 600 righe quindi riporto solamente la funzione che decrittografa, omettendo certe parti che riguardano l'aspetto grafico.
void menu_decrittografa()
; // Z
_setcursortype(_NOCURSOR);
textbackground(LIGHTGRAY);
textcolor(BLACK);
cancella(); cprintf('Hai la chiave? <s> <n>');
s=getch();
if(s=='s') //se ho la chiave
while(aux!=INVIO);
decritta(s); //decritta con chiave s
.
.
.
}
else if(s=='n') //se non ho la chiave
for(i=0;i<26;i++)
if(val_att<val_min)
}
decritta(chiave_min);
.
.
.
}
// stampo il messaggio ottenuto
textbackground(BLUE);
textcolor(WHITE);
for(i=0;i<702;i++)
}
BIBLIOGRAFIA
Per la realizzazione della tesina è stata consultata la seguente documentazione:
A. Sgarro - Crittografia, Franco Muzio Editore
A. Memo - Sistemi di elaborazione e trasmissione delle informazioni, CEDAM
La rivista "DEV"
https://telemat.die.unifi.it/book/1997/cryptography/
https://digilander.iol.it/unno2/crittografia.htm
https://www.netgallery.net/ecommerce/sicurezza/crittografia.htm
https://www.provincia.venezia.it/mfosc/studenti/crittografia/
https://www.rcvr.org/varie/pgp/crypto.htm
https://microwebcom.com/articoli/crypto.html
https://www.wowarea.com/italiano/aiuto/cryptoit.htm
https://kz.cjb.net/
Per avere il programma di cui ho parlato nelle ine precedenti contattatemi all'indirizzo o.riva@tiscalinet.it
Privacy
|
© ePerTutti.com : tutti i diritti riservati
:::::
Condizioni Generali - Invia - Contatta