Solidità del sistema rsa

329 views

Published on

scomposizione in fattori RSA

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
329
On SlideShare
0
From Embeds
0
Number of Embeds
91
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Solidità del sistema rsa

  1. 1. Solidità del sistema RSA Di Cristiano Armellini, cristiano.armellini@alice.it Si debba fattorizzare il numero n = pq dove p,q sono numeri primi anche molto grandi. Possiamo certamente scrivere n = pq = (n-x)(x-q) per opportuni valori di x, q. Quindi p+q = n-x+x-q=n-q. In base alle proprietà delle equazioni algebriche di II grado abbiamo che l’equazione 0 fornisce proprio i fattori di n, ovvero y=p,q. Osserviamo che se n è dispari allora x deve essere pari e quindi q deve essere a sua volta dispari. Risolvendo l’equazione e imponendo il delta maggiore di zero otteniamo facilmente che 2√ . A questo punto l’algoritmo è completo: verificheremo per i valori di q dispari 2√ quali ci danno soluzioni intere in a quel punto ci fermiamo perché abbiamo trovato i fattori di q. Ovviamente da n = pq = (n-x)(x-q) deduciamo, sviluppando il prodotto, che 0 ovvero abbiamo che con 2√ con lo stesso ragionamento del caso precedente (trovato x e q si ottengono automaticamente p, q). In molti casi (ma non in tutti) questi due algoritmi possono essere molto efficienti per fattorizzare i numeri RSA. In generale se allora 2√ infatti dall’equazione di II grado 0, e imponendo il delta maggiore di
  2. 2. zero ottengo 2√ . Svolgendo i calcoli da ottengo facilmente l’equazione 0, con 2√ . Fissato b basterà far variare a fino a quando non otteniamo valori interi per x il che implica trovare fattori p, q di n, p=a-x, q=x-b. Ovviamente potevamo considerare anche il caso ottenendo quindi 0, con 2√ . 2√ . Si può testare facilmente l’algoritmo con semplici listati in C/C++, Pascal, Python ecc Ecco il primo caso import math; def facto(n, b): a = 2*math.floor(math.sqrt(n))+b; x= ((a+b)-math.sqrt(math.fabs((a-b)*(a-b)-4*n)))/2; while(x != math.floor(x)): a =a+1; x= ((a+b)-math.sqrt(math.fabs((a-b)*(a-b)-4*n)))/2; p = a-x; q = x-b; print(p); print(q); print("-----"); y= ((a+b)+math.sqrt(math.fabs((a-b)*(a-b)-4*n)))/2; r = a-y; s = y-b; print(r); print(s); print("-----"); Di seguito il secondo caso.
  3. 3. import math; def facto(n, b): a = 2*math.floor(math.sqrt(n))-b; x= ((a-b)-math.sqrt(math.fabs((a+b)*(a+b)-4*n)))/2; while(x != math.floor(x)): a =a+1; x= ((a-b)-math.sqrt(math.fabs((a+b)*(a+b)-4*n)))/2; p = a-x; q = x+b; print(p); print(q); print("-----"); y= ((a-b)+math.sqrt(math.fabs((a+b)*(a+b)-4*n)))/2; r = a-y; s = y+b; print(r); print(s); print("-----");

×