Primo requisito Diffie-Hellman

Primo requisito: calcolo di
...

Supponiamo di voler calcolare , in questo caso dovremmo prima calcolare e poi effettuare l'operazione di modulo , la risposta potrebbe avere anche solo 3 cifre, ma comunque siamo obbligati a fare calcoli su numeri molto grandi prima. Ciò che dovremmo fare è eseguire le moltiplicazioni necessarie e poi calcolarne il resto. Il calcolo delle potenze consecutive di 2 richiederebbe di eseguire la moltiplicazione modulare volte. Questo modo di procedere non è molto efficiente, soprattutto, quando l'esponente diventa molto grande. Un modo più efficiente di procedere è il seguente:
cominciamo con , ed eleviamo alla potenza di entrambi i lati dell'equivalenza ripetutamente: adesso, consideriamo il nostro lato sinistro e il nostro lato destro , dato che è la risoluzione di :
Dal momento che , il che vuol dire che per formare l'esponente dobbiamo avere , tra le altre cose, notiamo che abbiamo già i risultati in modulo di quelle potenze, per cui non ci basta che moltiplicare i resti ottenuti dalle congruenze precedenti:
Inoltre ci rendiamo conto che, le potenze di due per formare , ci danno modo di rappresentare il numero in binario:

L'algoritmo presentato di seguito, si basa su questo approccio. Ovvero, utilizzare l'esponente in binario, per calcolare il resto modulo qualche numero di una cifra molto grande.

Algoritmo in versione iterativa
...

Di seguito le cifre in binario che corrispondono all'esponente decimale per cui si vuole calcolare il modulo.
Ricordiamo di avere qualcosa della forma: , dove è il seguente numero binario:

Che cosa fa l'algoritmo?

Prima di vederlo in pseudocodice, vediamo più o meno qual è lo scopo dell'algoritmo.
L'algoritmo parte da , il motivo risiede nel fatto che qualsiasi numero elevato a ritorna .
Poi considera una ad una le cifre binarie dell'esponente, partendo dalla cifra più significativa (più a sinistra).
L'algoritmo esegue e su quel risultato esegue il modulo per .
Poi controlla se la cifra attualmente considerata è , in tal caso esegue anche il prodotto del valore corrente di per la base della potenza () e su quel risultato esegue il modulo per .

In breve, quando la cifra dell'esponente in binario è , viene eseguito solo il quadrato di , altrimenti se è , viene eseguito anche il prodotto per la base .

d = 1;
for(i = k; i >= 0; i--){
	d = (d * d) % q;
	if(b_i == 1) { // b_i vuol dire il b dell'iterazione i (il bit in posizione i)
		d = (d * a) % q;
	}
}
return d;
C

Dimostrazione di correttezza
Passo base: se , ovvero la lunghezza della stringa di bit è la stringa vuota, allora , il cui risultato è , in tal caso verrebbe ritornato .

Ipotesi induttiva: supponiamo vero l'algoritmo per una certa iterazione . Tale iterazione mi restituisce

Passo induttivo: dimostriamo la valenza dell'algoritmo per l'iterazione successiva ().

  • se
  • se
Algoritmo per calcolare (ricorsivo)
...


pari
dispari

int expmod(int a, int b, int q){
	// restituisce un valore minore di q
	if(b == 0) return 1;
	if(b % 2 == 0) // se b pari
		return sq(expmod(a, b/2, q)) % q;
	else // b dispari
		return (a * expmod(a, b - 1, q)) % q;
}
C