Comments
Description
Transcript
P(m)
Aspetti algoritmici connessi alla sicurezza nei sistemi informatici distribuiti Testo consigliato Crittografia, P. Ferragina e F. Luccio, Ed. Bollati Boringhieri, € 16. 2 Sommario Introduzione computer security vs network security attacchi, meccanismi di sicurezza Cenni di crittografia Crittografia a chiave privata Crittografia a chiave pubblica Applicazioni di network security (??) servizi di autenticazione (firma digitale) 3 Computer security vs network security Computer security: misure per proteggere le informazioni di un calcolatore Network security: misure per proteggere lo scambio di informazioni durante la loro trasmissione 4 Network security L’era di Internet… Informazioni distribuite Posta elettronica Commercio elettronico Transazioni finanziarie …e le nuove problematiche di sicurezza sicurezza delle reti locali da attacchi esterni da impiegati infedeli sicurezza delle applicazioni (e-mail, http, ftp,…) 5 Problemi base Le reti sono insicure perché molte delle comunicazioni avvengono in chiaro Spesso non c’è autenticazione dei server, ma solo (e non sempre) degli utenti Le connessioni non avvengono tramite linee punto-punto ma attraverso linee condivise tramite router di terzi 6 Meccanismi di sicurezza su reti Nei sistemi distribuiti in rete, la sicurezza si persegue attraverso diversi strumenti: Identificazione degli utenti: ogni utente che accede a servizi riservati deve essere identificato univocamente Autorizzazione di un utente: individuare quali sono i privilegi di cui gode un utente presso un sistema Secretazione dei contenuti che devono passare in rete Autenticazione: ogni contenuto generato da un dato utente deve essere mantenuto integro e deve potersi attribuire in modo univoco Uso di sistemi di controllo del traffico (firewall) Monitoraggio e controllo dei sistemi (intrusion detection) Attacchi alla sicurezza dei messaggi 8 Sicurezza dei messaggi: paradigmi Segretezza: evitare che i dati inviati da un soggetto A a un soggetto B vengano compresi da un terzo soggetto C. Autenticazione: verificare l’identità di chi manda o riceve i dati. Integrità: essere sicuri che i dati ricevuti siano uguali a quelli inviati. Non ripudio: evitare che chi manda dei dati possa in futuro negare di averli mandati (firma digitale). Identificazione informatica Per dispiegare servizi in rete con assoluta sicurezza ed affidabilità, in primis è necessario avere la certezza che ad un’utenza digitale sia associato univocamente un soggetto fisico o giuridico Identificazione informatica: identificazione di un soggetto per via telematica, consistente nella validazione dell’insieme di dati attribuiti in modo esclusivo ad esso Rispetto ai 4 paradigmi di sicurezza dei messaggi, l’identificazione è importante ai fini dell’autenticazione e della non ripudibilità L’identificazione informatica deve essere tanto più sicura quanto più è sensibile la transazione in cui è coinvolto il soggetto da identificare L’identificazione tramite username e password L’identificazione basata su username e password è il più semplice sistema di riconoscimento digitale È una forma di identificazione debole: funziona bene per autenticazioni su sistemi locali, ma per applicazioni sensibili su reti aperte, ove occorre poter verificare aldilà di ogni ragionevole dubbio che chi si presenta sia veramente chi dice di essere, non è sufficiente, in quanto è tendenzialmente violabile La forza di una password Formalmente, la forza di una password può essere espressa in funzione del numero atteso di tentativi necessari ad un avversario per forzarla mediante un attacco esaustivo (brute-force) Tale valore dipende dalla sua lunghezza, complessità ed imprevedibilità Quest’ultimo parametro, noto anche come entropia informativa, è una misura dell’incertezza associata ad ogni carattere (visto come una variabile casuale) che costituisce la password L’attacco brute-force Ad esempio, una password di 8 caratteri ASCII (che comprendono 52 lettere minuscole/maiuscole dell’alfabeto inglese, 10 numeri, e 34 simboli non-alfanumerici, per un totale di 95 simboli), se scelta in modo del tutto casuale, ha una forza di 53 bit: 958 253 ovvero, richiede la generazione di 253 stringhe binarie casuali di 53 bit prima di essere individuata con certezza il numero atteso di tentativi per forzarla è 253/2 = 252 Osserviamo che 252 1016, un numero molto grande ma non enorme. Ad esempio, esistono in commercio prodotti che garantiscono il testing di circa 3 miliardi di password al secondo su un normale PC da 4 GigaHz. In tal modo, si può forzare la password in circa 107 secondi, ovvero circa 4 mesi! (questo è anche il motivo per cui spesso si richiede di cambiare la password ogni 3-6 mesi) Dalla teoria alla realtà In realtà le cose vanno un po’ diversamente: Le password non vengono scelte in modo del tutto casuale: si calcola che mediamente una password di 8 caratteri abbia una forza effettiva di circa 30 bit (dato NIST, National Institute of Standards and Technology of USA) testando 3 miliardi di password al secondo, una password da 8 caratteri verrà forzata in circa 1 secondo, e una da 10 in circa 1 giorno! Tuttavia, non tutto è perduto: I sistemi di identificazione godono di meccanismi di delay tra l’inserimento di una password e la successiva Ogni carattere casuale in più nella password aggiunge circa 6 bit di forza, e ogni bit di forza in più raddoppia il numero di tentativi necessari per forzare una password una password di 14 caratteri casuali avrebbe una forza sufficiente per resistere ad attacchi tipo brute-force Password cracking Esistono tuttavia molte altre modalità di attacco ad una password, tra cui: Wiretapping (monitoraggio dei tasti premuti) Phishing (spillaggio dei dati sensibili) Social engineering (induzione a rivelare informazioni riservate) Dumpster diving (frugare nella spazzatura, letteralmente) L’identificazione mediante password non garantisce in modo certo l’identità di un determinato utente, e quindi non soddisfa il requisito dell’autenticazione (né tantomeno soddisfa gli altri paradigmi di sicurezza) Vedremo che la soluzione ci verrà fornita dalla tecnica crittografica asimmetrica RSA La crittografia La crittografia (dal greco kryptos, nascosto, e graphein, scrivere) è la disciplina che si occupa delle problematiche connesse alla sicurezza dei dati Anticamente si occupava unicamente dello studio di tecniche atte a garantire la secretazione dei dati, mentre oggi investe l’analisi di tutti gli aspetti (teorici, computazionali, implementativi) legati ai vari paradigmi di sicurezza 16 Cenni storici La crittografia è una scienza antichissima utilizzata nell’antichità per nascondere il contenuto di messaggi scritti. La crittografia conobbe un enorme sviluppo durante la Seconda Guerra Mondiale, quando il matematico inglese Alan Turing formalizzò la teoria necessaria per decrittare il crittosistema tedesco Enigma. Nel 1949 Shannon pubblicò un articolo che diede l’inizio a quella che oggi viene chiamata la Teoria dell’Informazione, che assieme alla Teoria della Probabilità, la Teoria della Complessità e la Teoria dei Numeri gettò le basi della Crittografia Moderna. Crittosistema Def.: Un crittosistema (o cifrario) è una quintupla (M,C,K,Cod,Dec), dove, M: insieme finito dei testi in chiaro C: insieme finito dei testi cifrati K: insieme delle possibili chiavi Cod: MK→C funzione di cifratura (iniettiva e invertibile) Dec: CK→M funzione di decifratura Se Cod e Dec utilizzano la stessa chiave per cifrare e decifrare un dato testo, allora si parla di crittosistema simmetrico, altrimenti di crittosistema asimmetrico. Garantire la segretezza Principio di Kerckhoffs: “La sicurezza di un sistema crittografico deve essere basata esclusivamente sulla inespugnabilità della chiave (gli algoritmi di cifratura e decifratura devono essere considerati noti, e il testo cifrato in transito deve essere considerato pienamente leggibile).” Algoritmi a chiave simmetrica Chiave simmetrica: i due soggetti (A e B) usano la stessa chiave K per codificare e decodificare i dati. Gli algoritmi di crittografia sono pubblici la chiave simmetrica deve essere segreta il principale problema è lo scambio della chiave! Lo scenario a chiave simmetrica Il problema della trasmissione della chiave Volendo utilizzare un cifrario simmetrico per proteggere le informazioni tra due interlocutori come posso scambiare la chiave segreta? Devo utilizzare una canale sicuro di comunicazione (oppure A e B devono essersi preventivamente accordati) Un primo esempio di cifrario a chiave simmetrica: il cifrario di Cesare Consideriamo l’alfabeto italiano, e costruiamo un cifrario che sostituisce ad ogni lettera di questo alfabeto la lettera che si trova 3 posizioni in avanti. Ad esempio il testo in chiaro “algoritmi distribuiti” viene cifrato nel crittogramma “dolrunzpn gnvzuneanzn”. Anche se la chiave rimane segreta, è facilmente attaccabile tramite approcci statistici. La crittoanalisi statistica Tramite l’utilizzo di tecniche statistiche sulla frequenze dei caratteri o sottostringhe del testo cifrato si ottengono informazioni utili sul testo in chiaro. Crittoanalisi del cifrario di Cesare Il cifrario di Cesare, come la maggior parte dei cifrari storici basati tu trasposizioni e traslazioni, può essere facilmente violato utilizzando tecniche statistiche (crittoanalisi statistica). Si analizzano le frequenze relative dei caratteri nel testo cifrato e le si confrontano con quelle di una lingua conosciuta, ad esempio l'italiano. Con queste informazioni si ottiene un’ottima approssimazione del testo in chiaro NOTA: Il cifrario di Cesare può essere facilmente violato anche con un approccio esaustivo: basta testare le 21 possibili traslazioni (i.e., chiavi) fino ad ottenere un testo comprensibile! Cifrari perfetti Un crittosistema si dice perfetto se il testo in chiaro e quello cifrato sono statisticamente indipendenti. Formalmente, definiamo un cifrario perfetto come segue: la comunicazione tra A e B è vista come un processo stocastico (cioè variabile in modo aleatorio nel tempo) in cui: P(m): probabilità che il messaggio spedito sia m; P(m|c): probabilità che il messaggio spedito sia m avendo visto transitare il messaggio cifrato c; Def.: Un cifrario è perfetto se per ogni mM e per ogni cC vale la relazione: P(m|c) = P(m). Due cifrari molto imperfetti Supponiamo che P(m)=p, 0<p<1, e che P(m|c)=0≠p; allora, un crittoanalista che vede transitare c, è in grado di dedurre che il messaggio spedito non può essere m! Supponiamo adesso che P(m)=p, 0<p<1, e che P(m|c)=1≠p; allora, un crittoanalista che vede transitare c, è in grado di dedurre che il messaggio spedito corrisponde ad m! In tutti i casi intermedi in cui P(m|c)≠p, il crittoanalista può fare delle deduzioni osservando i messaggi cifrati in transito! Impraticabilità dei cifrari perfetti Teorema (Shannon): condizione necessaria affinché un crittosistema sia perfetto è che |K|≥|M|. Dim.: Osserviamo che |M|≤|C|. Se per assurdo fosse |K|<|M|, allora |K|<|C|. Sia m un messaggio arbitrario t.c. P(m)=p≠0. Allora, da esso possono essere generati al più |K| messaggi cifrati (uno per ogni chiave). Ne consegue che esiste almeno un messaggio cifrato c* che non è immagine di m, ovvero: P(m|c*)=0≠p=P(m) contro l’ipotesi di perfezione. □ Un cifrario (simmetrico) perfetto One-time pad (G. Verman, AT&T, 1917): 1. 2. 3. 4. Si costruisce una grande chiave casuale k nota ad A e B (e non pseudocasuale…questo impedisce l’uso di generatori algoritmici, e impone lo scambio della chiave!), ad esempio utilizzando un rivelatore di raggi cosmici Il testo cifrato è costruito tramite uno XOR bit a bit (ricorda: 10=01=0; 11=00=1) fra il messaggio in chiaro m e la chiave casuale k c=mk B ricostruisce m=ck (infatti xyy=x) La chiave non deve mai essere riutilizzata (one-time pad). One-time pad è perfetto! Dobbiamo mostrare che P(m|c)=P(m). Siano m e c di n bit; dal Teorema di Bayes si ha: P(m|c)=P(m∩c)/P(c) dove P(m∩c) è la probabilità che A abbia generato il messaggio m e lo abbia cifrato come c; allora P(m∩c)=P(m∩c:=mk)=P(m)P(c:=mk)=P(m)2-n indipendenza statistica di m e c mentre: P(c)=∑m P(m∩c)= ∑m P(m)2-n=2-n ∑m P(m)=2-n P(m|c)=P(m)2-n/2-n=P(m). □ One-time pad è solo teoricamente perfetto… 1. 2. 3. 4. In pratica, come fanno A e B a scambiarsi la chiave k? La soluzione è accordarsi preventivamente su una supersequenza di bit casuali, da consumare a mano a mano che ci si scambiano messaggi…bisognerà solo specificare la porzione della supersequenza da usare di volta in volta. La supersequenza va trasferita a priori con metodi tradizionali (messaggero…) La linea rossa Cremlino-Casa Bianca è secretata (si dice…) con il metodo one-time pad! Dalla perfezione alla realtà… A fronte dei cifrari perfetti (ovvero dimostrabilmente sicuri ma praticamente inutilizzabili) esistono anche cifrari: Computazionalmente sicuri – Il problema crittoanalitico (ovvero di decrittazione di un testo cifrato senza conoscere la chiave) è computazionalmente intrattabile. Probabilisticamente sicuri – Sono cifrari di cui è stata dimostrata l’inattaccabilità, a patto che non si verifichino alcuni eventi improbabili. Tutti i cifrari moderni realmente utilizzati appartengono alla classe dei computazionalmente sicuri. Lo stato dell’arte dei cifrari simmetrici imperfetti: Rijndael Sviluppato da Joan Daemen e Vincent Rijmen, ha vinto la selezione per l’Advanced Encryption Standard (AES) nel 2000. Ufficialmente il Rijndael è diventato lo standard per la cifratura del XXI secolo a chiavi simmetriche. Il cifrario utilizza chiavi di lunghezza variabile a 128, 192, 256 bit (generate da un gestore esterno), ed una rete di “confusione del messaggio”, in cui si eseguono molteplici operazioni (circa 10) di trasposizione, xoring e sostituzione di blocchi di messaggio di lunghezza pari a quella della chiave. I limiti dei metodi a chiave simmetrica Un canale sicuro di comunicazione per scambiarsi la chiave segreta esiste veramente nella realtà? E se esistesse, perché ricorrere alla crittografia??? Inoltre, per una comunicazione sicura tra n utenti, si dovranno scambiare in tutto (n1)*n/2 chiavi, ad esempio con 100 utenti occorreranno 4950 chiavi! Infine, come può un metodo simmetrico garantire l’autenticazione e l’irripudiabilità, dal momento che esso è pensato per soddisfare unicamente il requisito della secretazione? Algoritmi a chiave asimmetrica Chiave Pubblica/Privata: Ogni soggetto S ha una propria chiave pubblica Kpub(S), nota a tutti; una propria chiave privata Kpriv(S) nota solo a lui. I requisiti che un algoritmo a chiave pubblica deve soddisfare sono: i dati codificati con una delle chiavi possono essere decodificati solo con l’altra; la chiave privata non deve mai essere trasmessa in rete; deve essere molto difficile ricavare una chiave dall’altra (in particolare la chiave privata da quella pubblica). I vari scenari a chiave pubblica Primo scenario: A codifica con la chiave pubblica associata a B, il quale decodifica con la propria chiave privata: garantisce segretezza e integrità (non l’autenticità, perché tutti possono codificare, non solo A) I vari scenari a chiave pubblica Secondo scenario: A codifica con la propria chiave privata il messaggio da inviare a B, il quale decodifica con la chiave pubblica associata ad A: garantisce autenticità e non ripudiabilità (non la segretezza, perché tutti possono decodificare) I vari scenari a chiave pubblica Terzo scenario: A codifica con la chiave pubblica associata a B ed autentica (i.e., firma) con la propria chiave privata: garantisce segretezza, integrità, autenticità e non ripudiabilità! La nascita dei sistemi PKI (Public Key Infrastructure) Dove trovo le chiavi pubbliche dei miei destinatari? Creazione di archivi di chiavi pubbliche, i cosiddetti public key server (PKS) (ad esempio, http://pgp.mit.edu/) Un PKS può essere interrogato per risalire alla chiave pubblica di un soggetto Curiosità: il prefisso pgp sta per “pretty good privacy”, ed è lo standard de facto, creato nel 1991 da Phil Zimmermann, per la trasmissione di mail criptate Fare una query su un PKS La risposta ad una query E cliccando su un soggetto… Public Key Server -- Get ``0x77d987e3f2baf942 '' -----BEGIN PGP PUBLIC KEY BLOCK----Version: SKS 1.1.0 mQENBEvtGsMBCACxCvcmPawOxaPjFkOi3dwhb6wJWFrCfbIhCrE7+klo58YqAJoaN9iMrd27 D2rD5jrGmqR4ah0QTE8QE3EOANNlz0jsVvyv5A/7LBT0xR9o5oJ+m0p2tdaMTJV05Atz2uEI wkalcGb6pLFightrCIeJ5V94rHcw0xFTXPE3FCDKhuJ80OSKYZWj+jbv0l3ZbuN6KGEVdWHe hwZMWcELx9C32a6HcvAgFlAmCzZk8RYzyORLgA/DBNzf8yl5Yn7rV9tWFyLREg9ytWs6JDwA Hm7wOlUeogOoK+ORdrFdsV6Eges+ThUMlg33r/XQZ37MDs6reCua7+QbYBwWBYqO9ExDABEB AAG0HG1hcmlvIHJvc3NpIDxtcm9zc2lAemV1cy5pdD6JAT4EEwECACgFAkvtGsMCGyMFCQlm AYAGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHfZh+PyuvlCSR0H+wTcejkqWCT7YoCv RaGqXTaUljtdJ8L3m9yDmjJtJ2Hhr7xrFTdwxdOqjx9TdHtxyFvoyem0ez4rRslv3AKPbYHB 2ThEtc+Jtk9ITNtss7fEp/Ix3bE7v3NQmazxaEAhXqS9ra8s08UkydfaRqkw58IB/J9wHDJ1 nbvvbLjolZOU+val1WmFAZYKUbZ866BeF2rKRiRHvIN3ur28JpRIUM0Yma9LrAthm8PufnA4 qpSm8b/52ldG4S8rRfDWMcQJZQiL0JnRELlqz4ta6erg4fDHsWgUnDSrCP7TYEgT/aG/GV6T SWwpXhnKEUMHuPvJy1hMF8Z/zjWxyJ0/kSZ1x++5AQ0ES+0awwEIAMEfDp/MNvdCyPplAqGh ByxiYJjpokYYNJBY9ytMyYYpWSN+s3lc335KjX9n/K0AqCO2a3LXfUzxRQvh5eHuZWxaT3yV oqnu86n/M10MFVziOx52x2cn+qhSLm8I82ESHDUjh9dFPTmBlmGhYHJa2bq6duchDx737ZuV fQKgTtJIj8XdKtv5zrTMn2h9CBshmbzUJvIvxtWSZq0vmMlZZd5H8aVDBH1C30MOyyIwLF0c zwf6dhJ6KTHM2AAwdcUvD/HyaOFKDeMWPPfUBmC4az0bLw1onIw6N0YmnfT+nupP3QXK6IKe KIbsQYQA5po+5fZIEb2o9A7nIYB/i4wjlakAEQEAAYkBJQQYAQIADwUCS+0awwIbDAUJCWYB gAAKCRB32Yfj8rr5QkwiCACit52gt9FWC1gjXSf7PSw2GSt/+NABt4F0yHoFidLRVNHRfWj1 J41dZUaHPzF+0zvk3E/j1oITGc0uKa201FMpflY/nUEOrwdzbRGZcgFJNVAGtm4glrCIv3c6 oVrmavRXPeWnmzdDzXRPQCItoMvniMhDMO1sfsWcMuGYuOB4oopjkAowc1s4M5qsOLA8pfsL CTx6JmtLPA49YxaolB3NZiSSDy6A91lV66vJKmpNseaWQsNs3X4vhBWS89Ct39wCe6Cx+ddh Ri2qLcPNEDQQVcDWP+DTHSrhJrStx14iJRBfHMQW6EaL2B4t7RZzKknRPxOw/wUE4gS62ay7 wJgz =scGC -----END PGP PUBLIC KEY BLOCK----- Le certification authority • • • • • Ma chi mi garantisce la corrispondenza delle chiavi pubbliche con i legittimi proprietari? Nascita delle certification authority (CA), che rilasciano a pagamento i cosiddetti certificati digitali (firmati con la chiave privata della CA), che associano in modo univoco un soggetto con la rispettiva chiave pubblica Le CA e i PKS sono le componenti principali di una PKI I costi di un certificato digitale sono variabili (da 20 a 800 Euro circa) e dipendono dal livello di sicurezza e dalla versatilità offerta Le CA italiane sono vigilate da DigitPA (attualmente abbiamo soltanto 17 CA accreditate in Italia) Sicurezza sul Web L'Hypertext Transfer Protocol (HTTP) è il principale sistema per la trasmissione d'informazioni sul Web, e si appoggia sul protocollo in chiaro TCP/IP Le architetture web basate su HTTP non garantiscono la sicurezza: non è sicuro che l’utente sia veramente chi dice di essere (masquerading) non è sicuro che le chiamate arrivino dall’indirizzo ip presente nei pacchetti in arrivo (ip spoofing) non è sicuro che i parametri delle request o i contenuti delle response non siano stati letti o modificati da qualcuno nel tragitto (la trasmissione è in chiaro) non è sicuro il contenuto associato ai cookies (tracking di sessioni e memorizzazione di informazioni specifiche riguardanti gli utenti che accedono al server) Il protocollo HTTPS (HTTP over Secure Socket Layer) È il risultato dell'applicazione del protocollo di crittografia asimmetrica RSA (in forma debole, di solito a chiavi da 128 bit) al protocollo HTTP È il protocollo solitamente utilizzato per comunicazioni protette client-server sul Web (ad esempio, per effettuare un pagamento), e funziona come segue: il client acquisisce il certificato digitale del server, e attraverso il proprio browser interroga la CA emittente per essere sicuro di dialogare con una parte fidata; quindi, genera le proprie chiavi pubblica e privata (attraverso il proprio browser, che le rinnova ad ogni nuova sessione aperta), e invia la propria chiave pubblica al server; il server invia al client una chiave simmetrica (cosiddetta session key) criptata con la chiave pubblica del client, per stabilire una connessione protetta a chiave simmetrica; infine, il client decripta la chiave simmetrica inviata dal server con la propria chiave privata, e le due parti sono pronte per dialogare nel canale protetto a chiave simmetrica. La matematica dei sistemi a chiave pubblica Venne introdotta da Diffie e Hellman nel 1976: Definizione: Una funzione f si dice one-way se per ogni x il calcolo computazionale di y=f(x) è semplice (è in P), mentre il calcolo di x=f-1(y) è computazionalmente difficile (è NP-hard). Definizione: Una funzione one-way è detta trapdoor (letteralmente, cassetta delle lettere) se il calcolo x=f-1(y) può essere reso facile qualora si conoscano informazioni aggiuntive (private). … ma purtroppo per loro, essi non furono in grado di costruire una funzione one-way trapdoor! Il cifrario RSA Progettato nel 1977 da Ron Rivest, Adi Shamir e Leonard Adlemann, il cifrario è stato brevettato, ed è diventato di dominio pubblico solo nel 2000. Idea base: Dati due numeri primi p e q (molto grandi) è facile calcolare il prodotto n=p∙q, mentre è molto difficile calcolare la fattorizzazione di n (anche se tale problema non è noto essere NP-hard). I migliori algoritmi di fattorizzazione attualmente disponibili (Quadratic Sieve, Elliptic Curve Method, Euristica ρ di Pollard, ecc.) hanno tutti una complessità esponenziale dell’ordine di: Il cifrario RSA Per garantire la sicurezza, occorre che p e q siano almeno di 200 cifre decimali. Infatti, se p e q sono di 200 cifre decimali ciascuno, allora n è di 400 cifre, cioè dell’ordine di 10400, da cui: ≈e79≈1034 da cui l’intrattabilità computazionale. le chiavi sono lunghe in genere 10200 = 2200*log10 1024 bitS. RSA è molto più lento degli algoritmi a chiave simmetrica, e spesso viene applicato a piccole quantità di dati, ad esempio per la trasmissione della chiave privata in un sistema simmetrico Funzionamento di RSA: generazione delle chiavi Ricorda: Per un intero positivo z, xy mod z esiste un intero k t.c. x-y=kz (se x ed y sono positivi, questo è equivalente a dire che il resto della divisione intera tra x e z e tra y e z è lo stesso, ovvero x mod z = y mod z) 1. Scegli due primi molto grandi p e q e calcola n =p∙q. 2. Calcola la funzione toziente di Eulero rispetto ad n, ovvero la cardinalità dell’insieme dei numeri minori di n e primi con esso: ϕ(n)=ϕ(pq)=pq-[(q-1)+(p-1)]-1=pq-(p+q)+1= =(p-1)(q-1)=ϕ(p)ϕ(q) (poiché esistono q-1 multipli di p minori di n e p-1 multipli di q minori di n) 3. Scegli un numero 0<e<ϕ(n) t.c. MCD(e,ϕ(n))=1. 4. Calcola d tale che e·d1 mod ϕ(n). 5. Definisci la chiave pubblica come (e,n). 6. Definisci la chiave privata come (d,n). Funzionamento di RSA Secretazione di un messaggio 1. 2. La funzione di cifratura di A è Cod(x)=xe mod n (con x<n), ove (e,n) è la chiave pubblica del destinatario B. La funzione di decifratura di B è: Dec(x)=Cod(x)d mod n = (xe mod n)d mod n ove (d,n) è la chiave privata di B. Autenticazione di un messaggio 1. 2. La funzione di cifratura di A è Cod(x)=xd mod n (con x<n), ove (d,n) è la chiave privata di A. La funzione di decifratura di B è: Dec(x)=Cod(x) e mod n = (xd mod n) e mod n ove (e,n) è la chiave pubblica di A. Correttezza di RSA: alcuni teoremi di algebra modulare Teorema (equazioni modulari): L’equazione axb mod n ammette soluzione se e solo se MCD(a,n) divide b. In questo caso si hanno esattamente MCD(a,n) soluzioni distinte. Corollario (esistenza dell’inverso): Se a e n sono primi tra loro, allora ax1 mod n ammette esattamente una soluzione positiva minore di n, detta l’inverso di a modulo n. Teorema di Eulero: Per ogni n>1, e per ogni a primo con n, si ha che aϕ(n)1 mod n. Correttezza di RSA Si noti innanzitutto che e e ϕ(n) sono primi tra loro, e quindi dal corollario sull’esistenza dell’inverso, esiste un unico d minore di ϕ(n) tale che e∙d1 mod ϕ(n). Qui sta la forza di RSA: per ricavare d da e bisogna conoscere ϕ(n), cioè p e q, e quindi bisogna saper fattorizzare! Secretazione: occorre provare che x<n, Dec(Cod(x))=x. Ma Dec(Cod(x))=(xe mod n)d mod n=xed mod n, quindi dobbiamo mostrare che x=xed mod n. Dimostratelo! Distinguiamo due casi: 1. p e q non dividono x (e quindi MCD(p,x)=MCD(q,x)=1, poiché essi sono primi); 2. p (oppure q) divide x, ma q (oppure p) non divide x. (si noti che p e q non possono entrambi dividere x, perché altrimenti si avrebbe x≥n contro le ipotesi) Correttezza di RSA (2) Caso 1: Abbiamo MCD(x,n)=1, quindi per il th di Eulero, risulta xϕ(n)1 mod n; poiché ed1 mod ϕ(n), si ha che ed=1+kϕ(n), per un k opportuno. Quindi, poiché x<n, si ha: xed mod n = x1+kϕ(n) mod n = x·(xϕ(n))k mod n = x·1k mod n = x. Caso 2: Poiché p divide x, per qualunque intero positivo k abbiamo xxk0 mod p, ovvero (xk-x)0 mod p. Poiché invece q non divide x, analogamente al Caso 1, abbiamo anche xedx mod q, e quindi (xed-x)0 mod q. Ne consegue che (xed-x) è divisibile sia per p che per q, e quindi per il loro prodotto n, da cui deriva (xed-x)0 mod n xedx mod n xed mod n = x mod n = x. □ Autenticazione: si noti che RSA gode della notevole proprietà: Dec(Cod(x))=Cod(Dec(x)). Esempio di funzionamento di RSA: secretazione B sceglie ad esempio p=3 e q=11. Quindi n=33 e ϕ(n)=20. Si può prendere e=3, poiché 3 non ha divisori comuni con 20 (3,33) è la chiave pubblica di B Cerco d t.c. 3d1 mod 20. Con l’equazione 3d= 1+k·20, ponendo k=1 si trova d=7 (7,33) è la chiave privata di B Per cifrare un blocco P (P<33) da inviare a B, A calcola C:=Cod(P)=P3 mod 33 Per decifrare C, B calcola P=C7mod 33 Poiché n=33, si cifrano al più 5 bit alla volta (25<33) Nella pratica, n è dell’ordine di 21024, e quindi si possono cifrare blocchi di 1024 bit, cioè blocchi di 128 caratteri ASCII (di 8 bit ciascuno). Esempio di funzionamento di RSA Per visualizzare l’esempio precedente, supponiamo per semplicità che le 26 lettere dell’alfabeto inglese possano essere codificate con 5 bit, e quindi poiché n=33, posso cifrare un carattere alla volta Complessità computazionale di RSA Si può dimostrare che le chiavi (e quindi p,q,e,d) possono essere generate in tempo polinomiale (ovvero logaritmico nel loro valore). In particolare, e viene in genere scelto prendendo un numero primo abbastanza piccolo (ad esempio, e=3). Invece, d viene ricavato mediante un’estensione (polinomiale) dell’algoritmo di Euclide per il calcolo del MCD (basato sul fatto che MCD(a,b)=MCD(b,a mod b)). Tuttavia, per trovare numeri primi molto grandi (cioè p e q), i test di primalità utilizzati sono tutti di tipo probabilistico, in quanto quelli deterministici sono troppo lenti (sebbene polinomiali, ma dell’ordine di O(log10n)). Infine, si noti che i processi di cifratura e decifrazione possono essere eseguiti efficientemente tramite successive esponenziazioni (potenza modulare). Alla ricerca di p e q Definizione (Algoritmo Monte Carlo): Un algoritmo Monte Carlo “no-biased” è un algoritmo randomizzato per la risoluzione di un dato problema di decisione, in cui la risposta “no” è sempre corretta, mentre la risposta “sì” può essere inesatta con probabilità fissata ε. Analogamente sono definiti gli algoritmi Monte Carlo “yes-biased”. L’algoritmo di Miller e Rabin è un algoritmo Monte Carlo “nobiased” per testare la primalità di un numero. Esso ha una complessità di O(log3 n), e una probabilità di inesattezza ε≈1/4 (cioè se risponde Sì, è corretto con probabilità ≈3/4). Osservazione: si noti la differenza sostanziale con il metodo Las Vegas usato per il calcolo del MIS, in cui la risposta era sempre e comunque corretta, mentre la complessità temporale era invece data in forma probabilistica. Algoritmo di Miller-Rabin È basato sulla seguente proprietà: dato un intero (positivo) n dispari (del quale vogliamo testare la primalità), riscriviamolo come n=2sr+1, con r dispari (quindi s è la molteplicità del fattore 2 nella scomposizione in fattori primi del numero pari n-1). Sia ora 2≤y≤n-1, e definiamo i 2 predicati: (P1): MCD(n,y)=1; i (P2): (yr mod n = 1) OR (esiste 0≤i≤s-1 t.c. y2 r-1 mod n). Teorema: Se n è primo, allora ogni 2≤y≤n-1 soddisfa entrambi i predicati (e quindi se esiste un 2≤y≤n-1 che non soddisfa almeno uno dei due predicati, n è composto), mentre se n è composto il numero di interi 2≤y≤n-1 che soddisfano entrambi i predicati è minore di n/4. Eseguiamo MR(n) un certo numero k di volte, testando ogni volta (P2) su un intero positivo a caso minore di n. Se l’algoritmo risponde “no” anche una sola volta il numero è sicuramente composto, mentre se risponde sempre “sì”, la probabilità che il numero sia composto è 4-k, e quindi la probabilità che il numero sia primo è: P(primo)=1-P(composto)=1-4-k (ad es., se k=100, si ha P≈1-10-60 ≈ 1) Algoritmo di Miller-Rabin Miller-Rabin(n) 1. Set n-1=2sr con r dispari 2. For i=1 to k do 2.1 scegli a caso un intero t t.c. 2≤t≤n-2 2.2 calcola y:=tr mod n 2.3 if y≠1 esegui %è falsa la prima condizione di (P2) 2.3.1 j=0 2.3.2 while ((j≤s-1) and (y≠n-1)) y:=t2jr mod n j++ 3. 2.3.3 if y≠n-1 ritorna composto %è falsa anche la seconda condizione di (P2), e quindi è falso (P2) Ritorna primo (w.h.p. 1-4-k) E’ facile trovare numeri primi? Nonostante l’efficienza nel testare se un numero sia primo o meno resta l’incognita se i numeri primi siano “pochi” e quindi difficili da scovare. Teorema di Gauss (dei numeri primi): Sia π(n) la funzione di distribuzione dei numeri primi, cioè il numero di numeri primi che precedono n. Allora essa soddisfa il seguente: Quindi se si cerca un numero primo di 100 cifre occorre verificare “solo” ln (10100) ≈ 230 numeri consecutivi.