Professional Documents
Culture Documents
*
Adler Rensso Chung Gonzalez
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++.
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:
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.
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.
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 4 Seleccionar un entero e tal que 1 < e < (n) y mcd(e, (n)) = 1, donde e y
(n) son primos relativos.
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.
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
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>
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;
}
longinti = 2;
boolcoprime = true;
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;
}
return y;
}
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;
}
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;
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() {
longint n, d = 0, e;
generate_key(n, d, e);
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