INFORMATICA – ESERCITAZIONE DI LABORATORIO CHIAVE PUBBLICA E PRIVATA – 1 Autori: _______________________________________________ Data: _______________________________________________________________ ATTENZIONE: Se hai scaricato questa esercitazione nelle lezioni scorse e non hai ancora cominciato a compilarla, prima di iniziare scaricala di nuovo da Classiperlo e butta via questa versione, perché nel frattempo potrebbe essere stata modificata. Se invece avevi già cominciato l’esercitazione, ignora questo messaggio. Tutte le immagini copiate e incollate in questa esercitazione devono essere protette da watermark. Le immagini prive di watermark (col numero del PC su cui si lavora) non verranno accettate. A) OPERAZIONI PRELIMINARI All’interno del disco di rete, nella vostra cartella personale o di gruppo, create una sottocartella di nome Informatica. Dentro la cartella Informatica\Esercitazioni, create una sottocartella Es13A (la lettera A indica che si tratta della prima parte dell’esercitazione 13). All’interno della sottocartella Es13A salvate questo file Word e compilate l’intestazione. B) UN PO’ DI TEORIA (SOLO DA LEGGERE) Come abbiamo ormai visto in numerosi esempi, un sistema di cifratura si basa su: un algoritmo o metodo di cifratura una chiave di cifratura La sicurezza del sistema si basa ovviamente sulla sicurezza di entrambi gli elementi, cioè sul fatto di disporre di un buon algoritmo di cifratura e di una buona chiave. Un problema generale è quello della condivisione della chiave fra mittente e destinatario e questa difficoltà diventa ancora maggiore al crescere della lunghezza della chiave usata. Infatti in che modo mittente e destinatario possono scambiarsi la chiave di cifratura/decifratura? Qualsiasi canale di comunicazione usato (per telefono, per lettera, per email, via radio, con un incontro di persona, etc.) presenta problemi di sicurezza e la possibilità che la chiave venga intercettata da qualcuno. Il problema è che la chiave non può essere a sua volta cifrata, poiché in tal caso bisognerebbe preventivamente accordarsi sulla chiave di cifratura e così via all'infinito. In pratica, mittente e destinatario devono scambiarsi la chiave di cifratura prima di iniziare la corrispondenza e per fare questo devono usare un metodo non cifrato. Per esempio, nel caso semplice del cifrario di Cesare, Giulio Cesare potrebbe comunicare a voce la chiave ai propri generali oppure potrebbe inviargliela per mezzo di un messaggero fidato, ma in entrambi i casi la chiave potrebbe essere intercettata da una spia nemica. Il problema della condivisione delle chiavi è forse la debolezza principale dei sistemi crittografici tradizionali. Questo problema viene superato soltanto con i sistemi di cifratura moderna, i quali non richiedono due chiavi separate (per crittare e decrittare il messaggio) e non richiedono lo scambio della chiave di decifratura. In generale dunque si distingue fra: crittografia simmetrica: la funzione di codifica e quella di decodifica usano la stessa chiave, o chiavi diverse ma in diretta relazione tra loro (derivazione). crittografia asimmetrica: si usano due differenti chiavi, una per crittare il messaggio e un'altra per decrittarlo. B1) Vediamo se state seguendo il mio ragionamento. Tutti gli esempi di algoritmi di cifratura che abbiamo visto finora, a quale delle due categorie precedenti appartengono? C) UN ESEMPIO PRATICO DI CRITTOGRAFIA ASIMMETRICA (RSA) In crittografia la sigla RSA indica un algoritmo di crittografia asimmetrica, inventato nel 1977 da Ronald Rivest, Adi Shamir e Leonard Adleman utilizzabile per cifrare o firmare informazioni (l’acronimo RSA deriva appunto dalle iniziali dei cognomi dei tre inventori). Il sistema di crittografia si basa sull'esistenza di due chiavi distinte, che vengono usate per cifrare e decifrare. Se la prima chiave viene usata per la cifratura, la seconda deve necessariamente essere utilizzata per la decifratura e viceversa. La questione fondamentale è che nonostante le due chiavi siano fra loro dipendenti, non è possibile risalire dall'una all'altra, in modo che se anche si è a conoscenza di una delle due chiavi, non si può risalire all'altra, garantendo in questo modo l'integrità della crittografia. Supponiamo di chiamarci Bob e che Alice ci voglia mandare una mail con la ricetta del suo famoso Tiramisù (per qualche strana ragione, in tutti gli esempi di crittografia i due protagonisti si chiamano sempre Bob e Alice). Siccome si tratta di una ricetta segretissima, Alice teme che possa cadere nelle mani di sua madre che cerca sempre di rubarle le ricette. Decidiamo allora con Alice di crittografare la mail con la ricetta, in modo tale che nessun altro possa leggerla. Per fare questo dobbiamo metterci d’accordo su due cose: 1) un algoritmo di cifratura 2) una chiave di cifratura Per quanto riguarda il punto 1) non ci sono problemi: come abbiamo visto c’è una grande abbondanza di algoritmi di cifratura disponibili e, volendo andare sul sicuro, potremmo sceglierne uno dei più moderni (es. AES), in modo tale che, anche se la mamma di Alice dovesse disporre di un supercomputer modernissimo, non sarà mai in grado di craccare il nostro messaggio. C1) Con quale tipo attacco, disponendo di un supercomputer, la mamma di Alice potrebbe cercare di decrittare il messaggio? E perché, se scegliamo bene il metodo, i suoi tentativi sono destinati a fallire? Scrivete qui le vostre idee: Per quanto riguarda la scelta dell’algoritmo, possiamo metterci d’accordo tranquillamente con Alice per telefono o via mail, senza nessun timore di eventuali intercettazioni. C2) Perché siamo così tranquilli e non abbiamo paura di eventuali intercettazioni? Attenzione, questo è un punto importante. Fra algoritmo e chiave, cosa è davvero indispensabile mantenere segretissimo? Il problema maggiore è rappresentato dalla chiave di cifratura. Infatti, supponendo che Bob abbia scelto il sistema di cifratura che andrà a utilizzare, come può egli comunicare la chiave ad Alice? Per telefono? Via mail? Qualunque sistema decidiamo di usare, se la chiave cade in mani nemiche, siamo fritti! Qui ci viene in aiuto la crittografia asimmetrica RSA. La prima cosa che devo fare è generare una coppia di chiavi di cifratura. C3) Collegatevi con questo sito http://travistidwell.com/jsencrypt/demo/ , scegliete la lunghezza desiderata delle chiavi (per il nostro esempio 512 bit possono andare bene, anche se attualmente questo valore non è considerato sicuro) e generate due chiavi, una Privata e l’altra Pubblica. Copiate qui i valori delle due chiavi (compresa la parte di testo all’inizio e alla fine): C4) Perché il valore 512 come lunghezza della chiave attualmente non è considerato sicuro? Spiegate: Ora che disponiamo di due chiavi, procediamo nel seguente modo: la chiave Privata di Bob la teniamo segreta e nascosta in un cassetto (o nel PC di Bob); la chiave Pubblica invece la comunichiamo ad Alice via mail (o per telefono, se non abbiamo problemi di bolletta!). Volendo Bob potrebbe anche pubblicare la sua chiave Pubblica sull’elenco telefonico, su un giornale oppure scriverla su uno striscione appeso alla sua finestra. Insomma la chiave Pubblica può davvero essere resa pubblica (se volete potete anche andare in giro con una macchina e un megafono e urlare la vostra chiave pubblica a tutti: occhio però che se vi prendono vi portano dritti al manicomio). Anche se la mamma di Alice è in ascolto, nascosta da qualche parte, la chiave Pubblica non le serve proprio a niente, per le ragioni che vedremo fra un attimo. C5) Facciamo ora un esperimento per vedere come funziona il metodo. Scrivete qui una breve ricetta a vostra scelta (potete anche inventare, basta che sia breve!): C6) Ora mettiamoci nei panni di Alice che vuole spedire la ricetta a Bob. Usando la pagina http://www.classiperlo.altervista.org/File%20comuni/RSA/rsa.html e USANDO LA CHIAVE PUBBLICA scelta al punto C3 crittografiamolo. Scrivete qui sotto il testo della ricetta crittografata con la nostra chiave Pubblica: Notate che Alice ha usato la chiave Pubblica di Bob per crittografare il testo. Ma lei e nessun altro (e soprattutto non la mamma di Alice) conoscono la nostra segretissima chiave Privata. Che conseguenze ha questo fatto? C7) Chi è l’unica persona al mondo che è in grado di leggere la ricetta crittata del famoso Tiramisù di Alice? Lo so che è una domanda difficile, ma ce la potete fare a rispondere… C8) E adesso viene il bello. Bob riceve la ricetta segreta di Alice. Quale chiave dovrà usare per riuscire a leggerla? Lo so che lo sapete, ma scrivetemelo qui… C9) E ora provate a decrittare la vostra ricetta segreta sempre usando la pagina http://www.classiperlo.altervista.org/File%20comuni/RSA/rsa.html Se avete scelto la chiave giusta, dovreste riuscire a leggere il testo in chiaro della vostra ricetta. Copiate qui sotto una schermata (protetta da watermark) in cui si veda il testo decrittato: Ok, ragazzi, finora abbiamo giocato. Adesso le cose si fanno serie. Ecco il testo crittato del vero, originale famoso Tiramisù di Alice: Rnrqj9LGGPM5BA9qDl7z2qDL0yNeSnGiO1cXh6QGpH/XMLrJQl0g3OPtbvBLyKzn+2b/HyBm LUmSxX/FLFbSzlfsgCgwPsfNUffSSlOpJtaXSemfn5inBMnYlvpdhENryk2dV0TOHX6kS+8auq/q eFHz5Kaa87DWhkksJZ28MF8= E qui sotto avete la vera coppia di chiavi, Pubblica e Privata, di Bob: -----BEGIN PUBLIC KEY----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpU8kNN8OPxW1M2eQwIOvG0kB6 DqVEHnNwjdL40un+1MIkgxjau4wjKr5a9h3k9X9MOmTUmZ3+N4HDJod3RgJqyIgP PV+irKiW74CGlj3Iu2FnCntNFz/nYR1rGUmVhuDBg/9hXN8j7C40o8biET4Ri+4Q 8HXL552CdSF68VFBcwIDAQAB -----END PUBLIC KEY---------BEGIN RSA PRIVATE KEY----MIICXAIBAAKBgQCpU8kNN8OPxW1M2eQwIOvG0kB6DqVEHnNwjdL40un+1MIkgxja u4wjKr5a9h3k9X9MOmTUmZ3+N4HDJod3RgJqyIgPPV+irKiW74CGlj3Iu2FnCntN Fz/nYR1rGUmVhuDBg/9hXN8j7C40o8biET4Ri+4Q8HXL552CdSF68VFBcwIDAQAB AoGAOC1bA66fjCB1Dc0wfqM9dh4lVBltzTbJF+uFthXLmkceDh0Mbu1QJg61Ttpe uqqUTEcHUt2QZFooDAXJZdHtVNGjpkkY2C3BrHahGutZ0VU9d+nF+bh9tOiitw8X t201uVJyNt758GYnHIqNo1apiAnj3PQHCx6k7o2WzVp8kpECQQD6gdRbGIm35W0G X4M9i9jB3OdRJr3xkwKSvRu7zEddMPZmpcF/0fp/CHchrn90gQXePui8K8zHUShn Z0/2OTSrAkEArQpE9B0YwrmZyGEIeXoJ42uYZjIydR7iTlnomtWLbF9QATRDGz5Q Pmws5K0RPUDtu4IHjncl1KZ6iyB72jXWWQJBAJJQHj4OuPFl2SXtx3O9KJ8ibSDi 5fIhEVGvjnFDwTLXFDOkAL6tYAeuZBaSGvNrIIhMahbt5i9MYbLzjqqbgv0CQHJE HsaI1En6H/f3Q45cLV11Npz9tt4qd8y/iF9+dmQpCH7TESFTY8/kxTx4oLKvRo2U zwKf4WZsTO3ElKTC+nkCQEc58yyxrw55E6ZCZ3e9bSoe4NyvuNCwBtIaLU/PaMJL XHRWFj+MUwGehYXLEJXfnZ780FsnEktYIFqGF0IqcG0= -----END RSA PRIVATE KEY--- C10) E ora tocca a voi. Scegliendo la chiave giusta (ricordatevi che voi siete Bob e state ricevendo un messaggio crittografato da Alice) decrittate il messaggio e copiate qui sotto una schermata con la ricetta di questo famoso Tiramisù: Se avete capito tutto questo, fatevi subito i complimenti da soli (anche da parte mia). Questi sono argomenti che si solito si spiegano all’università (non sto scherzando), perché ritenuti troppo difficili. Eppure voi ci siete arrivati, giusto? Dunque, prima di proseguire, complimentatevi! Per essere proprio sicuri di aver capito tutto, ora supponiamo di metterci nei panni di Bob e di voler rispondere ad Alice ringraziandola per la ricetta. Non vogliamo però che il messaggio venga intercettato dalla mamma di Bob (che è una grande pettegola) e a tale scopo decidiamo di crittografarlo usando RSA. C11) A questo punto dovreste dirmi: 1) quale chiave deve usare Bob per crittografare il messaggio: 2) quale chiave usa Alice per leggerlo: Per rispondere alle domande precedenti potete usare qualsiasi combinazione di parole, come per esempio “Bob cifra con la chiave Privata di Bob e Alice decifra con la chiave Pubblica di Bob” (è sbagliato, ovviamente, ma vi serve come modello di esempio). Attenzione: tutta la difficoltà nel comprendere bene questo meccanismo sta nel fare confusione sul tipo di chiave (Pubblica o Privata) e su chi le ha generate (Bob o Alice). C12) A proposito, nel nostro ultimo esempio, chi ha generato le chiavi usate? Bob o Alice? D) COME VENGONO GENERATE LE CHIAVI DI CIFRATURA La chiave Privata e quella Pubblica sono generate insieme da un algoritmo che, sebbene non sia eccessivamente complicato, sarebbe troppo lungo da spiegare qui. Il punto da capire è che l’algoritmo di generazione della coppia di chiavi si basa su una coppia di numeri primi, che attraverso una serie di passaggi matematici si trasformano nei valori delle due chiavi. Pubblica e Privata. D1) Vi ricordate qual è la definizione di numero primo? Scrivetela qui: Lo schema in figura mostra simbolicamente il passaggio dalla coppia di numeri primi alle due chiavi di cifratura: I due numeri primi da cui parte tutto il calcolo possono essere scelti da chi vuole generare la coppia di chiavi oppure generati più o meno casualmente da un programma per computer. Il punto è che più questi due numeri sono grandi, più sicura è la coppia di chiavi. Ma prima di cercare di capire un po’ meglio questi dettagli, vediamo la generazione di una coppia di chiavi di cifratura all’opera. Per prima cosa dovete scegliere due numeri primi, P e Q da cui partire. Di solito, come abbiamo detto, si usano numeri primi molto grandi per questi calcoli, ma noi possiamo fare un esempio con numeri più piccoli. D2) Per aiutarvi nella scelta collegatevi col sito https://primes.utm.edu/lists/small/1000.txt dove sono elencati i primi 1000 numeri primi. Sceglietene due che vi stanno simpatici (non troppo piccoli) e scriveteli qui: D3) Collegatevi col sito https://www.cs.drexel.edu/~jpopyack/IntroCS/HW/RSAWorksheet.html e copiate i numeri primi che avete scelto nelle caselle P e Q. Quindi premete il bottone Set p,q. Copiate qui sotto una schermata dove si veda il risultato (casella di testo Candidates): D4) Ora dalla lista Candidates (1 mod r) dovete scegliere, più o meno a caso, uno dei numeri proposti. Scrivete qui il numero che avete scelto: Copiate il numero scelto nella casella K e premete il bottone Factor K. Il programma vi scompone automaticamente il numero K scelto in un prodotto di numeri primi. Se i fattori primi sono più di due, scartate il numero e provate con un altro nella lista, magari più piccolo. Continuate a provare finché non trovate un K fra quelli elencati che ha solo due fattori primi. D5) Copiate qui sotto una schermata dove si veda il numero K e la sua fattorizzazione in numeri primi: Adesso copiate i due fattori primi di K nelle caselle e e d. Premete il bottone Check e & d. Se non avete fatto errori dovrebbe comparirvi le scritte: e*d mod r = 1 e and r are relatively prime d and r are relatively prime D6) Se non succede, chiamate l’insegnante. Altrimenti copiate qui sotto una schermata con i valori di e e di d che avete scelto: Adesso finalmente siamo arrivati alla fase di cifratura. Nella casella Msg dovete inserire un messaggio in forma numerica. In pratica bisogna usare il codice ASCII. D7) Codificate la parola ROMA in ASCII e scrivete qui i relativi codici (decimali): D8) Ora scrivete i codici tutti attaccati (senza spazi) in Msg e premete Encode/Decode. Se non avete fatto errori, nella casella Encrypted dovrebbe comparire il vostro messaggio cifrato con la chiave pubblica che avete appena generato. Copiate qui sotto una schermata dove si veda il numero corrispondente: Scopo di tutto questo giochino è farvi toccare con mano il fatto che alla base della crittografia RSA c’è una coppia di numeri primi, i quali, con una serie di calcoli più o meno incomprensibili, generano le chiavi di cifratura. Ma perché proprio due numeri primi? E perché questi due numeri devono essere molto grandi? Volete la spiegazione lunga e difficile o quella breve o veloce? Ok, ho capito… In breve i numeri primi hanno una proprietà che li rende interessantissimi per la crittografia. I fatti sono questi: è facilissimo moltiplicare fra loro due numeri primi, ma è molto complicato prendere il prodotto di due numeri primi e scomporlo nei due fattori. D9) Non ci credete? Prendete due numeri primi, per esempio 19 e 31 e moltiplicateli fra loro. Potete usare la calcolatrice. Scrivete qui il risultato: Quanto ci avete impiegato? Poco, non è vero? Ora proviamo a vedere l’inverso… D10) Il numero 893 è il prodotto di due numeri primi. Quali sono? Uhm, vi comincia a fumare il cervello? Riuscite a vedere la difficoltà di scomporre un numero nei suoi fattori primi? In pratica l’unico sistema sensato che i matematici sono riusciti a inventare in secoli e secoli di studio è… fare tutte le prove. Ebbene sì. Per scomporre un prodotto nei fattori primi che lo hanno formato, l’unico sistema è prendere una lista di numeri primi e provare a dividere. Bello, vero? E soprattutto molto veloce… Cosa c’entra questo con la crittografia? Bene, vi ricordate che all’inizio del nostro ultimo esercizio vi ho chiesto di scegliere due numeri primi per generare le chiavi Pubblica e Privata? Bene, uno dei passaggi matematici fondamentali nel calcolo delle chiavi è il prodotto fra questi due numeri primi che avete scelto. Date un’occhiata alla pagina https://www.cs.drexel.edu/~jpopyack/IntroCS/HW/RSAWorksheet.html (non l’avete chiusa, vero?) e vedrete che c’è una casella indicata con N = p * q: In effetti una parte della chiave pubblica è proprio formata da N, cioè dal prodotto dei due numeri primi scelti all’inizio. Ora, se un ipotetico assalitore volesse risalire dalla chiave pubblica a quella privata, l’unico modo sensato (a parte l’approccio a forza bruta, che consiste nel provare tutte le chiavi) è quello di provare a calcolare i due numeri p e q che hanno dato inizio a tutto il gioco, partendo dalla conoscenza del loro prodotto N. E’ come cercare di scomporre 893 nei suoi due fattori primi… solo che in questo caso i numeri sono molto più grossi! Questo calcolo è difficilissimo, ci siamo? Detto in modo ancora più semplice: per creare la coppia di chiavi si prendono due numeri primi, li si mescola fra di loro in vari modi, si aggiunge un po’ di sale e pepe e una spruzzata di prezzemolo per insaporire e il risultato sono due belle chiavi di cifratura (nelle quali si trova il prodotto fra i due numeri primi di partenza). Se un attaccante volesse risalire dal prodotto N ai numeri p e q che lo hanno generati (e dunque ricostruirsi le due chiavi a proprio uso e consumo), avrebbe enormi difficoltà. E’ un po’ come voler estrarre dalla maionese le uova… è facile mescolarle, difficile separarle di nuovo! La moltiplicazione fra due numeri primi è un’operazione banale che è difficilissima da invertire. E’ un lucchetto facile da chiudere (basta moltiplicare due numeri) e difficile da aprire. Ci siamo? La cattiva notizia per i cifratori è che i computer diventano sempre più potenti e veloci ogni anno che passa e compiti che fino a ieri sembravano impossibili, oggi sono alla portata anche del vostro smartphone. Anche la fattorizzazione in fattori primi non è un problema insormontabile, se i numeri scelti non sono davvero giganteschi. D11) Collegatevi col sito http://www.mathwarehouse.com/arithmetic/numbers/primenumber/prime-factorization-calculator.php e calcolate la fattorizzazione del numero 893 che ci aveva messo in crisi un minuto fa. Qual è? D12) Proviamo con qualcosa di più cattivo. Trovate i fattori primi di 1581255209. Fatto? Scriveteli qui… Come vedete anche numeri che sembrano molto grandi, sono scomponibili in fattori primi in un tempo velocissimo con i moderni computer. Per questa ragione i numeri usati per generare le chiavi di cifratura sono davvero enormi (si parla di migliaia di bit, cioè numeri così grandi che è impossibile quasi scriverli). Per adesso nessuno è ancora riuscito a fattorizzarli (e dunque a indovinare le chiavi), ma domani… chissà! E) INVIARE L’ESERCITAZIONE ALL’INSEGNANTE Creare una cartella compressa col contenuto dell’esercitazione (ES13A) e inviarla all’insegnante su classiperlo. Prima di inviare l’esercitazione, chiedere all’insegnante di verificare che tutti gli esercizi siano stati svolti correttamente (ATTENZIONE: inviate tutta la cartella compressa, non solo questo file con le spiegazioni!).