Dalla Crittografia a Chiave Pubblica al Commercio Elettronico Vincenzo Schifano Abstract Uno degli aspetti sicuramente più attuale all’interno del mondo dell’informatica, con cui ci relazioniamo quotidianamente, è quello della sicurezza informatica e quindi della crittografia. La crittografia è impiegata nelle operazioni più comuni, quando utilizziamo il cellulare, quando accediamo al nostro account email per controllare la posta, quando preleviamo del denaro presso uno sportello ATM, sono tutte operazioni rese sicure grazie a un qualche protocollo crittografico che proibisce a un probabile agressore di accedere ai nostri dati sensibili. 1. Introduzione Sin dai tempi più antichi si è sentito il bisogno di proteggere le informazioni sensibili, dalle direttive di un generale ai vari accampamenti durante delle guerre alle corrispondenze di carattere politico e diplomatico tra i regnanti di paesi diversi. Uno dei primi approcci utilizzati per raggiungere tale scopo fu l'uso della steganografia (dal greco στεγανός, nascosto, e γραφία, scrittura) , l'idea era dunque quella di nascondere il messaggio in qualcosa o in qualcuno. Il passo successivo che rivoluzionò il mondo della sicurezza nello scambio delle informazioni fu l'uso della crittografia, dal greco κρυπτóς che significa "nascosto", e γραφία che vuol dire scrittura. Sebbene sembri che le due parole vogliano dire la stessa cosa, questa volta l'idea consiste nel cifrare il messaggio vero e proprio e non semplicemente nel nasconderlo, così da renderlo incomprensibile in caso di intercettazione da parte di persone non autorizzate. Tra le varie tecniche di encrypting ricordiamo: cifrari a trasposizione, cifrari a sostituzione monoalfabetica, cifrari a sostituzione polialfabetica, cifrari poligrafici o tomogrammici, cifrari a dizionario o a repertorio, cifrari misti, macchine cifranti, cifrari a chiavi segrete e, infine, i moderni cifrari a chiave pubblica. Per meglio comprendere i vari protocolli e le tecniche usate è necessario operare dei richiami matematici: Definizione 1: (Modulo di un numero). Dato un numero qualsiasi, calcolarne il modulo è abbastanza semplice: per esempio, per calcolare 25 modulo 7, si divide 25 per 7 ottenendo il quoziente 3 e il resto 4, ne segue che (25 mod 7) = 4. In generale per calcolare (a mod b) si trovano due interi q ed r tali che a = qb + r e ovviamente 0 ≤ r ≤ b. il valore di (a mod b) è definito pari a r. [1] Definizione 2: (Gruppo, Gruppo moltiplicativo). Un gruppo ammette una sola operazione binaria. I numeri in Zp sono un gruppo con l’addizione. La somma di due numeri del gruppo restituisce un terzo elemento che fa ancora parte del gruppo. Gli elementi 1, … , (p-1) insieme alla moltiplicazione (mod p) formano un gruppo detto gruppo moltiplicativo (mod p) o anche Zp*. Nel caso di Zp il campo finito è costituito dal gruppo di addizione, definito dall’addizione (mod p), e dal gruppo moltiplicativo Zp*. Un gruppo può contenere un sottogruppo, costituito da una parte degli elementi del gruppo completo: se si applica l’operazione del gruppo a due elementi del sottogruppo, si ottiene ancora un elemento del sottogruppo. I sottogruppi sono molto utilizzati per velocizzare alcune operazioni di crittografia. Per esaurire completamente un gruppo moltiplicativo è necessario definire anche l’operazione inversa alla moltiplicazione: la divisione (mod p) può essere definita come segue: c = a/b (mod p). La formula è equivalente a dire che esiste un numero c, (mod p), tale che c b = a (mod p). Non si può dividere per 0 ma l’operazione è sempre definita se b ≠ 0. Scelto un g qualsiasi nel gruppo Zp* consideriamo i numeri: 1, g, g2, g3… tutti (mod p) : questa è una serie infinita di numeri ma Zp* contiene un numero finito di elementi, ad un certo punto gli elementi cominceranno a ripetersi. Supponiamo che accada quando gi = gj con i < j. Dividendo per gi otteniamo 1 = gj-i . Ne consegue che esiste un numero q = j-i tale che gq = 1 (mod p). Continuando a moltiplicare i vari g, è possibile ottenere tutti gli elementi 1, g, g2, g3, … , gq-1, per questo motivo g prende il nome di generatore del gruppo: il numero totale di elementi che possono essere scritti come potenza di g è esattamente q ovvero l’ordine di g. [2] Definizione 3: (Campo, Campo finito). In matematica si definisce campo un insieme non vuoto K, caratterizzato da due operazioni binarie denominate somma, (K , +), e prodotto (K , ·). Le due operazioni godono della proprietà commutativa, della distributiva rispetto al prodotto e dell'esistenza dell'elemento neutro (0 per la somma e 1 per il prodotto). Se l'insieme K ha un numero finito di elementi il campo si dice finito. In particolare il campo finito dei numeri modulo un numero primo p, si indica con “campo (mod p)” o semplicemente “(mod p)” o anche con Z/Zp . L'insieme degli elementi di un campo finito (mod p) contiene gli elementi 0, 1, … (p-1). Ricordiamo che si può sempre aggiungere o sottrarre qualsiasi elemento multiplo di p senza cambiarne il risultato e tutti i risultati sono sempre compresi nell’intervallo di valori 0, 1, … (p-1). [3] Definizione 4: (Piano proiettivo). Dato il piano affine A = K2, il piano proiettivo su K associato a V è l'insieme P(K), i cui elementi, chiamati punti di P(K), sono i sottospazi vettoriali di dimensione uno di K, cioè le rette vettoriali di K. Uno spazio proiettivo è detto reale se K = R, complesso se K = C. Ogni v ϵ V genera il sottospazio di V di dimensione uno <v> = {λv : λ ϵ V}. Quindi: P(K) = {P = <v> : v ≠ 0, v ϵ K3} = {<v> = λv : λ ϵ K}. Il generico punto P sarà definito come: P = [XP, YP; TP] = [λXP, λYP; λTP]. Scegliamo la coordinata T e discriminiamo i punti per cui TP ≠ 0 (allora P = [x, y; 1], le coordinate non sono omogenee ed i punti si dicono proprii) e i punti per cui TP = 0 (allora P = [x, y; 0], le coordinate sono omogenee ed i punti si dicono impropri o all'infinito). 2. Crittografia a Chiave Pubblica Supponiamo di avere dieci persone che vogliono comunicare tra loro in maniera sicura, per fare ciò si incontrano scambiandosi una chiave segreta. Come succede con tutte le chiavi, è necessario un continuo aggiornamento delle stesse che porta dunque a successivi incontri. Si ha che per un gruppo di n persone servono n(n-1)/2 chiavi, quindi nel nostro caso sono necessarie ben 45 chiavi. All’aumentare delle persone coinvolte nello scambio di informazioni la gestione delle chiavi diventa rapidamente ingestibile. La crittografia convenzionale è basata sull'uso di una chiave segreta, il problema principale di questo tipo di protocollo è quello di trovare un canale sicuro per trasmettere suddetta chiave. Per ovviare a questo problema si pensò dunque di usare non una sola chiave ma due, una segreta, per decifrare, e una pubblica, per cifrare. Lo scenario tipico dunque non prevede più la presenza di due sole parti bensì, per esempio, una rete di utenti. Data la asimmetria, dovuta all'uso di due chiavi diverse, questo tipo di cifrari sono detti asimmettrici. Le origini della crittografia a chiave pubblica si fanno risalire al 1976 con la pubblicazione dell’articolo “New Directions in Cryptography” ad opera di Whitfield Diffie e Martin Hellman. La sicurezza della crittografia asimmetrica è garantita da delle funzioni “one-way” (a senso unico) con trapdoor (passaggio segreto), facili da calcolare ma difficili da invertire dove per “difficili da invertire” si intende operazioni che computazionalmente risultano essere proibitive. L'informazione trapdoor (vale a dire quella caratteristica aggiuntiva che aiuta nell'operazione di inversione della funzione prescelta) non deve però essere deducibile dalla descrizione della funzione altrimenti non sarebbe più one-way. [4] La Crittografia è la maniera per due persone, Alice (A) e Bob (B), di comunicare segretamente usando un canale non sicuro senza che un avversario, Oscar (O), capisca cosa sia stato detto tra i due. Definizione 5: (Criptosistema). Un Criptosistema è costituito da: • un insieme finito P di possibili testi in chiaro ( Plaintext ); • un insieme finito C di possibili testi crittografati ( Ciphertext ); • un insieme finito K di possibili chiavi k = (kE, kD) consistenti, in realtà come già detto, nella coppia “chiave pubblica”, “chiave privata”; tali che per ogni k ϵ K, esiste una funzione regola per cifrare ek ϵ E e una corrispondente regola per decifrare dk appartenente a D. Ognuna delle ek : Pζ → C e dk : C → P sono funzioni tali che dk(ek(x)) = x per ogni testo in chiaro x appartenente a P. In un criptosistema ci sono quindi due chiavi. La chiave pubblica, che è pubblicata in una directory, definisce la ek e consente la cifratura, e la chiave privata che è tenuta segreta, definisce la dk e permette di decifrare il messaggio [5]. 3. Problema del Logaritmo Discreto (DLP), Protocollo Diffie-Hellman (DH) e Algoritmo di El Gamal Come detto precedentemente, i padri fondatori della crittografia a chiave pubblica, Diffie ed Hellman, proposero il loro schema di lavoro, conosciuto come “Schema Diffie-Hellman”, per ovviare al problema inerente lo scambio della chiave segreta per poi garantire future comunicazioni. Definizione 6: (Discrete Logarithm problem - DLP). Dato un gruppo Zp, un α ϵ Zp e β= αb, calcolare b. Il problema del logaritmo discreto (DLP) è uno dei problemi matematici più noti all'interno della Teoria dei Numeri, è un problema per il quale non si conoscono delle soluzioni efficienti e pertanto uno dei migliori candidati in ambito crittografico. L'esponente b, dato ad α per ottenere β, è detto logaritmo discreto di β in base α rispetto al modulo p. Il problema del calcolo del logaritmo discreto è un esempio di funzione one-way inversa utilizzata per i protocolli asimmetrici (come ad esempio il celebre algoritmo RSA). Esistono infatti degli algoritmi efficienti per il calcolo di qualsiasi potenza ma non per l'operazione inversa. Se scegliamo un numero primo p sufficientemente grande, infatti, risulta un'operazione computazionalmente complicata, ne consegue che con la dovuta attenzione riguardo il numero p, si ottengono tempi polinomiali. Esempi di algoritmi con tempo polinomiale per risolvere questo tipo di problema sono l'algoritmo di Pohlig - Hellman o l'algoritmo di Shanks. Dalla complessità computazionale molto elevata deriva un certo grado di sicurezza dato dal fatto che la risoluzione di tale quesito va oltre le possibilità di un crittoanalista reale [6]. Algoritmo 1: (Diffie-Hellman key exchange – Protocollo DH). 1. (Setup) A e B scelgono pubblicamente il campo Zp e un elemento ζ ϵ Zp. 2. A genera un intero casuale a ϵ Zp-1, chiave privata di A, calcola α = ζa (mod p) in Zp e trasmette α a B attraverso un canale di comunicazione pubblico. 3. B genera un intero casuale b ϵ Zp-1, chiave privata di B, calcola β = ζb (mod p) in Zp e trasmette β ad A attraverso lo stesso canale. 4. A riceve γ e calcola β = kA = β a = (ζb)a. 5. B riceve α e calcola k = kB = αb = (ζa)b. Adesso sia A che B conoscono l'elemento k = ζab, chiave segreta, che può essere usato come chiave private per comunicazioni future. Anche se un avversario O dovesse in qualche modo venire a conoscenza dei valori Zp, ζ, α = ζa (mod p) e β = ζ b (mod p) e volesse ricavare la chiave k, si troverebbe contro la funzione DH cioè k = DH(ζa (mod p), ζb (mod p)) = ζab (mod p). Il problema che l'avversario deve risolvere mediante la funzione DH, detta “Funzione Diffie-Hellman”, è noto proprio come il “Problema di Diffie-Hellman” o anche DHP. Malgrado l'alto grado di sicurezza di una crittografia basata sul DHP, vi è un particolare tipo di attacco per violare questo tipo di protocollo: il cosiddetto “Man in the middle” o anche MITM. Questo tipo di attacco consiste nella capacità dell'attaccante di intromettersi tra i due interlocutori, assumendo con uno l'identità dell'altro, e di leggere i messaggi scambiati ed eventualmente modificarne alcuni ingannando i diretti interessati, prima di inoltrarli al vero destinatario. Nel caso della crittografia a chiave pubblica, se Alice chiede a Bob di inviarle la sua chiave pubblica ed Eve, una possibile attaccante, è capace di intercettarla allora questa può inviare all'ignara Alice una falsa chiave pubblica, la sua, della quale possiede la relativa chiave privata. A questo punto Alice cifra i suoi messaggi rivolti a Bob con la chiave di Eve che li decifra usando la sua chiave privata e li cifra nuovamente, magari alterandoli, usando la chiave pubblica di Bob che non sospetta nulla. Un modo per evitare la possibilità di un attacco di tipo MITM è quello di firmare le chiavi. [7] Algoritmo 2: (El Gamal). 1. (Setup) Sono scelti un gruppo G qualsiasi e un elemento α ϵ G. Ogni utente prende un intero casuale (la chiave privata) l ϵ {0, 1, ..., |G|-1} e rende pubblico β = αl (la chiave pubblica). Supponiamo che i messaggi siano elementi di G e che l'utente A desideri inviare un messaggio, m, all'utente B. 2. A genera un intero casuale k ϵ {0, 1, ..., |G|-1} e calcola αk. 3. A consulta la chiave pubblica di B, β = αl, e calcola (β)k dopo mβk. 4. A invia a B la coppia di elementi del gruppo (αk, mβk). 5. B calcola (m βk)((αk)l)-1 = (mαlk)(αlk)-1 = m e recupera il messaggio. L'eventuale avversario O, ascoltando il canale pubblico, viene a conoscenza di α, αk, β e mβk . Se risolvere il logaritmo discreto fosse possibile, si darebbe modo all'attaccante di trovare l e quindi sarebbe possibile usare lo stesso procedimento che effettua B per decifrare m [8]. Esempio 1: (Cifratura e decifratura con il gruppo G = Z*11 = {1, 2, 3, ..., 10} = <2>). 1. (Setup) Abbiamo |G| = 10 e α = 2. L'utente B sceglie casualmente l = 5 e calcola αl = 25 = 10 (mod 11). La chiave pubblica sarà composta dalla terna (n, α, αl) = (10, 2, 10) e la chiave privata sarà l = 5. 2. L'utente A sceglie k = 7 e calcola αk = 27 = 7 (mod 11). 3. L'utente A considera αl = 10 e cifra il messaggio m = 3, calcola m(αl)k = 3×107 = 8. 4. L'utente A invia la coppia (αk, mαlk) = (7,8). 5. L'utente B, l'unico che conosce la chiave privata l, calcola mαlk (((αk)l)-1 = 8(75)-1 = 3. 4. Curve Ellittiche Il primo uso delle curve ellittiche in Crittografia risale al 1985 ad opera di Victor Miller e Neal Koblitz, l'idea non era quella di creare dei nuovi criptosistemi più efficienti bensì di adattarne dei vecchi già esistenti applicando quanto visto sul DLP, invece che sul gruppo ciclico Zp, sul gruppo dei punti di una curva ellittica definita su un campo finito. Questo approccio consente di poter variare più gruppi al variare dei coefficienti della curva e, inoltre, risulta molto più efficiente. Ai fini di questa tesi, è sufficiente dare, per una curva ellittica, la seguente definizione, alla quale comunque ci si può sempre riportare anche dando definizioni più generali. Definizione 7: (Curva ellittica). Una curva ellittica ε , su un campo K, che denoteremo ε/K, o semplicemente con ε, è l'insieme dei punti proprii (x, y) ϵ K2 che soddisfano l'equazione y2 = x3+ax+b, con a, b appartenenti a K costanti tali che 4a3+27b2 ≠ 0 , insieme al punto all'infinito ϴ = (0, 1; 0) della curva ε del piano proiettivo. Se K è finito, allora ε ha un numero finito di punti |ε|. L'utente B riceve correttamente il messaggio, m = 3, inviato da A. [9] I punti di una curva ellittica si possono sommare mediante la regola corda-tangente, che consiste, in linea di massima, nel determinare il terzo punto d'intersezione R tra la retta per P e Q con la curva stessa, e nel porre P + Q uguale al punto simmetrico di R rispetto all'asse x. Lo zero del gruppo è il punto all'infinito ϴ = (0, 1; 0), così l'opposto di un punto è il suo simmetrico rispetto all'asse x. In formule: siano P = (xP, yP; 1) e Q = (xQ, yQ; 1) due punti propri sulla curva y2 = x3 +ax +b. 1. Se xP = xQ allora yP = ± yQ. 1.1) Se yP + yQ = 0, allora P+Q=ϴ= (0, 1; 0). 1.2) Se yP = yQ ≠ 0, allora P = Q e P + Q = 2P = ({(3xP2 +a) / 2yP}2 -2xP , -yP - (3xP2 +a) ⋅ {((3xP2 +a) / 2yP)2 - 3xP} / 2yP; 1). 2. Infine, se xP è diverso da xQ, sia m = (yP - yQ)/(xP - xQ) il coefficiente angolare della retta passante per i punti P e Q. Allora (xP, yP; 1) + (xQ, yQ; 1) = (m2 - xP - xQ, yP - m(m2 - 2 xP – xQ); 1). I crittosistemi basati su curve ellittiche sembrano offrire lo stesso livello di sicurezza di quelli basati su chiave pubblica con il vantaggio di avere delle chiavi molto più corte, permettendo dunque una maggiore velocità di encrypting e decrypting utilizzando però una minore quantità di ampiezza di banda. Nel mondo della crittografia non si suole usare le curve ellittiche sui reali, ma si restringe l'ordine del campo o a un numero primo dispari, quindi su Zp, oppure avente ordine una potenza di due. Non sembrano esserci molte differenze tra la sicurezza offerta nei due casi, la differenza sta dal punto di vista implementativo dato che le realizzazioni su potenze di 2 sono più veloci ed economiche. Siano date una curva ellittica ε su un campo finito K e un punto B ϵ ε, il problema del logaritmo discreto applicato alla curva ε in base B (o anche ECDLP) equivale a trovare, dato un punto P ϵ ε, se esiste, x ϵ K tale che xB = P. Se ci manteniamo su dei campi finiti allora è possibile calcolare il logaritmo discreto con tempi subesponenziali mediante l'algoritmo dell'index calculus. Questo è reso possibile dal fatto che un campo finito gode di due operazioni, somma e prodotto, mentre le curve ellittiche sono solamente additive pertanto non consentono l'uso di questo tipo di algoritmo rendendo i calcoli necessari molto laboriosi. Anche questa volta, la non esistenza di algoritmi efficienti per il calcolo del logaritmo discreto ci assicura un notevole grado di sicurezza crittografica. Così come il protocollo DH poteva essere violato tramite un attacco di tipo Man in the middle, così anche il protocollo EC ha dei punti deboli; per questo motivo non tutte le curve ellittiche sono delle candidate eccellenti per i nostri scopi. Vediamo ora come funziona il protocollo: Alice e Bob scelgono pubblicamente una curva ellittica ε su un campo finito K e un punto Q ϵ ε. Alice sceglie un intero casuale kA e calcola il punto kA Q inviandolo poi a Bob. Bob allora sceglie un intero casuale kB e calcola quindi il punto kB Q, dunque lo invia ad Alice. A questo punto Alice e Bob condividono la chiave P = kAkBQ. Se un attaccante Eve dovesse intercettare la comunicazione tra i due allora dovrebbe determinare P conoscendo Q, kA e kB. Questo è noto come problema Diffie – Hellman applicato alle Curve Ellittiche. Un altro esempio di algoritmo basato sull'uso della crittografia a Curve Ellittiche è l'ECDSA (Elliptic Curve Digital Signature Algorithm), algoritmo di firma che viene utilizzato per autenticare un dispositivo oppure un messaggio inviato dal dispositivo. Ipotizziamo uno scambio di messaggi tra due dispostivi A e B, il dispositivo A invia il messaggio e la firma, creata mediante la chiave privata di A. Per verificare la firma di A, il dispositivo B deve conoscere la chiave pubblica di A ma dato che la conosce può facilmente verificare se il messaggio ricevuto è stato inviato proprio da A. Affinché questo algoritmo sia realizzabile, A e B devono decidere a priori su una curva ellittica usata come dominio dei parametri del processo. Algoritmo 3: (El Gamal per le Curve Ellittiche). L'algoritmo di El Gamal applicato alle Curve ellittiche fondamentalmente è lo stesso applicato precedentemente, l'unica differenza sta nel fatto che questa volta consideriamo il gruppo additivamente. 1. (Setup) Scegliamo una curva ellittica ε su un campo finito Zp, insieme ad un punto P sulla curva. Il punto P genera un sottogruppo ciclico G = {ϴ, P, 2P ,..., (n-1)P} di ordine n. Ogni utente sceglie un intero casuale l appartenente a {0, 1, ..., n-1} come chiave privata e rende pubblico il prodotto lP come chiave pubblica. Supponiamo che i messaggi siano elementi di G e che l'utente A desideri inviare un messaggio, m , all'utente B. 2. A genera un intero casuale k appartenente a {0, 1, ..., n-1} e calcola kP. 3. A considera la chiave pubblica di B, lP, e successivamente la somma m+klP. 4. A invia a B la coppia di elementi del gruppo (kP, m+klP). 5. B calcola (m+klP) -l(kP) = m e recupera il messaggio. Ancora una volta, essere capaci di trovare l da P ed lP (risolvendo dunque il problema del logaritmo discreto applicato alle curve ellittiche) ci consentirebbe di crackare questo criptosistema [11]. 5. Pairing Bilineari Come abbiamo visto finora, la sicurezza del protocollo di scambio delle chiavi di Diffie-Hellman e quella di El Gamal è basata sulla difficoltà del problema del logaritmo discreto in un gruppo che può essere il gruppo moltiplicativo di un campo finito o, più efficientemente, il sottogruppo generato da un punto di una curva ellittica. Se però è possibile definire una funzione (bi)-lineare (pairing) tra punti di una curva ellittica e elementi del campo finito, tutto il vantaggio del considerare l'uso in Crittografia delle curve ellittiche è perso. Il campo della crittografia basato sui Pairing è relativamente recente. Definizione 8: (Pairing bilineare). Siano G1 e G2 due gruppi di ordine p (per qualche numero primo p sufficientemente grande). Un Pairing bilineare è una mappa bilineare e : G1 × G1 → G2 tale cioè che e(aP, bQ) = e(P,Q)ab, per ogni P, Q ϵ G1 e a, b ∈ Z Un Pairing bilineare si dice ammissibile se soddisfa le seguenti proprietà: • Non-degenericità: ∀ P ϵ G1 ∃ Q ϵ G1 : e(P, Q) ≠ 1. • Computazionabilità: esiste un algoritmo efficiente per calcolare e(P, Q) per qualche P, Q ϵ G1 [12]. Osserviamo che se è possibile riconoscere un pairing ammissibile quando G1 è una curva ellittica, allora è altresì possibile ridurre il calcolo del logaritmo discreto di P in base B mediante la relazione 1 = e(P, P) = e(xB, P) = e(B, P)x, ponendo e(B, P) = y e risolvendo yx = 1 nel campo finito. Il Pairing ammissibile più comunemente usato è il Pairing di Weil. Per introdurlo occorre definire alcuni concetti: Definizione 9: (Divisore, Ordine del Divisore, Grado del Divisore, Supporto del Divisore, Divisore principale). Se ε/K è una curva non singolare, allora un divisore di ε è una combinazione lineare di punti su ε. Se Pj denota i punti su ε, allora un divisore è scritto come D = ∑nj Pj, dove gli nj sono interi. Se P è un punto e D è un divisore, allora l'ordine vP(D) è il coefficiente di P in D (è pari a 0 se P non è presente in D). Il grado del divisore D è dato da deg(D):= ∑nj. L'insieme di tutti i punti P con coefficienti diversi da zero è chiamato supporto del divisore ed è definito come supp(D) = {P ϵ ε | n j ≠ 0}. Se φ = f/g è una funzione razionale omogenea di grado n, allora il numero n degli zeri di φ è uguale al numero dei poli di φ. Il divisore di grado zero il cui supporto è determinato dagli n zeri di φ (quindi di f) con la loro molteplicità e con segno positivo e dagli n poli di φ (quindi gli zeri di g) con la loro molteplicità e con segno negativo si dice divisore principale di φ e si denota con div(φ). Due divisori D1 e D2 si dicono linearmente equivalenti e si scrive D1 ~ D2 se la loro differenza D1 - D2 è un divisore principale. [13] Definizione 10: (Funzione di Weil). Se ε è una curva ellittica, D un divisore su ε e f è una funzione razionale definita sulla curva e tale che supp(D) ∩ supp(div(f)) = 0, allora definiamo f(D):=∏ P ϵ ε f(P)vp(D). Da notare che se f ha grado 0 allora f(D) dipende solamente da div(f), pertanto se moltiplichiamo f per una costante b, moltiplichiamo f(D) per ∏ P ϵ ε bvp(D) = 1. [14] Definizione 11: (Weil Pairing). Sia n > 1 un intero e siano D1, D2 divisori su una curva ellittica ε, con supporti disgiunti, tali che nD1, nD2 ~ 0 (cioè sono entrambi divisori principali). Questo significa che ci sono funzioni φ1 e φ2 tali che nDi = div(φi) per i =1, 2. Definiamo il Weil Pairing come ogni punto Q, R ϵ ε(Zp) vale eq(Q, R) = 1. In altre parole, il Weil Pairing è degenere su ε(Zp) Elenchiamo ora alcune proprietà del Weil Pairing su questa curva particolare: • Poiché x3 +1 è una permutazione su Zp ne consegue che il gruppo ε(Zp) contiene p+1 punti (compreso il punto all'infinito ϴ). Sia P ∈ ε(Zp) un punto di ordine q e sia G1 il sottogruppo di punti generato da P. • Per ogni y0 ϵ Zp esiste un unico punto di coordinate (x0, y0) su ε(Zp). Quindi, se il punto (x, y) diverso da zero è generico su ε(Zp), allora y è uniformemente distribuita su Zp. • Sia ζ un simbolo per cui valga ζ2 + ζ + 1 = 0 e sia K = {a + ζ b : a,b ∈ Zp} il campo finito con p2 elementi. La mappa ϕ(x, y) = (ζx, y) risulta un automorfismo del gruppo di punti sulla curva ε/K. È da notare che per ogni punto Q = (x, y) ∈ ε(Zp) abbiamo che ϕ(Q) ∈ ε(K), ma ϕ(Q) ∉ ε(Zp). Pertanto Q ∈ ε(Zp) è linearmente indipendente da ϕ(Q) ∈ ε(K). • Poiché i punti Q ∈ G1 e ϕ(Q) sono linearmente indipendenti, essi generano un gruppo isomorfo a Zq × Zq. Chiamiamo questo gruppo di punti ε[q]. [17] en(D1, D2) = φ1(D2) / φ2(D1). Esempio 2: (Calcolo del Weil Pairing). Sia data la curva ε/F7: y2 = x3+2, calcolare e3((0, 3; 1), (5, 1; 1)). Siano: D(0,3;1) = [(0, 3; 1)]-[(0, 1; 0)] D(5,1;1) = [(5, 1; 1)+(6, 1; 1)] – [(6, 1; 1)] = [(3, 6; 1)]– [(6, 1; 1)] Le funzioni di cui sono i divisori principali sono: div((y – 3t)/t) = 3D(0,3;1) div ((4x - y + t)/(5x - y - t)) = 3D(5,1;1) ne segue che: f(0,3;1) = (y - 3t)/t f(5,1;1) = (4x - y + t)/(5x - y - t) quindi: f(0,3;1)D(5,1;1) = f(0,3;1) (3, 6; 1)/f(0,3;1) (6, 1; 1) = (6-3)/(1-3) = 2 (mod 7) f(5,1;1)D(0,3;1) = f(5,1;1)(0, 3; 1)/f(5,1;1)((0, 1; 0)) = 4/1 = 4 (mod 7) Infine: Sia G2 il sottogruppo di K di ordine q. Il Weil Pairing sulla curva ε(K) è una mappa e : ε[q] × ε[q] → G2 tale che per ogni punto Q, R ϵ ε(Zp) vale e(Q, R) = 1. Per avere una mappa non degenere è necessario definire il Weil Pairing modificato. Definizione 12: (Weil Pairing Modificato). Il Weil Pairing modificato è una mappa ê : G1 × G1 → G2 tale che: ê(P, Q) = e(P, ϕ(Q)). Il Weil Pairing modificato soddisfa le seguenti proprietà: e3((0, 3; 1) , (5, 1; 1)) = 4/2 = 2 (mod 7) [15] Da notare che per alcune curve il pairing di Weil vale sempre 1, cioè è degenere. Ad esempio: sia p un un numero primo tale che p = 2 (mod 3) e sia q > 3 qualche fattore primo di (p+1). Sia la curva ellittica ε definita dall'equazione y2 = x3 +1 su Zp. Per • Bilinearità: ∀ P, Q ϵ G1 e ∀ a,b ϵ Z abbiamo che ê(aP, bQ) = ê(P, Q)ab. • Non-degenericità: Se P è un generatore di G1 allora ê(P, P)ϵ K* è un generatore di G2. • Computabilità: Dati P, Q ϵ G1 esiste un efficiente algoritmo, per esempio l'algoritmo di Miller, per calcolare ê(P, Q) ϵ G2[18]. div(fk) = k(P+T)-k(T)-k(P)+(O). Se k = q allora : div(fQ) = q(P+T)-q(T)-q(P)+(O) e fP = fQ . Algoritmo 4: (El Gamal per il Weil Pairing). L'algoritmo di El Gamal applicato al Weil Pairing lavora come segue: 6. Il progetto OpenSSL (Setup) Sia G un generatore dei parametri per il BDH. Assegnato un parametro di sicurezza k ϵ Z+, l'algoritmo procede nel seguente modo: Il progetto OpenSSL è un'implementazione open source dei protocolli SSL v2/v3 (Secure Sockets Layers) e TLS v1 (Transport Layer Security), l'idea alla base di tale progetto era quella di creare un toolkit completo per effettuare operazioni di cifratura dei dati, per questo motivo l'intera piattaforma è stata sviluppata in linguaggio C così da essere portabile sui sistemi operativi più diffusi, inizialmente solo quelli di tipo unix-like e successivamente anche per Microsoft Windows. 1. Generiamo tramite G un numero primo q, due gruppi G1, G2 , di ordine q e un'ammissibile mappa bilineare ê : G1 × G1 → G2. Scegliamo ora casualmente un punto P generatore di G1. 2. Scegliamo casualmente un s ϵ Z*q e fissiamo Q = sP. 3. Scegliamo una funziona hash crittografica H tale che H : G2 → {0, 1}n. Il pacchetto supporta diversi algoritmi crittografici. Tra questi ricordiamo: Lo spazio dei messaggi M = {0,1}n. Lo spazio dei testi cifrati C = G1 X {0, 1}n. I parametri del sistema pertanto sono params = <q, G1 , G2 , ê, n, P, Q, H> [19]. • Cifrari: Blowfish, Camellia, Cast, DES, RC2, RC4, RC5, IDEA, AES; • Funzioni Hash Crittografiche: MD5, MD2, SHA, MDC-2; Algoritmo 5: (Miller). L'Algoritmo di Miller per il calcolo del Pairing di Weil si applica a curve ellittiche supersingolari, definite su ZP con p > 3 e quindi con l'ordine della curva pari a ord(ε(Zp)) = 1 (mod p). Vediamo ora come funziona detto algoritmo: • Crittografia a Chiave Pubblica: RSA, DSA, Scambio di chiavi Diffie-Hellman • Funzioni di Autenticazione dei Messaggi: HMAC, MD2, MD4, MD5, MDC2, RIPEMD, SHA In input abbiamo due punti P, Q appartenente a ε[q], in output avremo e(P,Q). • Certificati: X.509 [20] 1. Si selezionano casualmente due punti T ed U della curva ε, tali che P+T, T, Q+U, U siano punti distinti. A questo punto, siano DP = (P+t)-T e DQ = (Q+U)-U equivalenti rispettivamente a (P)-(O) e (Q)-(O). 2. Si usa un algoritmo di valutazione per calcolare fP(Q+U), fP(U), fQ(P+T) e fQ(T) con div(fP) = qDP e div(fQ) = qDQ. 3. Si calcola ora e(P,Q) = fP(DQ)/fQ(DP) = (fP(D+U)fQ(U))/(fQ(P+T)fP(U)). La parte cruciale dell'algoritmo di Miller è il passo 2, per S = (xS, yS) fP(S) produce fP tale che div(fP) = qDP e calcola fP(xS, yS). Dato che Dp = (P+T)-(T), per ogni k intero positivo esiste una funzione razionale fk tale che: Il protocollo SSL/TLS nasce con lo scopo di garantire la sicurezza dello scambio di informazioni su Internet, consentendo alle applicazioni client/server di comunicare garantendo la sicurezza del collegamento mediante tre condizioni fondamentali: • Affidabilità: per sua costituzione, il livello di trasporto include un controllo sull'integrità del messaggio basato su un apposito codice di autenticazione del messaggio (MAC) che utilizza funzioni hash sicure così da evitare che le informazioni scambiate tra client e server siano alterate durante la trasmissione delle stesse; • Privatezza del collegamento: per far sì che il canale usato da due o più utenti per trasmettere i dati sia sicuro, si utilizzano degli • algoritmi crittografici a chiave simmetrica per cifrare i dati; EVP_CIPHER_CTX_set_key_length(ctx, key_size); Autenticazione: per autenticare l'identità degli utenti che usano il canale di trasmissione, è possibile usare la crittografia a chiave pubblica così che il client possa comunicare con il server corretto evitando che un utente malevolo si interponga nella comunicazione. In aggiunta all'uso della crittografia a chiave pubblica è prevista anche la certificazione sia del client che del server. Per deallocare il contesto invece: OpenSSL è composto da un insieme di funzioni di cifratura e da utilities che permettono di usarle, in particolare porremo la nostra attenzione sul protocollo SSL che permette la mutua autenticazione tra un client e un server e la conseguente creazione di una connessione in primo luogo autenticata e successivamente crittografata. Il protocollo crittografico utilizzato nell'esempio è lo scambio di chiavi di Diffie-Hellman. L'obiettivo è quindi quello di creare un canale sicuro per trasferire informazioni da un client ad un server: il server genera e controlla i parametri condivisi con il client, entrambe le parti generano una coppia di chiavi, una pubblica ed una privata e si scambiano il rispettivo parametro pubblico. A questo punto, client e server generano autonomamente la chiave simmetrica condivisa. Per fare ciò è stato sufficiente avvalersi delle api EVP e delle numerose funzioni presenti in OpenSSL, incluse nelle librerie <openssl/dh.h> , usata per gestire il protocollo DH, e <openssl/bn.h> relativa alle funzioni che si occupano dei numeri primi “sufficientemente grandi” necessari per far sì che il protocollo sia sicuro. In particolare il contesto EVP è una struttura dati che ci consente di implementare il cifrario a chiave simmetrica. Come prima cosa quindi, è necessario allocare un contesto EVP : EVP_CIPHER_CTX_cleanup(ctx); free(ctx); Per dare vita ad un canale di comunicazione sicuro Diffie-Hellman è necessario che il server generi i parametri DH e li invii al client. È quindi necessario utilizzare un'altra struttura dati, la struttura DH, che contienga al suo interno i parametri necessari per applicare il protocollo (il numero primo p, il generatore g, la chiave privata priv_key e la chiave pubblica pub_key). Per generare una coppia di chiavi da utilizzare come parametri si usa la funzione DH_generate_key(dh) e si invia la pub_key al client. A questo punto il client, mediante la funzione DH_new() crea una struttura dati DH per accogliere i parametri generati dal server, successivamente viene generata un'altra coppia di chiavi e invia la pub_key al server. A questo punto, client e server costruiscono la chiave simmetrica Diffie-Hellman, il client cifra un file con la chiave simmetrica e lo invia al server che lo decifra. 7. Bibliografia [1] N. Ferguson, B. Schneier and T. Kohno, “Il manuale della crittografia”, Apogeo, pp.153. [2] N. Ferguson, B. Schneier and T. Kohno, “Il manuale della crittografia”, Apogeo, pp.154-155. [3] N. Ferguson, B. Schneier and T. Kohno, “Il manuale della crittografia”, Apogeo, pp.154-155. EVP_CIPHER_CTX*ctx; [4] N. Ferguson, B. Schneier and T. Kohno, “Il manuale della crittografia”, Apogeo, pp.165-166. ctx = malloc(sizeof(EVP_CIPHER_CTX)); [5] M. Leslie, “Elliptic Curve Cryptography”, pp.1 Successivamente, si deve inizializzare settando la dimensione che deve avere la chiave e il blocco: [6] A. Nicolosi, “Sicurezza e applicazioni crittografiche della funzione Diffie-Hellman”, Università degli Studi di Catania, pp.44-46 EVP_CIPHER_CTX_init(ctx); [7] M. Leslie, “Elliptic Curve Cryptography”, pp.2 [8] M. Leslie, “Elliptic Curve Cryptography”, pp.3 [9] M. Leslie, “Elliptic Curve Cryptography”, pp.4 [10] E. Bellini, “La crittografia a curve ellittiche e applicazioni”, Torino 2011, pp.4 [11] M. Leslie, “Elliptic Curve Cryptography”, pp.9 [12] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp.7 [13] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp. 28 [14] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp. 28 [15] R. Chen, “The Weil Pairing, Computation of the Pairings”, [16] V. Miller, “The Weil Pairing, and its Efficient Calculation”, Princeton 2004, pp 237 [17] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp. 19 [18] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp. 20 [19] D. Boneh, M. Franklin, “Identity-Based Encryption from the Weil Pairing”, Stanford University, pp. 23 [20] AA.VV., http://it.wikipedia.org/wiki/OpenSSL [21] C. Ventre, “Oblivious Transfer per la generazione di chiavi RSA: protocolli ed implementazione in OpenSSL”, Università degli Studi di Salerno, pp.10
© Copyright 2024 Paperzz