Rivest–shamir–adleman (rsa)

Cifrario asimmetrico che sfrutta il problema della fattorizzazione di un numero primo in cui la chiave pubblica e formata da due numeri $n,e$ (noti) e la privata da $n,d$ (privati)

Generazione delle chiavi

$n$ viene scelto essere: $$ p\ast q $$ con $p$ e $q$ numeri primi molto grandim si calcola poi un numero coprimo di $n$ come segue $$\Phi(n) = (p-1) \ast (q-1)$$ a questo punto $e$ viene scelto fra i coprimi di $\Phi(n)$: $$gen(\Phi(n),e)= 1$$ infine viene calcolato $d$: $$d= e^{-1}\mod{n}$$ Le chiavi finali risultano essere:

$$ \displaylines{ k_{priv} = [d,n] \ k_{pub} = [e,n] \ } $$

La cifratura e la decifratura sono implementate come esponenziazioni modulari

$$ E_{rsa}(x)= x^e\mod n $$ $$ D_{rsa}(c)= x^d\mod n $$

E molto importante che nel caso $x \gt n$ questo venga frammentato per garantire una cifratura corretta

Ricerca numeri primi

Per implementare correttamente queste soluzioni e necessario trovare un’ implementazione efficiente per la ricerca di numeri primi

una possibile soluzione può essere

# numero random grande
int x = random.gen()
while(! primo(x)){ // test di primalita
x= x+2
}
return x

🔷 questa soluzione ha un tempo di esecuzione $o(ln(x))$

Test di primalità

Per ricercare un numero primo per la generazione dei segreti previsti per RSA e necessario definire un metodo per determinare se un dato numero e primo o meno, ci sono 2 metodologie per eseguire un test di primalità:

Attacchi a rsa

L’algoritmo RSA e vulnerabile a diverse tipologie di attacco:

Firma con rsa

RSA e un algoritmo di cifratura con recupero (e.g. che necessita di frammentare il messaggio e firmare i singoli pezzi), questo lo rende meno adatto a eseguire la firma di testi in quanto essa può essere trasportata da un file ad un altro se i blocchi sono identici.

Perché firmare con rsa: autenticazione a occhi chiusi

grazie alla proprietà moltiplicativa di RSA e vero che:

$$ c = (m^{dU}\mod nU)= ((m_1\ast m_2)^{dU}\mod nU) = \ ((m_1^{dU}\mod nU)\ast (m_2^{dU}\mod nU))^{dU}\mod nU $$

questo consente di implementare la cosiddetta autenticazione ad occhi chiusi, dove un nodo e in grado di firmare un messaggio senza conoscerne il contenuto

questa proprietà può essere sfruttata da un attaccante per far firmare messaggi a una destinazione che altrimenti non li firmerebbe

Link map