Esporrò adesso, in termini più tecnici, i principi di funzionamento dell'RSA.
In questo modo abbiamo determinato i numeri n, h e d di cui abbiamo già parlato.
Se chiamo k la quantità (dx-1)/phi(n), ottengo dx=dh=kphi(n)+1. Posso allora dimostrare perchè m=cd mod n:
Il codice RSA viene considerato sicuro perchè, essendo la formula di decifrazione basata su phi(n) calcolabile solo se a conoscenza di p e q, non esiste (o perlomeno non è noto) un algoritmo per scomporre n nei suoi fattori primi p e q in tempi accettabili. Bisognerebbe effettuare attacchi di forza bruta, provando cioè tutti i possibili casi. Fattorizzare un numero di 664 bit richiede almeno 1023 passi usando gli algoritmi più efficienti; per cui ipotizzando di avere una rete costituita da un milione di computer con ciascuno di loro che esegue un milione di passi al secondo, il tempo impiegato per fattorizzare n sarebbe dell'ordine dei 4000 anni. Se poi n fosse un numero a 1024 bit la stessa rete impiegherebbe 1010 anni per fattorizzarlo . Potrebbe sorgere il dubbio che esista un modo di calcolare phi(n) senza passare per p e q: questa ipotesi in effetti è verificabile ed è uno dei tanti motivi per non dare massima fiducia a questo algoritmo di cifratura.
Ho trovato tutti i parametri che mi servivano e, a questo punto, suppongo che il messaggio da cifrare sia m=3. Procedo e calcolo:
c=mh mod n=37mod 35=2187 mod 35=17
Se adesso volessi decifrare il messaggio, essendo a conoscenza della chiave segreta d, procedo in questo modo:
m=cd mod n=177mod 35=3
L’operazione dell’elevazione a potenza modulare consiste nel calcolare xy mod z dove x, y e z sono interi. Ma, lavorando con numeri estremamente grandi, gli elaboratori non sono in grado di eseguire da soli questi calcoli. E'allora necessario fare uso di algoritmi di calcolo che, benchè laboriosi, ci consentono di raggiungere il nostro scopo. Al momento, per la realizzazione del mio programma di crittografia a chiave pubblica basato sull'RSA, sto utilizzando il metodo naive, sotto illustrato. Ma ritenendolo poco efficiente (richiede un enorme lavoro della CPU) penso che lo sostituirò con un altro più veloce.
a=1
for i=1 to y do
a=(a*x)mod z
next
In pratica si calcola a=(a*x)mod z ripetendo l'operazione y volte. A questo punto il valore finale di a sarà il risultato di xy mod z, che abbiamo ottenuto evitando di lavorare con numeri troppo grandi. Tale algoritmo non è comunque molto efficiente, essendo il numero di cicli da eseguire uguale ad y. I metodi realmente utilizzati sono 2: il metodo "Left to right" e il metodo "Right to left". Ma parlerò in seguito di questi algoritmi, essendo ancora miei attuali argomenti di studio.
Osserviamo che per un crittoanalista rompere l'RSA equivale a calcolare f(n). Infatti, se n e f(n) sono conosciuti ed n è il prodotto di due primi p e q, n può essere facilmente fattorizzato risolvendo il seguente sistema di 2 equazioni in 2 incognite: n = p × q e f(n)= (p - 1)(q - 1). Nelle due incognite p e q. Sostituendo q = n / p nella seconda equazione se ne ottiene un’unica di secondo grado nella sola incognita p:
p2 - (n - f(n) + 1)p + n = 0.
Le due radici di questa equazione sono i fattori p e q. Quindi se un crittoanalista conosce il valore di f(n) può fattorizzare n e rompere il sistema.
Esempio Supponiamo che il crittoanalista conosca f(n) = 84754668 e n = 84773093.Queste informazioni gli permettono di scrivere l'equazione: p2 - 18426p + 84773093 = 0. Risolvendo l’equazione si ottengono le due radici 9539 e 8887 che rappresentano i fattori p e q di n.