Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DEFINIZIONI:
COMUNICAZIONE SICURA:
Si abbia, per esempio, una comunicazione tra due agenti, Alice e Bob.
Il terzo agente, Eve, vuole ascoltare la loro conversazione senza essere scoperta. Alice
manda un messaggio a Bob detto plainext o testo in chiaro criptandolo in una
modalità decisa assieme a priori: tale metodo si assume sia noto anche ad Eve. Con la
chiave il testo in chiaro è criptato e reso segreto. Quando Bob riceve il messaggio lo
decritta con la chiave a partire da quello che possiede, ovvero il crittotesto.
→ intercettare il messaggio;
→ trovare la chiave e leggere in chiaro tutti i messaggi criptati con quella specifica
chiave;
→ far finta di essere davvero Alice e comunicare con Bob che crederà quindi di parlare
con la vera Alice.
TIPOLOGIE DI ATTACCO:
TIPOLOGIE DI ALGORITMI:
Cifrario usato da Cesare per spedire i propri messaggi privati, consisteva nello
shiftare a dx o sx ogni lettera dell’alfabeto di un numero di cifre prefissato k.
Per cifrare:
y = x + k mod 26
Per decifrare :
x = y – k mod 26
ATTACCHIAMO IL CIFRARIO:
2) CIFRARI AFFINI:
y = αx + β mod 26
α={1,…25}; β={0,…25};
α≠0 perché seno’ sarebbe uguale a Cesare.
E’ un’evoluzione del cifrario di Cesare, viene scelto un valore per α, β invece del
solo k.
x = (y – β) * α-1 mod 26
ATTACCHIAMO IL CIFRARIO:
Quali scelte di α non vanno bene? Bisogna scartare tutti gli α che hanno un MCD
o GCD (great common divisor) con 26 ≠ 1 quindi tutti i numeri pari da 0 a 26 e il
numero 13. Il numero totale di chiavi è quindi 12 * 26 = 312.
POLIALFABETICI A SOSTITUZIONE
1) QUADRATO DI VIGENERE:
2) QUADRATO DI POLIBIO:
3) QUADRATO DI PLAYFAIR:
Anche questo quadrato è una variante del quadrato di Polibio in particola nella
matrice 5x5 viene inserita prima la chiave scelta e nelle caselle rimanenti le
altre lettere in ordine alfabetico che non compaiono però tra quelle della
chiave.
4) ADFGX:
5) CIFRARIO DI HILL:
Si tratta del cifrario a blocchi per eccellenza, utilizza una matrice di numeri
come chiave ed un vettore come messaggio in chiaro. Si noti che la matrice è
scelta in maniera puramente casuale.
Es. il messaggio da criptare è il vettore [2, 0, 19] che corrisponde a [C, A, S]. Il
risultato del prodotto viene poi convertito in mod 26.
Infine i buoni sistemi crittografici dell’era moderna devono avere due proprieta’
importanti (Claude Shannon):
DES è stato utilizzato largamente per tutti gli anni ’80 perché ritenuto sicuro fino al
1990 quando Shamir e Biham mostrarono che il sistema era attaccabile in maniera
intelligente e questo segnò l’inizio della fine per DES. Con la potenza di calcolo
disponibile nel 2012 DES è attaccabile via forza bruta.
I pro di DES risiedono nella sua velocità di esecuzione e la sua sicurezza (tant'è che
viene usato ancora oggi nell'e-commerce).
I contro del sistema erano rappresentati dalle modifiche apportate dalla NSA e dal
fatto che possedeva una chiave relativamente troppo corta.
DES è un cifrario FEISTEL cioè lavora su metà dei dati alla volta.
1) FUNZIONAMENTO GENERALE:
DES è formato da 16 round che si ripetono. Ogni round lavora su metà del
messaggio in chiaro (la metà destra o la metà sinistra a seconda del round e
della circostanza). Questi round sono detti Feistel Round a causa della
funzione (la funzione Feistel) che ad ogni round si vede applicata al messaggio.
1) In input DES vuole un plaintext lungo 64 bit. Anche la chiave è lunga 64 bit
dei quali 56 bit sono costituiti dalla password vera e propria ed i rimanenti 8 bit
sono bit cosiddetti di parità. Nella pratica ho 2^56 chiavi totali tra cui scegliere
ma non tutte sono forti alla stessa maniera.
1) Ogni round ha in input di 64bit che viene diviso in due parti dx32bit e
sx32bit
2) La parte dx32bit entra in una funzione feistel insieme alla chiave del
round a 48bit
3) I bit delle due parti vengono shiftati a sinistra di 1 0 2 bit a seconda del
round in cui mi trovo
4) Una volta ottenuto l'output dei 16 round viene eseguita una permutazione
inversa che darà come output il crittotesto a 64 bit.
Uno degli svantaggi di DES è che per criptare lavora solo con metà del
messaggio alla volta, andando così contro il principio di Kirchoff.
Cosa aveva fatto modificare il NIST? Il NIST aveva imposto l’introduzione degli
S-Box che erano tenuti segreti. L’attacco di Biham e Shamir si basa proprio sulla
debolezza di questi S-Box conoscendo i quali si riuscì ad attaccare il sistema.
2) ATTACCHI A DES:
Tutti i cifrari che lavorano su una sola porzione del testo alla volta sono
detti cifrari Feistel.
Lo si confronta poi con altri messaggi con parte fissa. Risalendo a ritroso
nel processo di criptazione ci si rende conto che nel momento dello XOR è
possibile ricavare una parte della password usata dalla funzione Feistel
durante la cifratura. Di messaggio in messaggio si riesce a collezionare
man mano una certa quantità di “parti di chiave”. La chiave sarà
quindi data da quei bit che si ripetono più spesso tra tutti quelli
collezionati.
Questo attacco funziona quando si ha a disposizione una certa
quantità di messaggi in chiaro da dare in pasto all'algoritmo.
Esiste allora una funzione lineare che mi assicura che da una x del
dominio di DES si arrivi ad una y nel suo codominio, dove il dominio
contiene i messaggi in chiaro ed il codominio quelli criptati. Questa
funzione può non portarmi esattamente a y partendo da x, ma
sicuramente in un intorno (matematico) di y. Di conseguenza mi trovo
anche nell'intorno della chiave usata per criptare il messaggio.
Contro: l'attaccante può sapere che la chiave che si usa per criptare è
sempre la stessa. La si può quindi ricavare utilizzando, per esempio, un
dizionario per campionare tutte le ripetizioni nel crittotesto così da
collezionare le parti della chiave al fine di comporla interamente.
3.2) CBC (cipher block chaining)
CIFRARE: OJ=L8(EK(XJ))
CJ=PJ xor OJ
XJ+1=L8(XJ) || CJ
Nel 1998 la RSI lanciò un nuovo bando per dimostrare che il tempo che serviva
per decrittare un messaggio in DES era sempre meno ogni anno che passava il
vincitore di tale bando dimostrò tranquillamente che DES era attaccabile in
meno di un mese. Così, in seguito a questa presa di coscienza, si volle costruire
un hardware specifico per riuscire ad attaccare DES in meno di 4 giorni.
4.1) Doppio DES. Questa variante di DES prende in entrata un testo e lo cifra
con l'utilizzo di due chavi completamente differenti tra loro seguendo la formula:
4.2) Triplo DES. In questa modalità di DES il testo in chiaro viene criptato con
una password, decriptato con una seconda password e criptato ancora con la
prima password; la formula che descrive il procedimento è:
L’ALGORITMO DI BASE:
Come chiesto anche dal NIST, AES lavora con chiavi di lunghezza variabile che
determinano la lunghezza delle operazioni svolte, infatti, con una chiave di
128bit vengono eseguiti 10 round, con una di 192bit vengono eseguiti 12 round
mentre con 256bit di chiave si eseguono 14 round.
BYTESUB (SUBBYTE):
Con questa operazione si lavora con l’S-Box di AES che è una matrice 16x16.
Prendo gli 8bit di input (uno dei gruppi di cui sopra ) e utilizzo i primi 4bit e gli
ultimi 4bit per individuare rispettivamente la riga e la colonna dell’S-Box
L’operazione è eseguita per tutti i gruppi fino ad ottenere una nuova matrice
4x4
SHIFTROWS:
Si ottiene cosi una nuova matrice 4x4 con alcuni elementi shiftati.
MIXCOLUMN:
Prendiamo ora in input ancora la nostra matrice 4x4 che ha già subito tutte le
operazioni precedenti , moltiplichiamo ogni colonna con ogni colonna di una
matrice prefissata fino ad ottenere una nuova matrice 4x4.
ADDROUNDKEY:
L’ultima fase prende ancora una volta la matrice 4x4 e fa lo XOR con la chiave
del round, anch’essa organizzata come una matrice. (colonna x colonna).
In questa parte vediamo come Rijndael calcola la chiave da 128bit per ogni
round.
Tutto parte dalla chiave iniziale a 128bit che viene divisa in 16 blocchi da 8bit
ed organizzata come una matrice 4x4.
1) Si prende l’ultima colonna della matrice e si shiftano gli elementi verso
l’alto di 1byte
2) Con l’ultima colonna cosi shiftata faccio il SubByte con l’S-Box e ottengo cosi
una nuova colonna
2) Seguono Nove round con di IBS, ISR, IMC, IARK usando le chiavi da k 9-1
Notare che nel primo e nell’ultimo passaggio si esegue ARK e non IARK.
AES è uno standard utilizzato dal 2002 per criptare grandi flussi di dati. Al momento
(fine 2012) non è ancora stato attaccato salvo in maniera teorica attraverso dei
presupposti assurdi.
Sistemi crittografici simmetrici e asimmetrici
Per intenderci, nei sistemi crittografici simmetrici servivano, dove N è il numero
degli attori:
(N – (N – 1)) / 2 chiavi
Per fare un esempio, se gli attori fossero stati 10 (N = 10), allora avremmo dovuto
lavorare con:
Nei sistemi crittografici asimmetrici, invece, ogni attore possiede tante chiavi
quanti sono gli attori complessivi della comunicazione.
Per fare un esempio, il singolo attore possiede la sua chiave privata più tutte le chiavi
pubbliche degli altri attori.
L'unica maniera in cui una funzione one way può essere resa reversibile è inserire in
essa una trap door così da forzare la sua complessità intrattabile. Ovviamente le trap
doors sono e devono rimanere segrete.
Rivest, Shamir, Adleman (RSA)
RSA rappresenta un esempio di cifrario asimmetrico tra i più diffusi al mondo. Prende il
nome dai suoi ideatori, Diffie e Hellman, che lo hanno ipotizzato nel 1976.
RSA è un esempio di sistema asimmetrico che utilizza una funzione One Way con Trap
Door che implementa nella pratica la moltiplicazione tra numeri composti da un
numero abbastanza grande di cifre.
FUNZIONAMENTO GENERALE:
n=p*q
GCD(e, (p – 1) * (q – 1)) = 1
d * e ≡ 1 mod((p-1) * (q-1))
mod((p-1) * (q-1))
PUB(n, e) di Bob
PRIV(p, q, d) di Bob
C ≡ me (mod n)
e lo spedisce a Bob
DIMOSTRAZIONE RSA:
(me )d = m e*d
e * d ≡ 1 mod(p-1) * (q-1)
e * d = k * [(p-1) * (q-1)] + 1
e*d
m ≡ m mod n
e che quindi:
k * [(p-1) * (q-1)] + 1
m ≡ m mod n
Adesso bisogna dimostrare che la congruenza vale sia per mod p, mod q e
per mod n. Se dimostro questo, allora la dimostrazione è valida.
Se p divide m allora:
m ≡ 0 mod p
m k ≡ 0 mod p
k * [(p-1) * (q-1)] + 1
m ≡ 0 mod p
di conseguenza poiché:
(p-1)
m ≡ 1 mod p
k * [(p-1) * (q-1)] + 1
riprendendo la formula iniziale m la riscrivo in questo modo:
(p-1)
m = 1 mod p
* k * (q-1)]
((1) ) * m = m mod p
5) Caso n, ovvero p * q
Fatto ciò, abbiamo visto i due punti sia per p che per q. Ora dal momento che p e q
sono primi, allora:
k * [(p-1) * (q-1)] + 1
m ≡ m mod n
k * [(p-1) * (q-1)] + 1
m - m ≡ 0 mod n
Poiché tutta la parte di sinistra è divisibile sia per p che per q, allora possiamo scrivere
in questo modo:
k * [(p-1) * (q-1)] + 1
m = p * k1
k * [(p-1) * (q-1)] + 1
m = q * k2
ma dato che p non divide q e q non divide p, posso scrivere:
k * [(p-1) * (q-1)] + 1
m = p * q * k3
n * k3 ≡ 0 mod p
k * [(p-1) * (q-1)] + 1
m ≡ 0 mod n
e che quindi:
e*d
m ≡ m mod n
Come è già stato reso noto, RSA fa uso tra le altre cose di due numeri primi p e
q sufficientemente grandi.
Li sceglieremo di almeno 100 cifre, così da essere sicuri che si tratti di numeri
molto alti. Ora, scegliendo un numero a caso cosiffatto, voglio sapere che
probabilità ho di averne scelto davvero uno primo.
Ma quanti sono questi π (100)? Sono molti? Sono pochi? Esiste una formula
matematica che ne calcola il numero esatto.
La stima va fatta su π (100) - π (99) per eliminare dal conteggio tutti gli
eventuali numeri primi con 99 cifre o meno. Dopotutto voglio contare solamente
i numeri primi con 100 cifre.
La formula da applicare è:
x = x / ln (x)
in questa maniera:
π (100) - π (99) = [10 100 / ln (10 100 )] – [10 99 /ln (10 99 )] = 4*10 97
Più il conteggio delle cifre di p e q è alto minore è la probabilità di un attacco a
forza bruta con effettivo successo.
2) Fattorizzazione:
Come posso fattorizzare numeri primi molto grandi? Solitamente si parte dal più
piccolo numero primo e lo si divide per ogni sottomultiplo in maniera
sistematica e consecutiva.
Ma posso farlo anche con n? Il problema è dato dal tempo di cui disponiamo.
Fattorizzare un numero grande come il numero primo n conduce ad un problema
computazionalmente intrattabile.
3) Algoritmo di Euclide:
a = b * q1 + r1
b = r 1 * q 2 + r2
rk-1 = rk * qk+1 + 0
rk = GCD tra a e b
x*a+y*b=d
Se a e b sono coprimi, MCD (a,b) = 1, allora x * a +y * b = 1
con d numero di inversi diversi. Si dimostra infatti che non è vero che se
MCD è diverso da 1 non esistono inversi.
Siano r1…n dei numeri naturali a due a due coprimi tra loro, ovvero
MCD(ri, rj) = 1 con i e j diversi per ogni i e j.
x ≡ b mod n
x ≡ a1 (mod r1)
x ≡ a2 (mod r2)
…
x ≡ a n (mod rn)
m e = c mod n
m e ≡ a1 (mod r1)
m e ≡ a2 (mod r2)
…
m e ≡ a n (mod rn)
In questo modo si fanno calcoli con numeri più piccoli. Usato per velocizzare le
operazioni di cifratura.
p-1
a ≡ 1 mod p
a ^ Φ (n) ≡ 1 mod p
1) Radice quadrata di n:
2) Calcolo di Φ (n):
ax2 - bx + c = 0
3) Porzioni di p, q e d:
È possibile anche con porzioni anche solo del 25% di d. Quest'attacco danneggia
il sistema in un tempo lineare.
RSA è un algoritmo potente tuttavia presenta delle caratteristiche sulle quali bisogna
riflettere come:
- RSA è lento a cifrare per questo si cifra solo la chiave mentre il messaggio lo si
cifra usando un altro algoritmo
ATTACCHI AD RSA:
Vediamo ora alcuni attacchi al sistema che si basano appunto su una scorretta
implementazione dello stesso da parte del programmatore.
2) SHORT PLAINTEXT:
Abbiamo detto che RSA è lento e va usato per cifrare la chiave di un altro
algoritmo, il problema che può sorgere è che quando andiamo a cifrare qualcosa
di corto, l’attaccante può operare come segue per cercare di risalire a p o q.
2) Se scorrendo queste liste ci sono due valori che coincidono può fare:
3) TIME ATTACKS:
Questo è forse l’unico attacco non matematico apportato al sistema, si basa sui
tempi di decifratura dei bit.
Si calcola la varianza, che se è sopra una certa soglia vuol dire che c’è stato un
1, mentre se è sotto c’è stato uno 0. L’attacco è relativamente semplice però
funzionava, quindi bisogna in qualche modo difendersi.
Per fare ciò si moltiplica e divide ogni bit per lo stesso numero in modo da
lasciarlo invariato, ma da sballare i tempi di computazione rendendo impossibile
determinare il bit in ingresso.
1) PRINCIPIO FONDAMENTALE:
2) FATTORIZZAZIONE DI FERMAT:
n = i2 + j2 = (i + j) * (j – 1)
Se è vero che y2 = x2 allora si può dire anche che MCD(x-y, n) = (p, q).
Problema del logaritmo discreto
LOGARITMO DISCRETO:
Fissato un numero primo p, siano a ed b due numeri interi non nulli in mod p,
tali che:
b ≡ ax mod p
allora:
loga(b) mod p = x
0 <= x <= (p - 1)
ax ≡ b mod p
========
31 = 3 mod 7
32 = 2 mod 7
33 = 6 mod 7
34 = 4 mod 7
35 = 5 mod 7
36 = 1 mod 7
Difatti si può notare come siano stati generati tutti i valori di b da 0 a 6, escluso
lo 0.
ax ≡ b mod p
========
21 = 2 mod 7
22 = 4 mod 7
23 = 1 mod 7
24 = 2 mod 7
25 = 4 mod 7
26 = 1 mod 7
Difatti si può notare come non siano stati generati tutti i valori di b da 0 a 6.
Φ (n) = (p – 1)
e che quindi:
Non si conosce nessun algoritmo efficiente per il calcolo del logaritmo discreto loga b.
L'algoritmo più semplice che si può utilizzare, è quello di incrementare a per una
potenza k, fino a quando si arriva a trovare b. Questo algoritmo richiede un tempo di
esecuzione lineare di n e in tal modo esponenziale alla grandezza di n stessa.
aj mod p
(- N * k)
b*a mod p
Dopo aver costruito le liste, ad un certo punto si troveranno almeno due valori
uguali tra loro. Se si trova una coincidenza tra le due liste, si eguagliano le due
congruenze ed abbiamo che:
aj ≡ b * a(-N * k) ≡ a(j + N* k) ≡ b
e di conseguenza:
x=j+N*k
Il metodo funziona perché nelle liste devono esserci per forza di cose due valori
uguali, prima o poi. Non ne saranno mai sfornite.
x = x0 + x 1 * N
con:
dove:
x / N = x1
x0 = j
e k il quoziente:
x1 = k
j<N
N ≈ 2√(p
Questa tecnica vale solo per numeri primi grandi al massimo 10 20.
Si tratta di un attacco puramente deterministico: generando e confrontando
tutti gli elementi di ogni lista con gli elementi dell'altra ho un tempo di
esecuzione ed un impegno computazione veramente inaccettabile.
Per questo motivo si tende a generare solo la prima delle due liste (Baby Step)
in maniera ordinata, poi si genera un valore alla volta della seconda lista (Giant
Step): in questa maniera non ho bisogno di generare anche tutta la seconda
lista e se sono fortunato troverò la corrispondenza prima di generarla tutta.
2) INDEX CALCULUS:
Questo metodo è l'algoritmo noto più efficiente per il calcolo della x dei
logaritmi discreti in mod p. Esso fa uso di due procedure:
p1, p2, …, pB
relativamente piccoli (detta base di fattori), con la proprietà che una porzione
significativa degli elementi del gruppo mod p risultano avere quali fattori primi
soltanto elementi di B.
FASE DI PREPROCESSING:
se e solo se:
b * as mod p
4) Altrimenti, sia:
=>
La situazione è la seguente: due attori, Alice e Bob, comunicano tra loro ed uno
vuole dimostrare all'altro che possiede una certa informazione senza però
rivelarla. Per esempio, si pensi che Alice voglia vendere a Bob un algoritmo per
determinare l'esito corretto di una partita di pallone: Bob vorrà la garanzia, a
priori, che l'algoritmo funzioni perfettamente.
αx (mod p) ≡ b
x <= (p – 2)
α(p - 1) = 1 mod p
αx (mod p)
e ottiene b.
Abbiamo sempre a che fare con i nostri due attori, Alice e Bob, che vogliono
scambiarsi una chiave su un canale sicuro.
Devono fare in modo che la chiave non sia leggibile e distinguibile.
b1 = αx (mod p)
ed Bob calcola:
b2 = αy (mod p)
In questo modo entrambi ottengono lo stesso valore che sarà usato come
chiave pubblica che di fatto sul canale non è mai passata.
Questa fu l'idea che stava alla base dei primi crittogrammi della storia a chiave
pubblica.
3) ELGAMAL PUBLIC KEY CRYPTOSYSTEM:
Si basa sul concetto di chiave pubblica e privata, in quanto viene usata la chiave
pubblica del destinatario per cifrare, mentre la decifratura viene eseguita con la
chiave privata del destinatario.
I nostri due attori, Alice e Bob, comunicano. Supponiamo che Alice voglia
spedire un messaggio a Bob.
b ≡ as (mod p)
PUB (a, p, b)
3) Alice allora scarica la chiave pubblica dal server dove l'ha pubblicata Bob e
cripta il suo messaggio m:
r ≡ αk (mod p)
t ≡ bk * m (mod p)
4) Alice prende allora la coppia (r, t) e la spedisce a Bob dicendo che coincide
con il messaggio m cifrato. Il crittotesto è infatti formato da due informazioni e
non più da una sola: il messaggio non è stato manipolato, bensì nascosto.
–s
t*r ≡ m (mod p)
DIMOSTRAZIONE:
Verifico che:
–s
m=t*r mod p
Sia:
t = bk * m mod p
r = ak mod p
b = as mod p
Allora:
= ((as)k * m) * (ak) -s
mod p =
= a(k * s) * m * a( - k * s) mod p = m
t1 = m1 => t1 = bk * m1 mod p
t1 = m2 => t2 = bk * m2 mod p
t1 / m1 = bk
t2 / m2 = bk
m2 = (m1 / t1) * t2
Spedire sia r che t sembra dispendioso dal punto di vista che si mandano
troppe informazioni sul canale, tuttavia rende l'intero sistema sicuro.
Funzioni Hash
Le funzioni hash vengono utilizzate per firmare documenti e per verificare l’integrità
dei dati, cioè sapere se quello che è stato trasmesso è stato anche ricevuto
correttamente. E’ molto più conveniente firmare l’hash che il documento intero.
h = H(m)
Proprietà:
1) PREIMAGE RESISTANT:
Si pretende che dati due testi in chiaro m 1 ed m2 non sia possibile che in un
tempo ragionevole si possa trovare due valori che collassano sullo stesso
identico hash nell'insieme del dominio della funzione.
...
Come calcolo l'hash bit a bit? Ogni blocco dell'hash viene calcolato come lo XOR
tra tutti i bit al primo posto in ogni blocco in cui è suddiviso il messaggio in
chiaro:
.…
H = h1, h2, …, hr
Questo modello di funzione hash mescola i bit dei blocchi in cui è stato
suddiviso il messaggio in chiaro. Se per caso si commette un errore su un bit di
conseguenza risulta sbagliato anche il relativo blocco di hash.
1) Garanzia di autenticità:
2) Garanzia di confidenzialità:
IL PADDING:
Si forma mettendo un 1 alla fine del messaggio originale e poi una lista di
zeri fino a 64bit dalla fine.
Una volta ottenuto il messaggio congruo a 0 mod 512 con o senza padding e
con la sua ulteriore espansione, il messaggio andrà ora in pasto alla funzione
hash di SHA-1.
La funzione hash di SHA-1 lavora su 80 round, ma non utilizza gli stessi dati per
tutti quanti, infatti, ogni 20 round cambia funzione e costanti che utilizza (infatti
utilizza 4 funzioni ft() prestabilite più quattro costanti kt).
FUNZIONAMENTO:
1) Inizializzo i registri H0, H1, H2,H3, H4 con delle costanti prestabilite dai
creatori di SHA-1
5) Tutti gli altri blocchi fino a w79 (in quanto servono 80 sottoblocchi,
ovvero da w0 a w79) vengono calcolati nel seguente modo:
A = H0 B = H1 C = H2 D = H3 E = H4
H0 || H1 || H2 || H3 || H4
E’ una tecnica che può essere usata per attaccare le funzioni hash in
maniera probabilistica, in quanto si basa sulla probabilità di trovare due
messaggi diversi con lo stesso hash.
Il paradosso del compleanno può essere spiegato con un esempio:
1 – (1 / 365)
[ 1 – (1 / 365)] * [1 – (2 / 365)]
1 – (22 / 365)
Facendo tutti i conti si ottiene 50,7% che è una probabilità molto alta!
Questo risultato è dato dal fatto che le considerazioni fatte prima sono
vere, ma solo in parte, infatti, il nostro problema non era trovare che due
persone in particolare compissero gli anni lo stesso giorno, andava bene
una qualunque coppia del gruppo. Questo fatto porta a confrontare tutte
le possibili coppie che si possono formare con 23 persone e questo porta
ad un aumento della percentuale di successo. Con 30 persone la
probabilità sale ancora a 70% circa e con 40 persone si raggiunge l'89%
circa.
Ipotizzo che:
1 – e^[ - log(2)] =
2
r= √N
Voglio cercare più collisioni tra più elementi e modifico la formula come
segue:
r = k√N^(k - 1)
H(Kab)
e prende gli 8 bit meno significativi dell'hash della chiave condivisa, quindi
calcola:
x1 = L8 (H(Kab))
3) Alice cifra il primo blocco del testo in chiaro p 1 facendo lo XOR con x1:
c1 = p1 XOR x1
x2 = L8 (H(Kab) || x1)
e cifra il secondo blocco del testo in chiaro p 2 facendo lo XOR con x2:
c2 = p2 XOR x2
p1 = c1 XOR x1
p2 = c2 XOR x2
…
pn = cn XOR xn
Se Alice volesse usare una sua password giornaliera per cifrare potrebbe
appenderla come è stato fatto per x1, però deve ricordarsi di spedirla a Bob.
1) RSA SIGNATURE:
1) Alice svolge tutte le operazioni fatte in RSA e rende pubbliche PUB(e, n),
tiene private PRIV(p, q ,d)
f = md mod n
2) Bob si calcola:
x ≡ f e mod n
2) BLINDED SIGNATURE:
Per effettuare una firma digitale servendosi di RSA occorrono tutti i parametri
prestabilisti da RSA., di conseguenza PUB(e, n) e PRIV(p, q, d).
1) Alice svolge tutte le operazioni fatte in RSA e rende pubbliche PUB(e, n),
tiene private PRIV(p, q ,d)
GCD(k, n) = 1
calcola:
t = ke * m mod n
e spedisce s a Bob.
4) Bob calcola:
s / ke ≡ md
In tutto questo Alice non ha mai visto il messaggio m, ma l’ha firmato, in questo
modo Bob potrebbe truffarla se solo lo volesse.
Per effettuare una firma digitale servendosi di Elgamal occorrono tutti parametri
prestabilisti da Elgamal., di conseguenza PRIV(l) e PUB(a, b, p).
Operazioni di firma:
GCD(k, (p - 1)) = 1
r ≡ ak mod p
A questo punto, Alice spedisce a Bob il messaggio firmato, ovvero (m, r, s),
ovvero il messaggio in chiaro più r ed s sul canale
3) A questo punto, Bob per verifica che s sia autentico scarica dal server la
chiave pubblica PUB(a, b, p) e calcola:
v1 ≡ b r * r s mod p
assieme ad:
m
v2 ≡ a mod p
v1 = v2
DIMOSTRAZIONE:
m
v2 ≡ a mod p
ma voglio riscrivere:
m=s*k+l*r
allora:
v2 ≡ a^(s * k + l * r) mod p
v2 ≡ (a l ) r * (a k) s mod p
sapendo che:
a l= b
a k= r
quindi:
v2 ≡ r s * b r mod p
Il problema sorge quando, cifrando più e più volte, si può risalire a parte del
messaggio se continuo ad utilizzare sempre lo stesso k.
Questi due metodi appena spiegati (la firma con RSA e quella di ElGamal)
appartengono ad utilizzi della firma digitale molto diversi tra loro:
1) Con RSA manderò sul canale solo la firma senza il messaggio annesso, in
modo da risalire al testo in chiaro tramite un algoritmo di cifratura
Calcolo infatti l'hash di m e poi cifro l'hash con RSA ed invio il messaggio
assieme a questa firma.
come garantire l'unicità di quell'hash quando chiaramente gli hash possono non
essere unici per documenti differenti?
Si utilizza allora un algoritmo hash forte che, assicura di non trovare nessuna
collisione in tempo utile.
È stato proposto dal NIST nel 1994 e si tratta di un algoritmo considerato sicuro
ed uguale al 90% a quello concepito da ElGamal. Il NIST puntava sulla sicurezza
facendo uso di specifici parametri.
E’ una schema di cifratura dove la firma viene appesa, lavora su input arbitrario
e l’output è di 160bit.
(p – 1) / q
a≡g (mod p)
e:
a q ≡ 1 (mod p)
0 < l < (q – 1)
e calcola:
b ≡ a l (mod p)
PUB(a, b , p, q)
PRIV(l)
-1
s≡k (m + l * r) (mod q)
6) Alice spedisce sul canale la firma, che sarà data da f(m, r, s) ovvero il
messaggio in chiaro più r ed s sul canale
7) Bob a questo punto scarica dal server la chiave pubblica di Alice, ovvero:
PUB(a, b , p, q)
e si calcola:
-1
u1 ≡ s * m (mod q)
-1
u2 ≡ s * r (mod q)
u1 u2
v = (a *b (mod p)) (mod q)
v=r
DIMOSTRAZIONE:
m ≡ (k * s – a * r) (mod q)
allora:
-1
k≡s * m + a * r * s-1 (mod q)
b ≡ a l (mod p)
riscriviamo r tramite b:
u1 u2
r = (a *b (mod p)) (mod q)
FUNZIONAMENTO:
e si spediscono b1 , b2.
b3 ≡ az (mod p)
5) Ogni volta che Alice manda un messaggio, Eva lo intercetta, lo decifra, e poi
lo cifra nuovamente usando la chiave che Bob è in grado di decifrare e poi gli
spedisce il messaggio
DIFESA:
b1 ≡ αx (mod p)
e lo spedisce a Bob
k ≡ (b1)y (mod n)
3) Bob genera:
b2 ≡ αy (mod n)
e la propria firma:
Ek(firmaBob(b1, b2))
e li spedisce ad Alice
k ≡ (b2)x (mod n)
e decifra:
Ek(firmaBob(b1 ,b2))
Ek(firmaAlice(b1, b2 ))
e la spedisce a Bob
Quando si ha a che fare con tanti utenti si hanno anche tante chiavi e per
scambiare queste chiavi si utilizzano in genere due tipi di protocolli:
1) KEY DISTRIBUTION:
2) KEY AGREEMENT:
ru(mod p)
a, b, c (mod p)
au = a + b * ru
bu = b + c * r u
g * u = a u* bu * x
kAB = gA * (rB)
kBA = gB * (rA)
Ci si può avvalere, allora, di enti fidati per la tutela della veridicità delle
chiavi generate e sono loro che, per primi, generano e gestiscono queste
chiavi all'interno del loro database.
2) KERBEROS:
Si pensi che il client voglia avere un servizio dal server ma che non glielo
voglia chiedere direttamente.
Quindi:
4) PGP:
1) SET:
2) SSL:
3) TLS:
SSL e TLS sono utilizzati più comunemente. Sono protocolli che assicurano la
generazione di un canale sicuro con un uso massivo di algoritmi di crittografia.
Protocolli di sicurezza
I protocolli di sicurezza fanno un uso massivo di crittografia per proteggere gli attori di
una conversazione e le informazioni che si scambiano tra loro.
Tuttavia, su internet, esistono banche di fama mondiale che utilizzano gli stessi identici
protocolli di sicurezza della posta elettronica di ateneo.
FUNZIONAMENTO:
Tuttavia Alice afferma di conoscere una radice di y. Bob vuole verificare tale
affermazione, ma Alice non vuole rilevare s. Procedono nel seguente modo:
r1 -1 * s mod n
r1 * r2 = s mod n
x1 ≡ r12 mod n
x2 ≡ r22 mod n
quindi sceglie una delle due x e chiede a Alice di calcolargli la radice quadrata
del suddetto numero
5) L’operazione viene eseguita più volte con diverse x fino a quando Bob non è
soddisfatto
2) DIGITAL CASH:
Le fasi di una corretta transazione di denaro digitale sono quattro ed alla fine
della transazione è necessario fare un controllo anti frode: magari uno o più
agenti della transazione sono fraudolenti. Le fasi della transazione sono:
1) Inizializzazione
2) Generazione del denaro e scambio di denaro:
Il mercante controlla i soldi ricevuti in particolare che non siano stati spesi
due volte e poi accetta/rifiuta il pagamento.
Il segreto non è altro che suddiviso in piccole sotto parti, ogni pezzo non è
uguale ad un altro e si distribuisce un pezzo di chiave ad ogni persona in modo
tale che una singola persona non sia in grado di ricostruire la chiave.
M = (M – r) + r
2) A Bob assegniamo r
3) A Carlo assegniamo s
M = M - r – s + r + s (mod n)
1) (m – 1) numeri casuali:
il suo limite è costituito dal fatto che lo schema presupponga che tutte le
persone che vogliono leggere il segreto siano presenti alla consegna delle
chiavi.
Se non ci sono abbastanza persone o se una volta riunite non vengono tutte le
persone che possiedono la chiave, il segreto viene irrimediabilmente perso.
1) Scegliamo:
t = soglia
w = totalità delle persone, con w >= t
p = numero primo sufficientemente grande
M = messaggio rappresentato da un numero mod p
Ovvero il messaggio M è rappresentato da un numero mod p che
vogliamo dividere tra w persone in modo che t di esse siano necessarie
per ricostruire il messaggio.
2) Scegliamo casualmente:
t – 1 interi (mod p)
li chiamiamo:
4) Allora si scelgono le x1, ..., x w mod p (che sono numeri interi, per
comodità piccoli e progressivi) da dare ad ogni persona del gruppo w.
dove:
yi ≡ S(xi) mod p
p1, p2, … , p w
ovvero fino alla generazione di tutti i punti passanti per la curva descritta
dal polinomio S(X).
< x i , yi >
< x i , yi >
yk = M + (s1 * x1) + (s2 * x2)2 + … + (sk * xk)(t – 1) mod p, con 1 <= k <= t
x1, …, x (t - 1)
s0, …, S t
Una curva ellittica è una curva che non ha niente a che vedere con le ellissi (ma anzi
ha a che fare con gli integrali ellittici) e la sua forma più generica, poiché ne ha
diverse a seconda degli usi, è descritta dall'equazione:
E.C. y2 = x3 + ax2 + bx + c
Tuttavia a noi non interessa più di tanto l'espressione matematica della curva in sé,
ma l'insieme E.C. formato dalle coppie (x, y) tali per cui:
Esempio:
Se decidiamo di lavorare in modulo p = 5 e prendiamo la E.C. scritta sopra
possiamo calcolarci tutti i punti che soddisfano l'appartenenza alla nostra
curva andando a sostituire i valori 0, 1, 2, 3 e 4 alla x.
Si consideri che le radici ellittiche sono equazioni con almeno tre radici minimo.
LEGGE DELL’ADDIZIONE:
Si sommano ora:
p1 + p2 = p3
1) CASO P1 ≠ P2:
y2 = x3 + ax2 + bx + c
e due punti p1 = (x1 , y1) e p2 = (x2, y2) per ottenere p3 = (x3, y3):
2) CASO P1 = P2:
y2 = x3 + ax2 + bx + c
e due punti p1 = (x1 , y1) e p2 = (x2, y2) per ottenere p3 = (x3, y3):
1) Calcoliamo il coefficiente angolare m della retta per cui si fa la derivata
della E.C.
(y – y1) = m * (x – x1)
1) P + ∞ = P
Per eseguire le sottrazioni di due con le curve ellittiche si procede nel seguente
modo:
Cambiando dunque il segno della y si può eseguire una sottrazione con la regola
della somma.
FORMULE GENERALI:
Abbiamo visto alcuni metodo per calcolare la somma di due punti, tuttavia
questi metodi sono un po’ lunghi da eseguire ogni volta per cui esistono le
seguenti formule che velocizzano tutto il processo.
y2 = x3 + ax2 + bx + c
e due punti p1 = (x1 , y1) e p2 = (x2, y2) per ottenere p3 = (x3, y3):
X3 = m2 – x1 – x2
Y3 = m * (x1 – x3) - y1
dove m:
E' importante ricordare che la legge dell'addizione gode delle proprietà associativa e
commutativa.
Per cifrare le curve ellittiche non si scelgono a caso bensì da una serie
studiate appositamente per essere usate al posto di RSA.
ASPETTI MATEMATICI:
E' importante ricordare che le formule esplicitate poco prima non è detto
funzionino sempre, specialmente se si lavora per esempio nei numeri interi e si
ottiene, tramite le suddette, un numero frazionario.
Per risolvere il problema lavoro in mod p, ma anche in questo caso non è detto
che esista l'inverso di tutti i numeri in tutti i moduli.
1) CIFRARE:
N=p+1
Se p è un valore piccolo ho di conseguenza pochi punti sulla curva ellittica
(poiché N coincide per lo più con p + 1) ed è più probabile un attacco a
forza bruta.
|N – p – 1| < 2 * √p
il che equivale a dire che fissati N e p esiste sempre una curva ellittica in
mod p con quegli N punti se la disuguaglianza vale per N e p.
Per applicare il logaritmo discreto alle curve ellittiche, basta prendere una
curva ellittica e due punti A e B che appartengono alla stessa.
Per applicare questo processo bisogna scegliere quindi due punti sulla
curva ellittica, e per fare questo vengono usati dei metodi probabilistici, il
più famoso è quello di Koblitz.
y2 = x3 + ax2 + bx + c (mod n)
GCD(den, n)
Ripeto il calcolo di m:
GCD(den, n) = a
È così che trovo tutti i componenti della chiave n del sistema della E.C.
Dal punto di vista grafico calcolare una curva mod n è come calcolarne
due una mod q e l'altra mod p, tuttavia le due curve distinte possono
andare all'infinito in due momenti diversi (quindi trovano l'm che da
problemi in due momenti diversi).
Piuttosto che calcolare la somma di p volta per volta scelgo fin da subito
un valore di p molto alto (se non trovo il valore di p giusto entro gli 80,
non ha senso che faccia la somma fino ad 80, ma posso prendere
direttamente 80). Scelgo quindi p grande.
3) NUMERI LISCI:
Sia che m è il numero che mi da “rogne” ed è il primo tra tutti quelli che
potrebbero darmi fastidio anche in futuro se continuassi a sommare p (se
ho sommato p 8 volte → m = 8).
Tale numero divide il numero totale di punti che possiede la curva → N/m
ma N è molto grande.
E’ dimostrato che prendere dei valori alti per i punti a caso aumenta la
probabilità che i punti facciano parte della curva ellittica.
A questo punto sono sicuro di trovare il valore per cui andare all'infinito.
Solitamente non si fa uso di curve ellittiche con radici multiple per evitare di
complicarne l'utilizzo, ma nulla vieta che se ne possano usare a piacimento a
seconda del bisogno.
Comunque sia, si utilizzano solamente curve forti ed una curva è definita forte
quando è il NIST a dirlo.
È stato appunto l'ufficio americano a stilare una lista di curve ellittiche testate
da loro e selezionate a scopo crittografico: le curve sono 15, 10 delle quali
lavorano in:
ASPETTI INFORMATICI:
Come sempre ci sono due attori, Alice e Bob, che vogliono comunicarsi un
messaggio e lo vogliono cifrare.
1) Alice sceglie:
b=a*n
(E.C., a, b)
y1 = k * a
e:
y2 = (k * b) + x
y2 – (n * y1) = x
y2 – (n * y1) = (x+ k * b) – n * (k * a)
b=a*n
(x+ k * b) – n * (k * a) =
= (x+ k * b) – b * k = x
Il vantaggio nell'utilizzo di una curva ellittica per cifrare sta nel fatto che
non esistono attacchi validi per gli algoritmi tradizionali che funzionino
anche sulle curve ellittiche:
Alice → Na
Bob → Nb
3) Alice calcola:
Na * G
4) Bob calcola:
Nb * G
Cosi si scambiano i due valori (ed è qui che entra in gioco il logaritmo
discreto nel caso delle curve ellittiche)
Na * (Nb * G)
Nb * (Na * G)