La fattorizzazione e la phi di Eulero

La fattorizzazione e la phi di Eulero
Di Cristiano Armellini, [email protected]
Supponiamo di voler trovare i fattori p, q del numero intero n (anche molto grande). Dalla Teoria dei
numeri sappiamo che 1 1 è la phi di Eulero che rappresenta il
numero interi minori di n e primi con n. Essendo p, q numeri primi saranno sicuramente dispari quindi p-1,
q-1 sono numeri pari e ovviamente il loro prodotto (p-1)(q-1) sarà divisibile per 4 in quanto è il prodotto di
due numeri pari. Ora osserviamo che 1 1 1 1 , dove s =
p+q. Allora 1. Tuttavia è noto che se 0, , , deve essere 2√ e
quindi avremo che 1 2√ e questo implica che 4 1 2√. In realtà
secondo una importante proprietà deve essere √ ma data la particolarità di n = pq abbiamo
potuto ridurre questo limite inferiore.
Tra le numerose proprietà dimostrate della funzione phi di Eulero è noto che (detta la costante di EuleroMascheroni ):
√, 6
log !"# 3
!"log#
, 2
Dunque se pongo
% max √,
loglog# 3
loglog#
Allora abbiamo trovato che % ) ) 1 2√. Ora ci rimane solo da verificare quali numeri
divisibili per 4 contenuti in questo intervallo
sono tali ,che posto
1
0 , ci dà soluzioni intere che sono proprio i fattori di n. Infatti , l’equazione
*+√*, -./
.
E’ ovvio che più è piccolo l’intervallo più è veloce la ricerca dei fattori. L’obiettivo futuro è quello di trovare
delle relazioni per la phi di Eulero che restringano ulteriormente questo range. In effetti dato che non
è altro che il numero dei primi con n e minori di n sicuramente in questo insieme ci saranno tutti i numeri
primi minori di n ovvero , per il teorema dei numeri primi, 0 /
123 /
/
o anche 0 4
56
.
123 6
Ovviamente sarà 0. Tale approssimazione vale comunque per n sufficientemente grande.
Quindi possiamo supporre di considerare il nuovo intervallo 7 2√ 1
dove
7
89%, 0. Nel casi specifico dei problemi RSA, la chiave pubblica è determinata da una coppia di
valori (e,n) dove n è il numero da fattorizzare n = pq ed e è un numero intero positivo tale che
8:;<, = 1. Quindi in questo caso possiamo escludere dal range di possibili valori di tutti i
numeri multipli di 4 e tali che il loro massimo comun divisore con e sia diverso da 1 ovvero tutti i numeri
del range della forma 4>? ove m è un intero e ? è un divisore di e (che per forza di cose deve essere un
numero dispari). Questa considerazione (crivello) ci aiuta ad affinare ulteriormente la nostra ricerca.
Un’altra importante proprietà della funzione phi è la seguente: ∑5!/ A ovvero nel caso dei numeri
RSA n = pq , p q numeri primi abbiamo 1 1 1 1 1 cioè in latri termini
1 . Questo vuol dire che 1 # .
Chiamando con D allora possiamo considerare l’equazione di II grado per trovare
E , , ovvero p, q: E DE 1 D# 0, cioè E F+GF , H.FH.-./
e imponendo il delta
maggiore di zero ho D 4D 4 4 0 ovvero, dopo semplici passaggi sapendo che Q > 0 , D 2√ 1. Allo stesso risultato si poteva facilmente pervenire così: D 1 1 2 cioè D 2 2√ quindi D 2√ 1. Facendo variare Q (Q è sempre un numero
pari perché è la somma di due numeri pari) si arriverà a quel valore che fornisce valori interi dell’equazione
di II grado che altro non sono che 1, 1, quindi troviamo p, q. Osserviamo che, a
titolo di curiosità, dalle relazione 1 1 1 discende 1 2√
ovvero otteniamo la relazione già nota 1 2√.
Infine ricordiamo che vale
I/,
J,
K dove la funzione sigma è proprio K ∑5!/ A e in
generale K √ ma nel caso degli RSA è vero che K 1 2√.
M
Ricordiamo anche che nei numeri RSA tipicamente L N , k è un numero razionale compreso tra 1 e
3 (nel 95% dei casi). Allora 1 1 L 1 1 ma dato che q essendo il più
piccolo dei fattori deve essere 2 √ allora H/-O/
PH
√ quindi dopo semplici passaggi
algebrici 1 L 1√. Avere una stima anche di tipo statistico di k, ovvero del rapporto tra
il fattore maggiore e il minore può ridurre io range per .
Ai risultati precedenti si poteva anche giungere partendo dalla relazione 1 1 1 1 1 ovvero 1 quindi / e ponendo
T
R , S allora la relazione diventa 1 S U R ovvero S S1 R R 0 e
imponendo il delta maggiore di zero abbiamo R 2R 1 1 0 soddisfatta per R 1 2√ V R 1 2√ (il primo vincolo è quello che utilizziamo per i problemi RSA come estremo
superiore della funzione ). Come pure se 1 ; 1 allora 2 e n=pq porta a 2 X 0 dove X . Ma ponendo sempre il delta maggiore
di zero troviamo che X 2√ 2 in accordo con quanto avevamo già scoperto.
Se ci poniamo nel caso del problemi RSA allora possiamo scrivere
1 1 Y1 MZ 1 N e questo ci porta a pensare che ed n sono in realtà
molto vicini. Facendo esempi anche con numero molto piccoli già stimiamo che 0,9 \ . Se in
generale L calcoliamo una buona stima di k sapendo che 2√ 1 quindi L /-√/H
.
/
Allora basterà prendere L /-√/H
/
e considerare un numero di cifre di k pari alla parte intera
b/2 ove b è il numero di cifre del numero intero n da fattorizzare. Quindi L 2√ 1. Con
questo procedimento, specifico per i problemi RSA dove i fattori p, q sono molto grandi ma hanno
all’incirca le stesse dimensioni (lo stesso numero di cifre intere) l’algoritmo di fattorizzazione descritto
sopra è molto veloce perché si giunge subito alla stima almeno della prima metà delle cifre di .
Basterà poi selezionare gli multipli di 4 e compresi nell’intervallo L 2√ 1: quello
che 2O/ ] 1 >!A (teorema di Eulero) sarà il valore cercato di . Una volta fatto ciò si ricava la
somma di p+q quindi con l’equazione di II grado associata i valori di p, q sapendo il valore di n. Osserviamo
/
^
/
inoltre che 3 √, √ ^ , allora
√/
M ^, ovvero Y1 ^Z 1 M 1 ^
Y1 MZ Y1 NZ Y1 /Z Y1 √/
Z
√/
N
,
√/
ovvero
1
√/
^
1 N 1 /,
quindi moltiplicandi per n otteniamo Y1 ^Z Y1 cioè
Y1 ^Z Y1 generale se _ √, √ /_ allora Y1 `Z Y1 Z Y1 /Z Y1 Z Y1 /Z Y1 √/
√/
^
`
Z
√/
Z .
Z dove
√/
√/
In
ovviamente R > 3. Resta sempre il problema di capire che valore dare ad R. Se p, q hanno le stesse
dimensioni allora R potrebbe essere una potenza di 10 delle stesse dimensioni di p e di q (se n ha 100 cifre
p , q avranno 50 cifre quindi R 10.b . Dal momento che abbiamo provato 2√ 1
`
possiamo porre il limite superiore Y1 /Z Y1 √/
Z 2√ 1 per cercare di trovare un R ottimale
che limiti il range delle soluzioni nel caso dei numeri RSA.
Sviluppando in R si ha _ √/
√/-
2√ 1 quindi possiamo pensare di adottare
_ cd e √
< 2√ 1=f 1
√ 1
Un altro modo per calcolare la phi di Eulero consiste nell’applicare proprio il teorema di Eulero: se a è
intero coprimo con n, MCD(a,n)=1 allora 9O/ ] 1 >!A. Questo vuol dire che deve esistere un k
intero positivo tale che L 1 ovvero log g L 1. Quindi senza perdere di generalità
volendo trovare il minimo valore di k che soddisfa tale relazione potremmo pensare di prendere a = 2.
Dalle considerazioni precedentemente fatte sul range della funzione phi sappiamo che dovrà essere:
log L 1 √
Quindi L 2√/ 1/ per n > 6. Ma è anche vero che nel nostro caso
log L 1 2√ 1 quindi L 2/H-√/ 1/ .Per questioni abbastanza semplici k
deve essere dispari. Per finire qualche programma in C++ che sintetizza gli algoritmi descritti
#include <stdio.h>
#include <iostream.h>
#include <math.h>
void main(void) {
double n;
double x, y;
double s;
cout << "inserisci il numero n ";
cin >> n;
s= 2*floor(sqrt(n)-1)+2;
x = (s+2-sqrt(pow(s+2,2)-4*n))/2.0;
while (floor(x) != x){
s = s+2;
x = (s+2-sqrt(pow(s+2,2)-4*n))/2.0;
}
y = (s+2+sqrt(pow(s+2,2)-4*n))/2.0;
cout << "primo fattore " << x;
cout << " ";
cout << "secondo fattore " <<y ;
}
#include <stdio.h>
#include <iostream.h>
#include <math.h>
void main(void) {
double n;
double x, y;
double s;
double phi;
cout << "inserisci il numero n ";
cin >> n;
phi = floor(n-2*sqrt(n)+1);
while (phi/4. != floor(phi/4)){
phi = phi-1;
}
s = n-phi+1;
x = (s-sqrt(pow(s,2)-4*n))/2.;
while (x != floor(x)){
phi = phi -4;
s = n-phi+1;
x = (s-sqrt(pow(s,2)-4*n))/2.;
}
y = (s+sqrt(pow(s,2)-4*n))/2.;
cout << "primo fattore " << x;
cout << "
";
cout << "secondo fattore " << y;
}
#include <stdio.h>
#include <iostream.h>
#include <math.h>
void main(void) {
double n;
double x, y;
double s;
double phi;
cout << "inserisci il numero n ";
cin >> n;
phi = floor(n/(1.7*log(log(n)+3/log(log(n)))));
while (phi/4. != floor(phi/4)){
phi = phi-1;
}
s = n-phi+1;
x = (s-sqrt(pow(s,2)-4*n))/2.;
while (x != floor(x)){
phi = phi +4;
s = n-phi+1;
x = (s-sqrt(pow(s,2)-4*n))/2.;
}
y = (s+sqrt(pow(s,2)-4*n))/2.;
cout << "primo fattore " << x;
cout << "
";
cout << "secondo fattore " << y; }