Capitolo 3: Schema di firme DSS

3.1 Digital Signature Standard (DSS)

Nell'agosto del 1991, il National Institute of Standard and Technology (NIST) propose il Digital Signature Algorithm (DSA), per essere usato nel nuovo Digital Signature Standard (DSS).
Questo standard fu rivisto nel 1993
[3], in risposta alle numerose critiche mossegli contro. Questo standard specifica un algoritmo di firme digitali a chiave pubblica (DSA) usato per le applicazioni di firme digitali.
Prima di fare confusione, diamo uno sguardo alla nomenclatura: il DSA è l'algoritmo; il DSS è lo standard. Lo standard esegue l'algoritmo e l'algoritmo è una parte dello standard.
In questa sezione descriveremo il DSS per la generazione e la verifica di firme digitali, e l'algoritmo per la generazione di chiavi pubbliche e private. In entrambi i processi di generazione e firma il messaggio M è compresso dalla funzione hash (SHA) che fornisce come output un messaggio di 160 bit.

 

3.2 Parametri del DSS

La chiave è K ={ p , q , a , b , s } dove: p è un numero primo la cui lunghezza è compresa tra 512 e 1024 bit, multipla di 64; q è un numero primo di 160 bit che divide p-1; a Î Zp* è un elemento di ordine q ( l'ordine di a è il più piccolo intero positivo q tale che aq=1 mod p); s < q è un numero casuale segreto di 160 bit; b=as mod p è un numero di 160 bit. La chiave pubblica è ( p, q, a , b ) mentre quella privata è ( p, q, a , s ). Inoltre P=Zp*, A=Zq x Zq.

3.3 Generazione della firma

La firma del messaggio M è una coppia di numeri (g,d) calcolati secondo i seguenti passi.
 

Algortimo di Firma DSS

La firma F di un messaggio M è:

1. Calcola un numero casuale r tale che 1£r£q-1

2. g=(ar mod p) mod q

3. d=(SHA(M)+sg)r-1 mod q

sigK(M,r)=(g,d)

Nel passo 3, l'inverso di r esisterà certamente poichè 1£ r £ q-1 , e gcd(r,q)=1 in quanto q è primo. Il valore di SHA(M) è di 160 bit.

3.4 Procedura di verifica

Per verificare la firma F del messaggio M, Bob deve conoscere la chiave pubblica ( p , q , a , b ) di Alice.
 

Algortimo di Verifica DSS

La verifica della firma F di un messaggio M è:

1. e'=SHA(M)d-1 mod q

2. e''=gd-1 mod q

3.4.1 Correttezza procedura di verifica

Verifichiamo la correttezza della procedura di verifica:

3.5 Critiche al DSS

Quando il DSS è stato proposto dal NIST come standard, ci furono diverse critiche. Sfortunatamente, queste critiche furono più politiche che accademiche. RSA Data Security Inc., autrice dell'algoritmo RSA, condusse la maggior parte delle critiche contro il DSS. Essa voleva RSA, e non un altro algoritmo, usato come standard, questo perchè le licenze d'uso dell'algoritmo RSA avrebbero fornito grossi proventi alla RSADSI, mentre uno standard di firme digitali libero da licenze avrebbe comportato una diminuzione del suo fatturato. Lo standard proposto fu sviluppato dalla National Security Agency (NSA) senza l'ausilio dell'industria statunitense, e molti criticarono questo approccio a "porte chiuse" senza tener conto dei meriti del sistema proposto. Diverse critiche tecniche, invece, furono fatte sul sistema :

3.6 Generatori di Zp* e loro proprietà

In questa sezione definiamo il concetto di generatore del gruppo moltiplicativo Zp* ed alcune sue proprietà che sono utili allo schema di firme DSS. Dalla teoria dei numeri la cardinalità del gruppo moltiplicativo Zp* è f(p), dove f(p) è detta funzione di Eulero, in particolare la cardinalità di Zp* è f(p)=p-1 se p è un numero primo.
Preso un elemento a qualsiasi in Zp*, l'ordine di a è il più piccolo intero positivo r tale che ar=1 mod p. Se, in particolare, l'ordine di Zp* è f(p), ogni elemento di Zp* è esprimibile come una potenza di a.
 

Definizione 3.6.1 Un gruppo G è ciclico se esiste G tale che per ogni bÎG esiste un intero i tale che b=ai. Tale elemento a è chiamato generatore di G.

Data, quindi, la definizione di gruppo ciclico segue che, preso Zp*, se l'ordine di a è f(p), allora a è detto generatore o elemento primitivo di Zp*. Se Zp* ha un generatore, allora Zp* è detto ciclico.

Diamo alcune proprietà dei generatori di Zp*:

  1. Zp* ha un generatore se e solo se n=2,4,pk,2pk, dove p è primo e k³1. In particolare, se p è primo, allora Zp* ha un generatore.
  2. Se a è un generatore di Zp*, allora Zp* ={ai mod p tale che 0£ i £ p-1}
  3. Supponiamo che a sia un generatore di Zp*. Allora b=ai mod p è ancora un generatore di Zp* se e solo se gcd(i,f(p))=1. Poichè Zp* è ciclico, allora il numero di generatori è f(f(p)).

3.7 Calcolo di un generatore di Zp*

Vediamo come calcolare un generatore di   Zp*. Una prima idea potrebbe essere quella di scegliere un elemento gÎZp* e vedere, calcolando le potenze g1,g2,g3,.... se genera tutti i possibili valori di Zp*. La complessità di tale algoritmo sarà proporzionale alla cardinalità a di Zp* e lavorerà in tempo esponenziale rispetto alla lunghezza di p. Se p è di 512 bit allora la cardinalità di Zp* è dell' ordine di 2512.
L'unico algoritmo conosciuto, in grado di determinare efficientemente un generatore di un gruppo ciclico Zp* presuppone la conoscenza della fattorizzazione di p-1, in quanto si basa sul seguente teorema:
 

Teorema 3.7.1 Sia dato un gruppo ciclico G con |G|=p-1 e sia data la fattorizzazione di p-1=p1e1 p2e2 .... pkek.
Allora a è un generatore di G se e solo se a(p-1)/pi ¹1 mod p "iÎ{1,..,k}

Dimostrazione: Supponiamo che a sia un generatore di G, se esistesse un iÎ{1,..,k} tale che a(p-1)/pi =1 mod p, l'ordine del sottogruppo generato da a è al più uguale a p1e1 ...pi-1ei-1pieipi+1ei+1....pkek <p-1. Assurdo.
Viceversa, per il teorema di Lagrange l'ordine di a divide |G|. Ma |G|=p-1 e gli unici elementi che dividono p-1 sono per ipotesi p1,...,pk . Se quindi, valgono le equazioni dell'enunciato deve risultare necessariamente che l'ordine di a è uguale a |G|.

Mostriamo l'algoritmo per la generazione di a che si basa sul precedente teorema:
 

Algortimo per trovare un generatore di un gruppo ciclico

INPUT: Un gruppo ciclico G di ordine p-1, con p primo;
              fattorizzazione di p-1 = p1e1 p2e2 .... pkek.

1. Scegli un elemento a caso x ÎG.

2. For i=1 to k do 

           calcola b= x (p-1)/pi mod p

           if b=1 then goto passo 1

3. OUTPUT: x come generatore del gruppo ciclico G.

Notiamo che il test al passo 2 dell'algoritmo si basa sul teorema 3.7.1.
Dalla proprietà 3 della sezione 3.6 segue che il numero di generatori modulo un numero primo p è f(f(p))=f(p-1). Inoltre, dalla teoria dei numeri risulta che f(p)>p/(6lnln p) per tutti gli interi p³5.
Segue quindi che f(f(p))=f(p-1)>(p-1)/(6lnln (p-1)).
Pertanto, la probabilità che un elemento scelto a caso in Zp* sia un generatore risulta essere maggiore o uguale a 1/(6lnln (p-1)).
In media il numero di iterazioni è minore di 6lnln (p-1).

Esempio:

Per p di 512 bit il numero medio di iterazioni è minore di 6lnln (2512)=35,23
Per p di 1024 bit il numero medio di iterazioni è minore di 6lnln (21024)=39,38

3.8 Generazione delle chiavi

Ora mostriamo un algoritmo per la generazione delle chiavi:
 

Algoritmo di generazione delle chiavi
  1. Seleziona un numero primo q tale che 2159<q<2160
  2. Scegli t tale che 0£ t £ 8 e seleziona un numero primo p tale che 2511+64t<q<2512+64t con la proprietà che q|(p-1)
  3. Selezione di un generatore a dell'unico gruppo ciclico di ordine q in Zp*
    3.1 Scegli a caso un elemento gÎZp* e calcola a=g(p-1)/q mod p
    3.2 if a=1 then goto passo 3.1
  4. Seleziona un intero a caso s tale che 1£ s £ q-1
  5. Calcola b=as mod p

La lunghezza di q è di 160 bit, la lunghezza di p va da 512 a 1024 bit utilizzando multipli di 64 bit (512, 576,...).
Il passo 3 trova un elemento a che è di ordine q, infatti aq = ( g(p-1)/q ) q=1 mod p e, quindi, per definizione a è un elemento di ordine q. Infine, l'algoritmo calcola i valori b e s della chiave.
I passi 1 e 2 richiedono la selezione di numeri primi; vediamo, quindi, di seguito un algortimo che ci permette di generare tali primi.

3.8.1 Algoritmo per la generazione dei primi

Prima di descrivere il funzionamento del seguente algoritmo, osserviamo che un approccio alternativo potrebbe essere quello di scegliere a caso il valore di p, e poi determinare un fattore q di (p - 1) che sia di 160 bit. Naturalmente questo tipo di soluzione risulta essere computazionalmente onerosa, in quanto involve la fattorizzazione di (p-1) per calcolare q. Nell'algoritmo proposto dal NIST viene scelto dapprima il valore q (160 bit) in maniera casuale, e successivamente si determina p; vediamo quali sono i passi attraverso i quali tale algoritmo lavora:
 

Illustriamo i passi di tale algoritmo.
Il ciclo 3-8 calcola il valore di q utilizzando la funzione one-way SHA che previene la possibilità di invertire i passi della computazione di q. Si noti che per LSB di un numero di intende il bit meno significativo e MSB il bit più significativo.
Nel ciclo 11-16 viene calcolato un valore per p. Se p è primo e la sua lunghezza è esattamente L, il ciclo 2-23 termina con la determinazione dei primi p e q. Altrimenti se p non è primo o la sua lunghezza non è esattamente L, allora il ciclo 11-16 viene ripetuto fino a quando un primo p viene trovato oppure il numero di iterazioni è minore di 4096. Se, dopo tale numero di iterazioni, non è stato ancora determinato un primo p di lunghezza L, allora viene ripetuto il ciclo 2-23 ricalcolando, quindi, il primo q. I parametri S e C rappresentano rispettivamente la sequenza casuale di bit per generare q, e il numero di iterazioni effettuate per generare p. Come tali sono dei testimoni della validità di p e q.
Questo algoritmo potrebbe comunque calcolare dei valori truffa di p e q, ma questo non è un problema per due motivi: innanzitutto i moduli per i quali tale proprietà è vera sono facili da scoprire; inoltre questi moduli sono così rari che la probabilità di calcolarne uno è più piccola della probabilità di generare un numero composto utilizzando una routine probabilistica di generazione di numeri primi.