Está en la página 1de 12

Anlisis e implementacin del RSA

Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

NDICE
Introduccin..........................................................................................................................................2
Un poco de historia...............................................................................................................................3
El pasado..........................................................................................................................................3
El Presente....................................................................................................................................... 4
Funcionamiento del RSA..................................................................................................................... 5
Generacin de claves....................................................................................................................... 5
Encriptacin..................................................................................................................................... 6
Desencriptacin............................................................................................................................... 6
Ataques al RSA................................................................................................................................6
Implementacin.................................................................................................................................... 8
Cdigo fuente...................................................................................................................................8
Traza del programa........................................................................................................................ 11
Bibliografa.........................................................................................................................................12
Libros............................................................................................................................................. 12
Webs.............................................................................................................................................. 12

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Introduccin
El objetivo de esta prctica es el anlisis y la implementacin del algoritmo de clave pblica
RSA. Para ello estudiaremos un poco la historia del criptoanlisis y luego pasaremos a estudiar
directamente este algoritmo. La implementacin se realizar en Java 1.5.01 de Sun Microsystems2
usando como entorno integrado de desarrollo Eclipse 3.03. Aunque para comprobar la validez de
nuestro programa y para probar otros entornos de desarrollo, tambin usamos NetBeans 4.04, un
entorno diseado exclusivamente para Java.

1
2
3
4

Java 1.5.0: http://java.sun.com/j2se/1.5.0/


Sun Microsystems: http://www.sun.com/
Eclipse: http://eclipse.org/
NetBeans: http://www.netbeans.org/

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Un poco de historia
El pasado
La primera aplicacin conocida de la criptografa se remonta a 4000 aos atrs, cuando los
Egipcios utilizaban jeroglficos crpticos para narrar la vida y hazaas de sus faraones. La
encriptacin no se empleaba para esconder el significado del texto sino para darle un carcter ms
solemne.
En la antigua China, el carcter ideogrfico del idioma serva para esconder el significado de
las palabras, aunque no parece que esta particularidad se hubiera empleado para
encriptar/desencriptar mensajes.
Varios pueblos de la antigedad emplearon diversos mtodos de encriptacin/ desencriptacin
de escritos, como los Griegos, los Espartanos y los Hebreos, pero los rabes y los Indios fueron los
que mayor desarrollo lograron en este campo, destacndose un rabe, Muhammad al-Qalqashandi,
quien invent una tcnica para descifrar mensajes que todava se usa en la actualidad.
La criptografa se torn importante durante la Edad Media, cuando los gobiernos se
comunicaban con sus embajadores por medio de mensajes cifrados. En 1453, el gobierno Italiano
establece un grupo dedicado exclusivamente al estudio de la criptografa, con el fin de perfeccionar
los mtodos de encriptacin de sus mensajes, as como para descifrar los de sus enemigos.
Con el tiempo, adems de los mtodos manuales aparecieron mquinas simples, como la
rueda de Thomas Jefferson. La llegada del telgrafo signific un importante avance en la
criptografa, al generalizarse el uso de mquinas electromecnicas para la encriptacin de mensajes.
Las dos guerras mundiales tambin impulsaron significativamente el avance de la criptografa y del
criptoanlisis.
El desarrollo de los computadores marc otro hito en el desarrollo de la criptografa, al
permitir efectuar complejos clculos matemticos en corto tiempo, tanto para encriptar, como para
descifrar mensajes.

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

El Presente
El fruto de las funciones criptogrficas inventadas en las ltimas tres dcadas se observa a
diario en el desarrollo de las firmas digitales, los certificados digitales, los sistemas de autenticacin
y el correo electrnico seguro. En la actualidad se emplean dos tipos de criptografa:
La criptografa simtrica, en la cual se usa la misma contrasea o llave para encriptar y para
desencriptar la informacin. Entre los sistemas de criptografa simtrica, podemos mencionar
Blowfish, IDEA (International Data Encryption Algorithm), FEAL (Fast Data Encipherment
Algorithm), DES (Data Encryption Standard) y los ms comunes que son el 3-DES, y el RijndaelAES, adoptado en 2000.
El usar la misma llave para encriptar y para desencriptar es un problema a la hora de enviar
datos, ya que el remitente debe enviar previamente la llave al destinatario para que ste pueda
desencriptar la informacin, y debe hacerlo por un canal seguro. Por lo tanto la criptografa
simtrica se emplea especialmente para almacenamiento seguro de datos (solamente una persona
necesita la llave). Para envo de datos es preferible la criptografa asimtrica.
La criptografa asimtrica, que emplea un esquema de llave pblica y llave privada. La
informacin se encripta con la llave pblica, y se desencripta con la llave privada. No presenta el
problema de transmisin de la llave que tiene la criptografa simtrica, ya que la llave pblica no
sirve para desencriptar la informacin.
Los sistemas de criptografa asimtrica incluyen el DH (Diffie & Hellman), el ElGamal,el
DSA (Digital Signature Algorithm), el Merkle-Hellman, el Chor-Rivest , el LUC, el McEliece, y
finalmente el RSA (Rivest, Shamir & Adleman) que es el ms ampliamente usado y objeto de
estudio de este trabajo.
Tanto la criptografa simtrica como la asimtrica basan su fortaleza en problemas
matemticos difciles de resolver, como por ejemplo la factorizacin de nmeros enteros grandes.
Sin embargo y debido al avance en la potencia de computacin, se estima hoy en da que solamente
ofrecen muy buena seguridad las llaves de 2048 bits en el caso de RSA y 256 bits para AES.

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Funcionamiento del RSA


Este sistema de clave pblica fu diseado en 1977 por los profesores del MIT
(Massachusetts Institute of Technology) Ronald R. Rivest, Adi Shamir y Leonard M. Adleman, de
ah las siglas con las que es conocido. Desde entonces, este algoritmo de cifrado se ha convertido en
el prototipo de los de clave pblica.
La seguridad de RSA radica en la dificultad de la factorizacin de nmeros grandes: es fcil
saber si un nmero es primo, pero es extremadamente difcil obtener la factorizacin en nmeros
primos de un entero elevado, debido no a la dificultad de los algoritmos existentes, sino al consumo
de recursos fsicos (memoria, necesidades hardware...incluso tiempo de ejecucin) de tales
algoritmos. Se ha demostrado que si n es el nmero de dgitos binarios de la entrada de cualquier
algoritmo de factorizacin, el coste del algoritmo es , con un tiempo de ejecucin perteneciente a la
categora de los llamados problemas intratables.

Generacin de claves
Supongamos que Alicia desea permitir que Benito le mande un mensaje cifrado sobre un
canal inseguro. Lo primero que ha de hacer es generar los pares de clave pblica (n,e) y privada
(n,d).
1. Elegimos dos nmeros muy grandes p y q (del orden de 300 cifras) que sean diferentes y
totalmente independientes el uno del otro. Calculamos n = p * q.
2. Calculamos la funcin de totient de n: totient(n) = (p-1)*(q-1)
3. Elegimos un entero e, tal que 1 < e < totient(n) y que ademas sea coprimo con totient(n).
4. Calculamos un d, tal que d * e = 1 mod totient(n).
5. La clave pblica es (n,e) y la privada (n,d).
Alicia le transmite su clave pblica a Benito y conserva la clave privada en secreto. Los
valores p y q son muy sensibles, ya que son la descomposicin en factores primos de n y los que
dieron lugar a e y d. Generalmente destruidos, aunque pueden conservarse en secreto, junto con la
clave privada, para acelerar el proceso de desencriptacin usando el Teorema del Resto Chino5.

5 Teorema del Resto Chino: http://en.wikipedia.org/wiki/Chinese_Remainder_Theorem

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Encriptacin
Ahora supongamos que Benito desea mandarle un mensaje a Alicia. Lo nico que tendr que
hacer es consultar la clave pblica de Alicia, dividir el mensaje que quiere enviarle, asignarle un
alfabeto numrico a cada trozo y calcular para cada divisin: c = ne mod n.

Desencriptacin
Con el mensaje que le ha llegado a Alicia, lo que tiene que hacer es dividirlo y usar su clave
privada para calcular: n = cd mod n.

Ataques al RSA
Ataque a mdulo comn: Una posible implementacin de RSA consiste en asignar el mismo
mdulo n a distintos usuarios, pero distintos valores para los exponentes e y d. Esto tiene el fallo de
que si el mismo mensaje se cifra con distintos exponentes y el mismo mdulo y ambos exponentes
son primos entre s (y generalmente lo sern), el texto en claro puede recuperarse sin ninguno de los
exponentes privados6. Sea P el texto en claro. Sean e1 y e2 los exponentes pblicos (claves de
cifrado) y n el mdulo. Los textos cifrados son: C1=Pe1 mod n y C2=Pe2 mod n. El criptoanalista
tiene acceso a C1, C2, e1, e2 y n. As es como recupera P: Al ser e1 y e2 primos entre si, existen
enteros r y s tales que r.e1+ s.e2 = 1. Supongamos sin prdida de generalidad que r es negativo
(alguno de los dos ha de serlo) entonces puede calcularse el inverso de C1 y se tendr que:

Ataque basado en un exponente pblico "bajo": Aunque un exponente bajo acelera el cifrado,
tambin lo hace ms inseguro. Si se encriptan e (e+1)/2 mensajes linealmente dependientes con
diferentes claves pblicas y el mismo valor de e hay un ataque contra el sistema7. Si los mensajes
son idnticos entonces es suficiente con e mensajes. La solucin ms sencilla a este problema es
aadir a los mensajes valores aleatorios independientes, PGP por ejemplo hace esto de modo que un
mismo mensaje no se cifrar dos veces de la misma manera.

6 G.J. Simmons, "A 'Weak' Privacy Protocol Using the RSA Cryptosystem.", Cryptologia, v.7, n.2, Abr 1983
7 J. Hastad, "On using RSA with Low Exponents in a Public Key Network", Advances in Cryptology, CRYPTO '85
Proceedings, Springer Verlag 1986

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Ataque basado en un exponente privado "bajo": Otro ataque8, permite recuperar d cuando ste
no supera un cuarto de n y e es menor que n. Esto ocurre raramente si e se elige al azar. El
fundamento matemtico del ataque es la representacin de los nmeros racionales como fracciones
continuas finitas.

Ataque por iteracin: Conocidos n, e y C un enemigo puede producir una sucesin de


mensajes C1=Ce mod n, C2=C1e mod n ... Ck=Ck-1e mod n. Si existe un Cj tal que C=Cj se
deduce que M=Cj-1 ya que Cj-1e=Cj=C. Este ataque se vuelve impracticable si p-1 y q-1 contienen
factores primos grandes.

8 M.J. Wiener, "Cryptanalysis of Short RSA Secret Exponents", IEEE Transactions on Information Theory, v.36, n.3,
May 1990

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Implementacin
Para implementar este algoritmo hemos decidido hacerlo todo en una sla clase, incluido el
programa de prueba que estar en el mtodo main de la clase. En caso de querer usarla en proyectos
futuros, con quitar el main se tiene y tambin sera aconsejable destruir los valores p y q despus de
generar las claves pblica y privada.

Cdigo fuente
import java.math.BigInteger ;
import java.util.* ;
import java.io.* ;
/*
* Clase:
* Descripcin:
* Autores:
*
* Entidad:
*/

RSA
Implementacin del algoritmo de clave pblica RSA
David Jesus Horat Flotats
Jorge Luis Caizales Daz
Universidad de Las Palmas de Gran Canaria

public class RSA


{
int tamPrimo;
// Tamao de cada primo
BigInteger n, p, q ;
// n = p * q
BigInteger totient;
// totient = (p-1)*(q-1)
BigInteger e, d;
// e * d = 1 mod n
public RSA(int tamPrimo) {
this.tamPrimo = tamPrimo;
generaPrimos(); // Genera p y q
generaClaves(); // Genera e y d
}
public void generaPrimos() {
p = new BigInteger(tamPrimo, 10, new Random());
do q = new BigInteger(tamPrimo, 10, new Random()) ;
while(q.compareTo(p) == 0);
}
public void generaClaves() {
// n = p * q
n = p.multiply(q);
// totient = (p-1)*(q-1)
totient = p.subtract(BigInteger.valueOf(1));
totient = totient.multiply(q.subtract(BigInteger.valueOf(1)));
// Elegimos un e coprimo de y menor que n
do e = new BigInteger(2 * tamPrimo, new Random());
while((e.compareTo(totient) != -1 ) ||
(e.gcd(totient).compareTo(BigInteger.valueOf(1)) != 0));
// d = e^1 mod totient
d = e.modInverse(totient);}

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

/**
* Encripta el texto usando la clave pblica.
*
* @param
mensaje
Ristra que contiene el mensaje a encriptar.
* @return
El mensaje cifrado como un vector de BigIntegers.
*/
public BigInteger[] encripta(String mensaje) {
int i ;
byte[] temp = new byte[1];
byte[] digitos = mensaje.getBytes();
BigInteger[] bigdigitos = new BigInteger[digitos.length];
for(i=0; i<bigdigitos.length; i++) {
temp[0] = digitos[i];
bigdigitos[i] = new BigInteger(temp);
}
BigInteger[] encriptado = new BigInteger[bigdigitos.length];
for(i=0; i<bigdigitos.length; i++)
encriptado[i] = bigdigitos[i].modPow(e,n);
return(encriptado);
}
/**
* Desencripta el texto cifrado usando la clave privada
*
* @param
encrypted
BigInteger array containing the ciphertext
to be decrypted.
* @return
The decrypted plaintext.
*/
public String desencripta(BigInteger[] encriptado) {
int i ;
BigInteger[] desencriptado = new BigInteger[encriptado.length];
for(i=0; i<desencriptado.length; i++)
desencriptado[i] = encriptado[i].modPow(d,n);
char[] charArray = new char[desencriptado.length];
for(i=0; i<charArray.length; i++)
charArray[i] = (char) (desencriptado[i].intValue());
}

return(new String(charArray));

public
public
public
public
public
public

BigInteger
BigInteger
BigInteger
BigInteger
BigInteger
BigInteger

damep() {return(p);}
dameq() {return(q);}
dametotient() {return(totient);}
damen() {return(n);}
damee() {return(e);}
damed() {return(d);}

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

public static void main( String[] args ) throws IOException


{
if(args.length != 1) {
System.out.println("Sintaxis: java RSA [tamao de los primos]");
System.out.println("e.g. java RSA 8");
System.out.println("e.g. java RSA 512");
args=new String[1];
args[0]="1024";
}
int tamPrimo = Integer.parseInt(args[0]);
RSA rsa = new RSA(tamPrimo);
System.out.println( "Tam Clave: [" + tamPrimo + "]" ) ;
System.out.println( "" ) ;
System.out.println( "p: [" + rsa.damep().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "q: [" + rsa.dameq().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "" ) ;
System.out.println( "Clave Pblica (n,e)" ) ;
System.out.println( "n: [" + rsa.damen().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "e: [" + rsa.damee().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "" ) ;
System.out.println( "Clave Privada (n,d)" ) ;
System.out.println( "n: [" + rsa.damen().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "d: [" + rsa.damed().toString( 16 ).toUpperCase() +
"]" ) ;
System.out.println( "" ) ;
System.out.println( "Texto a encriptar:" ) ;
String plaintext = ( new BufferedReader( new InputStreamReader( System.in
) ) ).readLine() ;
System.out.println( "" ) ;
BigInteger[] ciphertext = rsa.encripta( plaintext ) ;
System.out.print( "Texto encriptado: [" ) ;
for( int i = 0 ; i < ciphertext.length ; i++ )
{
System.out.print( ciphertext[i].toString( 16 ).toUpperCase() ) ;
if( i != ciphertext.length - 1 )
System.out.print( " " ) ;

}
System.out.println( "]" ) ;
System.out.println( "" ) ;

String recoveredPlaintext = rsa.desencripta( ciphertext ) ;


}

System.out.println( "Texto desencriptado: [" + recoveredPlaintext + "]" ) ;

10

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Traza del programa


A continuacin mostramos una traza del programa con un tamao de primos de 64 y con la
frase: "esto es una prueba para el RSA"

Tam Clave: [64]


p: [D1AAA6FE79B4DD2B]
q: [F0062810287E3A85]
Clave Pblica (n,e)
n: [C495075E61FCA884E8A11E0BC83CA557]
e: [9FA7AB3C0E4B91813E3FE96705E6F015]
Clave Privada (n,d)
n: [C495075E61FCA884E8A11E0BC83CA557]
d: [B8E6145EA8B44A2B8384356B9E42795]
Texto a encriptar:
esto es una prueba para el RSA
Texto encriptado:
[14D9A38D1F97129E83F76B1ED133BE15 89D92914F7937FC1A55298A9225221E6
963CFC27B8A5481CB41037A83512945A 943A28D621C8A572D582693BAF1328A3
862863B02FA92A6D71F35441C6BFDEB 14D9A38D1F97129E83F76B1ED133BE15
89D92914F7937FC1A55298A9225221E6 862863B02FA92A6D71F35441C6BFDEB
1390740563F9DDB1612F135F3755EA46 46294A4D33C5C42304510BCEDC9F6B9B
4CDF839D7363C9EB1EFC36655801D321 862863B02FA92A6D71F35441C6BFDEB
56D8188F0B496F590A5E77845A339C0E 3E91E0F8B6C3D931B169E7224B3EC4DA
1390740563F9DDB1612F135F3755EA46 14D9A38D1F97129E83F76B1ED133BE15
3915C6448A6207BD4AB2628B289D8B77 4CDF839D7363C9EB1EFC36655801D321
862863B02FA92A6D71F35441C6BFDEB 56D8188F0B496F590A5E77845A339C0E
4CDF839D7363C9EB1EFC36655801D321 3E91E0F8B6C3D931B169E7224B3EC4DA
4CDF839D7363C9EB1EFC36655801D321 862863B02FA92A6D71F35441C6BFDEB
14D9A38D1F97129E83F76B1ED133BE15 AE66BF15F1F70F2DE0377B6E264BD36D
862863B02FA92A6D71F35441C6BFDEB 8FF348A92A8105F4339EDDA45CA8BFE3
BC913C9CB18152A231B7399047FE6A78 5FC98AE889EB283DACDD233B5601542B]
Texto desencriptado: [esto es una prueba para el RSA]

11

Anlisis e implementacin del RSA


Criptografa U.L.P.G.C.

David Jess Horat Flotats


Jorge Luis Caizales Daz

Bibliografa
Libros
1. Handbook of applied cryptography / Alfred J. Menezes, Paul C. van Oorschot, Scott A.
Vanstone. -- Boca Ratn [etc.] : CRC, 1996
2. Public-key cryptography : state of the art and future directions : E.I.S.S. workshop
Oberwolfach, Germany, July 3-6, 1991 final report. -- Berlin : Springer, 1992
3. Computer networks / Andrew S. Tanenbaum. -- 4th. ed. -- Englewood Cliffs (New Jersey) :
Prentice Hall, 2003

Webs
http://en.wikipedia.org/wiki/RSA
http://www.matematicas.net/paraiso/cripto.php?id=rsa1
http://www.matematicas.net/paraiso/cripto.php?id=rsa2
http://www.matematicas.net/paraiso/cripto.php?id=rsa3
http://webs.ono.com/usr005/jsuarez/rsa1.html
http://www.htmlweb.net/seguridad/cripto/cripto_10.html
http://www.rsasecurity.com/rsalabs/node.asp?id=2146
http://es.tldp.org/Manuales-LuCAS/doc-unixsec/unixsec-html/node316.html

12

También podría gustarte