Consulta la Circolare. - Liceo scientifico statale G. De Rogatis

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