Analisi di programmi: Crittografia Come caso concreto di sistema, proviamo ad abbozzare e a vedere una prima implementazione di un sistema di crittografia a chiave pubblica La crittografia studia le tecniche per nascondere l informazione Tecniche di crittografia sono molto usate per la sicurezza di transazioni bancarie, e-commerce, firme digitali Crittografia Un sistema crittografico si compone di due parti: una codifica (o cifratura) e una decodifica (o decifratura) Messaggio in chiaro Cifratura Messaggio criptato Chiave Messaggio criptato Decifratura Messaggio in chiaro Chiave 1
Crittografia simmetrica Quando si usa un'unica chiave sia per proteggere il messaggio che per renderlo nuovamente leggibile, si parla di crittografia simmetrica Fino a pochi anni fa l'unico metodo crittografico esistente era quello della crittografia simmetrica Il problema è portare in giro la chiave senza che venga scoperta Crittografia Macchina per crittografia Enigma, usata dai militari tedeschi nella seconda guerra mondiale Gli alleati, in particolare gli Inglesi, studiarono a lungo il modo di crackare il codice dei Tedeschi e ci riuscirono 2
Crittografia a chiave pubblica Il problema della crittografia simmetrica sta nella gestione delle chiavi: Come faccio a trasmettere la chiave in maniera sicura? Sarebbe bello avere un sistema che permette la codifica dei messaggi con una chiave e la decodifica con una chiave completamente diversa Crittografia a chiave pubblica Nel 1978, Ronald Rivest, Adi Shamir, and Len Adleman inventarono la crittografia RSA La crittografia RSA ha una coppia di chiavi: una chiave pubblica e una privata A e B vogliono comunicare segretamente A genera la coppia di chiavi, tiene per sè quella privata e manda a B quella pubblica B critta il messaggio con la chiave pubblica e lo manda a A. La chiave non importa che sia pubblica: serve solo a crittografare i messaggi A è in grado di decodificare il messaggio con la sua chiave privata 3
RSA: la teoria RSA è basato sulla fattorizzazione in numeri primi si scelgono a caso due numeri primi, p e q, l'uno indipendentemente dall'altro, abbastanza grandi da garantire la sicurezza dell'algoritmo si calcola il loro prodotto n = pq, chiamato modulo (dato che tutta l'aritmetica seguente è modulo n) si calcola poi m = (p - 1) (q - 1) Si seleziona anche un numero e tale che MCD(e,m)=1 La chiave pubblica è la coppia di numeri (n,e) Chiunque voglia mandarci un messaggio s, lo crittograferà utilizzando la seguente trasformazione S = (s e ) modulo n RSA: la teoria Vediamo la parte della chiave privata Se ricevo un messaggio S, lo decodificherò usando la seguente trasformazione RSA, usando la coppia di numeri (n,d) s = (S d ) modulo n Il numero d viene scelto in modo che s = s s = (s e ) d modulo n E si può verificare avviene se de = 1 modulo m (n, d) è la chiave privata 4
RSA: la teoria Quindi una volta che ho calcolato questi numeri, la coppia (n, e) sarà la chiave pubblica, mentre (n, d) sarà la chiave privata La sicurezza del metodo RSA si basa sul fatto che anche se uno conosce la chiave pubblica (n, e), il metodo per ottenere d, è quello di fattorizzare n per trovare i numeri p e q e trovare così gli altri numeri Quindi crackare un codice RSA è difficile almeno quanto fattorizzare n nei sui primi p e q Quando p e q sono numeri di 300 cifre, questo richiede un secolo di tempo macchina del più veloce supercomputer RSA: implementazione Il cuore del metodo è il calcolo (s e ) modulo n (define (expmod b e m) ;; simile all esponenziazione vista (cond ((zero? e) 1) ;; a lezione ma consiederando il modulo ((even? e) (modulo (square (expmod b (/ e 2) m)) m)) (else (modulo (* b (expmod b (- e 1) m)) m)))) Data abstraction per il tipo di dato chiave (define make-key cons) (define key-modulus car) (define key-exponent cdr) ;; il costruttore ;; i selettori (define (RSA-transform number key) ;; il cuore del metodo RSA (expmod number (key-exponent key) (key-modulus key))) 5
RSA: implementazione Una coppia di chiavi RSA, consiste in una chiave pubblica ed una privata (define make-key-pair cons) (define key-pair-public car) ;; i selettori (define key-pair-private cdr) ;; il costruttore (define (generate-rsa-key-pair) ;; implementazione della generazione della coppia di chiavi ) RSA: implementazione Il metodo RSA è pensato per trasformare numeri Noi abbiamo bisogno di spedire messaggi di testo Possiamo pensare si usare come predefinite due funzioni string->intlist e intlist->string che trasformano rispettivamente stringhe di testo in liste di numeri e liste di numeri in stringhe (string->intlist "questo e' un messaggio") (242842353 212350964 232607783 242841248 217706739 67647465) (intlist->string '(242842353 212350964 232607783 242841248 217706739 67647465)) "questo e' un messaggio 6
RSA: implementazione Una volta cha abbiamo questa lista di numeri, li codifichiamo / decodifichiamo con la trasformazione RSA RSA-transform Nei metodi reali si sceglie di codificare il primo numero della lista, sommarlo al secondo, codificare la somma, sommare il risultato al terzo numero ecc (define (RSA-convert-list intlist key) ) (define (RSA-unconvert-list intlist key) ) RSA: implementazione Vediamo le funzioni generali per usare la crittografia RSA Notiamo che tutto il metodo trasforma numeri, mentre noi dobbiamo trattare messaggi di testo (define (RSA-encrypt string key1) (RSA-convert-list (string->intlist string) key1)) (define (RSA-decrypt intlist key2) (intlist->string (RSA-unconvert-list intlist key2))) 7
RSA: test Proviamo ad usare il sistema Es. Sarkozy spedisce messaggi a Carla, con la chiave pubblica di Carla (define sarkozy-rsa-key (generate-rsa-key-pair)) (define carla-rsa-key (generate-rsa-key-pair)) (define cecilia-rsa-key (generate-rsa-key-pair)) (key-pair-public sarkozy-rsa-key) (478995823. 37981609) (key-pair-private sarkozy-rsa-key) (478995823. 213019289) (key-pair-public carla-rsa-key) (530019449. 364979005) (key-pair-private carla-rsa-key) (530019449. 421224373) (RSA-encrypt "Amo Carla Bruni" (key-pair-public carla-rsa-key)) (28522895 337295473 59556703 410503941) (RSA-decrypt '(28522895 337295473 59556703 410503941) (key-pair-private carla-rsa-key)) "Amo Carla Bruni (crack-rsa (key-pair-public carla-rsa-key)) ;; Cecilia cracka la chiave di Carla (530019449. 421224373) 8