You are on page 1of 13

Sobre el algoritmo RSA

*
Adler Rensso Chung Gonzalez

Trujillo, Enero del 2017

Resumen
El algoritmo RSA es presentado. El concepto y los fundamentos matematicos
del algoritmo son discutidos. Se implementa el algoritmo en el lenguaje de pro-
gramaci on C++.

Palabras Claves: Algoritmo, RSA.

1. Introducci
on
En 1977, un ano despues de la introduccon de la criptografa de clave p
ublica por Diffie
y Hellman [2], se desarrollo un algoritmo conocido como el algoritmo RSA [3]. El
nombre se debe a las letras iniciales de los apellidos de los investigadores: Ron Rivest,
Adi Shamir y Leonard Adleman. En el algoritmo RSA se generan un par de claves,
donde una de ellas es revelada al mundo exterior(clave p ublica) y la otra se mantiene en
secreto para el usuario(clave privada). Para generar las claves el algoritmo RSA utiliza
un concepto de la teora de n umeros que es llamada funci on de una va (one-way
function). Esta funcion es facil de evaluar, pero su funcion inversa es muy dficil. Esta
propiedad es aprovechada para generar una clave privada conociendo la clave p ublica
del usuario y, de ese modo, el mensaje permanece en secreto.
*
Universidad Nacional de Trujillo - Escuela de Postgrado- Seccion de Ciencias Fsicas y
Matematicas.

1
2. Preliminares
2.1. La idea
Se asume que dos personas, digamos Alicia y Bob, quieren intercambiar mensajes se-
cretos entre ellos usando criptografa de clave asimetrica, especialmente el algoritmo
RSA. Ellos primero generan sus claves y publican su clave p ublica de manera que la otra
parte pueda tener acceso a esta. Las notaciones para la clave p ublica y clave privada
de Alicia son P UA y P RA , respectivamente. Analogamente, para P UB y P RB . Cada
uno de los participantes mantiene su clave privada en secreto. cuando Alicia quiere
enviar un mensaje a Bob, ella encripta el mensaje usando P UB , a la cual ella puede
acceder. Para cualquier mensaje, M , Alicia genera un texto cifrado(ciphertext), C, de
la siguiente manera:
C = P UB (M ).
Despues de recibir C, Bob puede desencriptar el mensaje empleando su clave privada,
P RB . Esto se puede expresar formalmente como:

M = P RB (C).

Alguien, que no sea Bob ni Alicia, que intersecta C no sera capaz de reproducir M
incluso teniendo acceso a P UB pues:

1. En criptografa de clave asimetrica es imposible generar una clave cuando no se


tiene acceso a la otra clave.

2. Un mensaje que es encriptado mediante una clave no es posible desencriptar


utilizando una clave similar.

3. La clave p
ublica y privada para cualquier participante estan emparejados y son
inversas una de la otra, es decir,

M = P RB (P UB (M ))

M = P UB (P RB (M ))
Consecuentemente, un mensaje que es encriptado usando la clave p
ublica puede
solo ser desencriptado con su pertinente clave privada.

2.2. Un poco de teora de n


umeros
Dos numeros enteros a y b se dice que son n
umeros primos relativos si no tienen ning
un
factor primo en comun. Por ejemplo: 6 y 35 son primos relativos, pero 6 y 27 no son
primos relativos. Tambien se dice que a y b son primos relativos mcd(a, b) = 1.

Funci
on de Euler. Si n es un n
umero entero positivo, (n) se define como la

2
cantidad de enteros positivos menores o iguales a n y que ademas son primos rela-
tivos con n. Por ejemplo, (5) = 4 y (6) = 2. Para un n umero primo p se cumple
(p) = p 1. Si p y q son primos relativos, entonces (pq) = (p)(q) = n (p + q) + 1.
Por ejemplo, (30) = (5)(6) = 30 (5 + 6) + 1.

Teorema de Euler-Fermat. Si a y n son primos relativos, entonces

a(n) = 1( mod n)

3. El algoritmo RSA
El algoritmo RSA comprende tres pasos:

1. Generacion de clave

2. Encriptacion

3. Decriptacion

3.1. Generaci
on de clave
El algoritmo RSA genera un par de claves. Estas claves son usualmente generados
empleando numeros primos grandes. El algoritmo para la generacion de claves es el
siguiente:

Paso 1 Elegir, de manera aleatora, dos primos grandes p y q tal que p 6= q.

Paso 2 Calcular n tal que n = p q.

Paso 3 Calcular (n) = (p) (q) = (p 1) (p 1).

Paso 4 Seleccionar un entero e tal que 1 < e < (n) y mcd(e, (n)) = 1, donde e y
(n) son primos relativos.

Paso 5 Calcular d como el inverso multiplicativo de e( mod ((n)), es decir, de = 1


mod (n).

Paso 6 Publicar El par P U = (e, n) como la clave p


ublica del participante.

Paso 6 Mantener el par P E = (d, n) tan secreto como la clave privada del partici-
pante.

3
3.2. Encriptaci
on
Alguien que desee mandar un mensaje puede utilizar la clave p ublica (e, n). En el
ejemplo previo, cuando Alicia desea enviar un mensaje a Bob, ella puede ahora encriptar
el mensaje M de la siguiente manera:
C = M e( mod n)
Alicia manda el texto cifrado, C, a Bob.

3.3. Decriptaci
on
Despues de recibir C de Alicia, Bob ahora puede desincriptar el mensaje utilizando la
puede obtener M usando la siguiente expresion:
clave privada relativa. El
M = C d( mod n)
Desde que nadie mas tiene la clave privada de Bob, nadie mas que Bob puede ser capaz
de desincriptar el mensaje.

Los seudocodigos de procedimiento de la generacion de claves son discutidos en los


algoritmos 1, 2 y 3. Seguimos a [1] en la elaboracion del algoritmo y la implementacion.

3.4. Ejemplo
En este ejemplo se ilustra como funciona el algoritmo RSA. Suponga que Alicia desea
enviar un mensaje a Bob y el genera su clave de la siguiente manera:
1. Bob elige dos n
umeros primos, p = 17 y q = 13.
2. Entonces Bob calcula n tal que n = p q = 17 13 = 221.
3. El valor de (n) es calculado como (n) = 16 12 = 192
4. Bob elige e = 131.
5. Bob encuentra el n
umero d = 107
6. Ahora la clave p
ublica de Bob es (131, 221) y su clave privada es (107, 221).
Luego de la generacion de la clave, Bob publica su clave privada y Alicia tiene acceso
a esta clave p
ublica. Se asume que Alicia desea encriptar el siguiente mensaje, M = 8.
Alicia puede utilizar la clave p
ublica de Bob para producir C, es decir,
C = 8131 ( mod 221) = 70.
Bob recibe el texto cifrado 70 y utiliza su clave privada para reproducir M de la
siguiente manera
M = 70107 ( mod 221) = 8
Nadie mas que Bob, desde que no tiene la clave privada, puede desincriptar el mensaje.

4
3.5. Algoritmos

Algorithm 1 FindE( (n))


1: BEGIN
2: e 0
3: do
4: begin
5: Elegir un entero e (e debe ser coprimo de (n))
6: while (!CheckCoPrime (e, (n), e))
7: end do-while
8: return e
9: END

5
Algorithm 2 FindD ( (n), e)
BEGIN
2: Variables locales: a, b, x, y, u, v, m, n, q, r, gcd
a (n)
4: b e
x0
6: y 1
u1
8: v 0
gcd b
10: while (a! = 0) do
q gcd/a
12: r gcd % a
mxuq
14: nyvq
gcd a
16: ar
xu
18: yv
um
20: vn
end while
22: if y < 1 then
y (n) + y
end if
24: return y
END

6
Algorithm 3 GenerateKey(n, e, d)
BEGIN
Variables locales: p, q, (n), pt, ct
3: Ingrese dos n umeros primos y asigne en p y q, respectivamente.
n Multiplicar (p, q)
(n) (p 1, q 1)
6: e F indE((n))
d F indD((n), e)
/* el par (e, n) es ahora la clave p ublica y el par (d, n) es ahora la clave privada*/
9: END

7
4. Implementaci
on en C++(Referencia [1])

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>

using namespace std;

boolCheckIsPrime(long intnum)
{
if(num< 2) return false;

longinti = 2;
while(i< = num/2)
{
if(!(num% i)) return false;
i++;
}
return true;
}
longint Multiply(long int num1,long int num2)
{
return num1 * num2;
}

boolCheckCoPrime (long int num1, long int num2) {


longint lowest;

if (num1 > num2) lowest = num2;


else lowest = num1;

longinti = 2;

boolcoprime = true;

while (i< lowest) {


if (!(num1% i) && !(num2% i)) coprime = false;
i++;
}

returncoprime;

8
}

longintFindE(long intphi_n)
{
longint e = 0;

do {
cout<< "Elegir un numero entero e (e debe ser coprimo de phi_n): ";
cin>> e;
} while (!CheckCoPrime(phi_n, e));

return e;
}

longintFindD(long intphi_n, long int e)


{
int a = phi_n, b = e;
longint x = 0, y = 1, u = 1, v = 0, m, n, q, r;
longintgcd = b;
while (a ! = 0) {
q = gcd/a;
r = gcd% a;
m = x - u * q;
n = y - v * q;
gcd = a;
a = r;
x = u;
y = v;
u = m;
v = n;
}
if (y < 1) {
cout<< "Elegir un valor adecuado \"e\" <<endl;
e = FindE(phi_n);
FindD(phi_n, e);
}

return y;
}

longintEncrypt_Decrypt(long int t, long int e, long


int n)
{

9
longint rem;
longint x = 1;

while (e ! = 0) {
rem = e % 2;
e = e/2;

if (rem = = 1) x = (x * t)% n;
t = (t * t)% n;
}

return x;
}

voidEncDecStr (long int e, long int n)


{
char *str = new char[1000];
char *str1 = new char[1000];

cout<< "\nEnter a string: ";


cin>>str;

cout<< "Encriptar usando clave publica: " <<endl;


inti = 0;
while (i ! = strlen(str)) {
str1[i] = Encrypt_Decrypt(str[i], e, n);
i++;
}

cout<< str1 <<endl;


}
voidEncDecNum (long int n1, long int n2)
{
longintpn;

cout<< "\n Ingrese un numero entero: ";


cin>>pn;

cout<<Encrypt_Decrypt(pn, n1, n2) <<endl;


}

voidgenerate_key (long int&n, long int&e, long int&d)


{

10
longint p, q, phi_n, pt, ct;

do {
cout<< "Ingrese un numero primo: ";
cin>> p;
} while (!CheckIsPrime(p));

do {
cout<< "Ingrese otro numero primo: ";
cin>> q;
} while (!CheckIsPrime(q));

n = Multiply(p,q);
cout<< "n es " << n <<endl;

phi_n = Multiply (p-1,q-1);


cout<< $phi_n is $ <<phi_n<<endl;

e = FindE(phi_n);
cout<< $e is $ << e <<endl;
if (!e) {
cout<< "Elija dos numero sprimos adecuados"
<<endl;
exit(1);
}
d = FindD(phi_n, e);
cout<< "d is " << d <<endl;
}

int main() {

cout<<endl<<endl<< ?##IMPLEMENTATION OF R.S.A


ALGORITHM USING C++##? <<endl<<endl;

longint n, d = 0, e;

generate_key(n, d, e);

cout<< "Clave publica : ("<<e<<","<<n<<")" <<endl;


cout<< "Clave privada : ("<<d<<","<<n<<")" <<endl;

cout<<endl<< "Presione 1: para encriptar numeros & 2 para encriptar cadenas: ";
int choice;

11
cin>> choice;

switch (choice) {
case 1:
EncDecNum(e, n);
break;

case 2:
EncDecStr(e, n);
break;

default:
cout<< "Mala eleccion. Intente de nuevo." <<endl;
exit(1);
}
cout<<endl<< "Presione 1: para desincriptar numeros & 2: para desincriptar cadenas:
cin>> choice;

switch (choice) {
case 1:
EncDecNum(d, n);
break;

case 2:
EncDecStr(d, n);
break;

default:
cout<< "Mala eleccion . Intente de nuevo." <<endl;
exit(1);
}

return 0;
}

5. Conclusiones y recomendaciones
El algoritmo RSA ofrece un metodo para encriptar/desencriptar un mensaje. Se basa
en el concepto de funcion de una va de la teora de n
umeros. Su seguridad se basa en
la dificultad de factorizar n
umeros grandes. Se recomienda aplicar tecnicas mas eficaces
de programacion en la implementacion del algoritmo.

12
Referencias
[1] S. Azad, Al-S. K. Pathan (Editors) (2015) Practical Cryptography, CRC-Press,
Boca Raton.

[2] W. Diffie and M. E. Hellman (1976) New Directions in Cryptography, IEEE Trans-
actions on Information Theory, Vol. IT-22, no 6, 644-654.

[3] R.L. Rivest, A. Shamir, and L. Adleman (1978) A Method for Obtaining Digital
signatures and Public-Key Cryptosystems, Programming Techniques, Vol. 21, no.2,
120-126.

13