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; }