Rsa Es
Rsa Es
Rsa Es
org 50
Prctica
A
diferencia de la criptografa de clave pri-
vada, donde se utiliza una nica clave
para cifrar y descifrar mensajes, en la
criptografa de clave pblica se utilizan dos cla-
ves. Estas dos claves son conocidas como clave
pblica y clave privada. Para realizar una comu-
nicacin cifrada, un usuario debe disponer de un
par de claves. Mientras que la clave privada debe-
r permanecer secreta, la clave pblica, como su
nombre indica, estar a disposicin de cualquiera
que desee enviar mensajes cifrados al mencio-
nado usuario. Pues un mensaje cifrado con una
clave pblica, nicamente podr ser descifrado
con su correspondiente clave privada. Para con-
seguir esta curiosa cualidad, es necesario recurrir
a ciertos problemas matemticos que lo permiten.
En el caso de RSA, se recurre al problema de la
factorizacin de nmeros grandes.
El nacimiento de la criptografa de clave
pblica se produjo en 1976* con la publicacin
por parte de Diffe y Hellman de un protocolo
que permita intercambiar cierta informacin
sobre un canal inseguro.
Poco despus, en 1977, Rivest, Shamir y
Adleman proponan el criptosistema RSA, el
criptosistema de clave pblica ms usado en
la actualidad.
* En 1997 se hicieron pblicos ciertos do-
cumentos en los que se demostraba que en
1973, los criptgrafos del Grupo de Seguridad
de Comunicaciones Electrnicas (CESG) del
gobierno britnico, ya disponan de conoci-
mientos sobre este tipo de criptografa.
EI criptosistema RSA
Como ya se ha comentado, la seguridad de
RSA reside en la difcultad computacional
Ataque
de factorizacin a RSA
Daniel Lerch Hostalot
Grado de dicuItad
RSA es, sin Iugar a dudas, eI criptosistema de cIave pbIica
ms utiIizado en Ia actuaIidad, habiendo resistido aI escrutinio
de Ios criptoanaIistas durante ms de un cuarto de sigIo. Este
popuIar aIgoritmo basa su seguridad en Ia dicuItad que supone
factorizar nmeros grandes, considerando como grandes Ios
nmeros de ms de 100 dgitos decimaIes.
En este artcuIo aprenders...
cmo funciona RSA y cmo se realizan ataques
de factorizacin,
cmo se usan las claves RSA y el procedimien-
to de ataque para obtener la clave privada a
partir de la pblica, consiguiendo as, descifrar
el mensaje.
Lo que deberas saber...
cierta base matemtica,
conocimientos de programacin en C,
los ejemplos han sido desarrollados y proba-
dos en un sistema GNU/Linux.
Ataque de factorizacin a RSA
www.hakin9.org 51
que supone la factorizacin de
nmeros grandes. Factorizar un
nmero consiste en encontrar los
nmeros primos (factores) que
multiplicados dan como resultado
dicho nmero. De manera que si,
por ejemplo, queremos factorizar
el nmero 12, obtendremos como
resultado 223. La forma sencilla
de encontrar los factores de un
nmero n consiste en ir dividiendo
por todos los nmeros primos infe-
riores a n. Este procedimiento, aun-
que sencillo, es extremadamente
lento cuando se trata de factorizar
nmeros grandes.
Realicemos algunos clculos
sencillos para hacernos una idea.
Una clave de 256 bits (como la
que romperemos en un ejemplo
posterior) tiene unos 78 dgitos de-
cimales aproximadamente (1078).
Dado que en las claves RSA este
nmero suele tener nicamente dos
factores primos, cada uno de ellos
tendr ms o menos 39 dgitos.
Esto signifca que para factorizar
el nmero tendramos que dividir
por todos los nmeros primos de 39
dgitos o menos (1039). Suponiendo
que solo el 0.1% de los nmeros
son primos, tendramos que realizar
unas 1036 divisiones. maginemos
que disponemos de un sistema ca-
paz de realizar 1020 divisiones por
segundo. En este caso tardaramos
1016 segundos en romper la clave,
es decir, ms de 300 millones de
aos. Un milln de veces la edad
del universo. Por suerte, nosotros
tardaremos un poco menos.
Veamos como funciona RSA.
Empecemos generando la clave
pblica y la clave privada (en el
cuadro Conceptos Matemticos es-
tn disponibles algunos conceptos
matemticos de inters). Para este
propsito es necesario seguir los
siguientes pasos.
Paso 1:
Elegiremos aleatoriamente dos
nmeros primos p y q y los multipli-
caremos, obteniendo n: n p q . Si
elegimos, por ejemplo, p 3 y q 11
obtenemos n 33
Paso 2:
Calcularemos el indicador de Euler
(Totient) con la siguiente frmula:
d d n p q p q ( ) ( ) ( ) ( ) 1 1 . En nuestro
ejemplo obtenemos d n ( ) 20
Paso 3:
Buscaremos un exponente de cifra-
do (posteriormente lo utilizaremos
para cifrar) al que llamaremos e. El
exponente de cifrado debe cumplir
mcd e n , d( ) ( ) 1 por lo que nos servi-
ra, por ejemplo e 3, dado que no
dispone de ningn factor comn con
20 (factores 2 y 5).
Paso 4:
Calculamos un exponente de desci-
frado al que llamaremos d (posterior-
mente lo utilizaremos para descifrar).
El exponente de descifrado debe
verifcar 1< < ( ) d n d de manera que
e d n ( ) ( ) 1 modd . Lo que signifca que
d corresponder a un nmero entre
1 y 20 que al multiplicarlo por 3 y
dividirlo por 20 de resto 1. Por lo que
d puede ser 7.
Las cIaves:
La clave pblica del usuario corres-
ponde a la pareja (n, e), en nuestro
ejemplo (33,3) mientras que su clave
Conceptos Matemticos
Divisor o Factor:
Un nmero entero a es divisor (o factor) de b cuando existe otro entero c que cumple
b a c . Ejemplo: 21 7 3 .
Nmeros primos y Nmeros compuestos:
Un nmero entero es primo si solo es divisible por uno y por s mismo. Un nmero
entero es compuesto si no es primo.
Ejemplo: 21 7 3 es un nmero compuesto, 7 y 3 son nmeros primos
Factorizacin:
Se conoce como factorizacin de un nmero entero n el proceso de descompo-
nerlo en sus factores primos: n p p p
e e
i
e
i
1 2
1 2
, donde p
i
son nmeros primos i e
i
son enteros positivos.
Ejemplo: 84 queda factorizado como 21 2 3 7
2
MduIo:
Se conoce como mdulo y se representa como a b mod al resto de la divisin
entera de a entre. b .
Ejemplo: 5 3 2 mod , 10 7 3 mod , 983 3 2 mod , 1400 2 0 mod .
a y b son congruentes mdulo n: b a n ( ) mod si su diferencia (a-b) es un mltiplo
de n.
Mximo Comn Divisor:
Llamamos Mximo Comn Divisor de dos nmeros enteros a y b , representado
como mcd a b , ( ) , al mayor nmero entero divisor de a y de b .
Ejemplo:
mcd mcd 42 35 2 3 7 5 7 7 , , ( ) ( )
AIgoritmo de EucIides:
El algoritmo de Euclides calcula el Mximo Comn Divisor de dos nmeros basn-
dose en que mcd a b mcd b r , , ( ) ( ) , donde a b > > 0 son enteros y r resto de la divisin
entre a y b
Ejemplo: mcd 1470 42 , ( )
(1) 1470 42 35 1470 42 42 35 mod , , ( ) ( ) mcd mcd
(2) 42 35 7 42 35 35 7 mod , , ( ) ( ) mcd mcd
(3) 35 7 0 7 0 7 mod , ( ) mcd
Indicador de EuIer (Totient):
Dado n > 0 conocemos como d n ( ) el nmero de enteros en el intervalo 1, n [ ] que
son primos* con n . Para n p q , d n p q ( ) ( ) ( ) 1 1 .
* Dos nmeros enteros a y b
son primos entre s (o coprimos) si mcd a b , ( ) 1.
www.hakin9.org 52
Prctica
privada es d, es decir 7. Lgicamente
los nmeros p, q i d n ( ) debern per-
manecer en secreto.
EI (des)cifrado:
Llegados a este punto, solo es
necesario cifrar con C M n
e
mod
y descifrar con M C n
d
mod . Si
consideramos que nuestro men-
saje es M 5 el cifrado corres-
pondera a C 5 33 26
3
mod . Para
descifrar solo tendramos que aplicar
M 26 33 5
7
mod .
Como se comentaba al principio
y puede verse en el procedimiento
anterior, la seguridad del criptosis-
tema reside en n. Es decir, si un
atacante con acceso a la clave pbli-
ca, consigue factorizar n obteniendo
p y q, no tiene ms que utilizar las
frmulas anteriores para obtener la
clave privada.
The RSA Factoring
ChaIIenge
The RSA Factoring Challenge es
una competicin fnanciada por RSA
Laboratories en la que se ofrecen
suculentos premios al que consiga
factorizar ciertos nmeros grandes.
sto les permite conocer el estado
del arte de los sistemas de facto-
rizacin, conociendo as cul es el
tamao de clave adecuado para
mantener RSA seguro.
En el momento de escribir este
artculo el rcord de factorizacin
es el RSA-640, un nmero de 193
dgitos que fue factorizado el 2 de
noviembre del 2005 por F. Bahr et
al. El prximo reto es el RSA-704,
premiado con 30.000$.
Sin duda, The RSA Factoring
Challenge, es una muy buena forma
de conocer el estado actual de los
sistemas de factorizacin.
En el cuadro The RSA Factoring
Challenge puedes ver los desafos
propuestos actualmente.
Ataque de factorizacin
En los siguientes apartados se rea-
lizar un ataque de ejemplo a una
clave RSA. Para agilizar los clculos
se utilizar una clave bastante ms
pequea de lo normal, facilitando
as su factorizacin. Aunque no se
trata de un ejemplo real, nos servir
para ver cmo se realiza un ataque
completo.
Primero prepararemos un en-
torno de trabajo con la herramienta
OpenSSL, generando las claves ne-
cesarias y cifrando un mensaje que
utilizaremos como objetivo de ata-
que. A continuacin factorizaremos
el mdulo n y obtendremos la clave
privada, descifrando fnalmente el
mensaje.
OpenSSL y RSA
OpenSSL es una herramienta crip-
togrfca muy til de fuente abier-
ta. En la seccin de referencias
encontrars dnde descargarla,
aunque la mayora de dsitribucio-
nes GNU/Linux la llevan instalada
por defecto.
En esta seccin la utilizaremos
para confgurar un entorno de prue-
bas sobre el cual realizaremos el
ataque.
El primer paso consiste en ge-
nerar un par de claves para cifrar y
descifrar. Generaremos claves de
256 bits, demasiado pequeas para
mantener sus comunicaciones se-
guras, pero sufcientes para nuestro
ejercicio.
Generamos el par de claves,
manteniendo en secreto nuestra
clave privada.
# Generar un par de claves RSA
de 256 bits
openssl genrsa -out rsa_privkey
.pem 256
cat rsa_privkey.pem
-----BEGIN RSA PRIVATE KEY-----
MIGqAgEAAiEA26dbqzGRt31
qincXxy4jjZMMOId/DVT8aT
cq8aamDiMCAwEAAQIh
AMvT1oXa/rxF3mrVLrR/RS7vK
1WTsQ5CWl/+37wztZOpAhE
A+4jgEkfalFH+0S+1
IPKD5wIRAN+NmMH4AF0B8jz
MAXHHXGUCEGRpRZnGmVk
wSlrTgqj+Zu0CEA7v7CQR
yRxt09zCGNqcYo0CEDEW7mvoz
MYYLC5o+zgfV4U=
-----END RSA PRIVATE KEY-----
A continuacin guardamos la clave
pblica en un fchero. sta es la que
publicaramos para que cualquiera
pudiese enviarnos mensajes cifra-
dos.
# Guarda la clave publica en
un hchero
openssl rsa -in rsa_privkey.pem
-pubout -out rsa_pubkey.pem
cat rsa_pubkey.pem
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQA
DKwAwKAIhANunW6sxkbd9a
op3F8cuI42TDDiHfw1U
/Gk3KvGmpg4jAgMBAAE=
-----END PUBLIC KEY-----
Generado el par de claves, ya pode-
mos cifrar y descifrar. Trabajaremos
con el siguiente mensaje en claro:
echo "Cuarenta y dos" > plain.txt
Este mensaje puede ser cifrado de
forma sencilla con el siguiente co-
mando y la clave pblica:
openssl rsautl -encrypt -pubin
-inkey rsa_pubkey.pem \
-in plain.txt -out cipher.txt
Para descifrar utilizaremos la clave
privada:
openssl rsautl -decrypt -inkey
rsa_privkey.pem -in cipher.txt
Cuarenta y dos
Listado 1. Pasar de
Hexadecimal a Decimal
#include <stdio.h>
#include <openssl/bn.h>
int main (int argc, char **argv)
{
BIGNUM *n = BN_new();
if (argc!=2)
{
printf ("%s <hex>\n",
argv[0]);
return 0;
}
if(!BN_hex2bn(&n, argv[1]))
{
printf("error:
BN_hex2bn()");
return 0;
}
printf("%s\n", BN_bn2dec(n));
BN_free(n);
}
www.hakin9.org 54
Prctica
Visto como utilizar OpenSSL con
RSA y conociendo la necesidad de
disponer de la clave privada para
descifrar los mensajes, nuestro
objetivo a continuacin ser obte-
ner dicha clave privada sin tener
acceso a la original. Es decir, ob-
tener la clave privada a partir de
la clave pblica. Para poder hacer
esto lo primero que necesitamos es
obtener el mdulo n y el exponente
de cifrado. Esto nos lo proporciona
el siguiente comando y la clave
pblica:
openssl rsa -in rsa_pubkey.pem
-pubin -text -modulus
Modulus (256 bit):
00:db:a7:5b:ab:31:91:b7:7d:
6a:8a:77:17:c7:2e:
23:8d:93:0c:38:87:7f:0d:54:fc:
69:37:2a:f1:a6:
a6:0e:23
Exponent: 65537 (0x10001)
Modulus=DBA75BAB3191B77D6
A8A7717C72E238D930C3887
7F0D54FC69372AF1A6A60E23
writing RSA key
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQAD
KwAwKAIhANunW6sxkbd9aop
3F8cuI42TDDiHfw1U
/Gk3KvGmpg4jAgMBAAE=
-----END PUBLIC KEY-----
El mdulo est representado en
hexadecimal. Para pasarlo a decimal
puedes utilizar el programa listado
en el Listado 1.
gcc hex2dec.c -lssl
./a.out DBA75BAB3191B77D6A8
A7717C72E238D930C38877
F0D54FC69372AF1A6A60E23
993522099738420139497368501
701857699982671190890633
39396575567287426977500707
Obtenido el mdulo en decimal, el
siguiente paso consiste en factori-
zarlo.
Factorizacin deI
mduIo n
Dado que el nmero que vamos
a factorizar no es excesivamente
grande, resulta ms rpido aplicar
Listado 2. Clave privada
#include <stdio.h>
#include <openssl/bn.h>
#include <openssl/rsa.h>
#include <openssl/engine.h>
#include <openssl/pem.h>
int main (int argc, char **argv)
{
RSA *keypair = RSA_new();
BN_CTX *ctx = BN_CTX_new();
BN_CTX_start(ctx);
BIGNUM *n = BN_new();
BIGNUM *d = BN_new();
BIGNUM *e = BN_new();
BIGNUM *p = BN_new();
BIGNUM *q = BN_new();
BIGNUM *dmp1 = BN_new();
BIGNUM *dmq1 = BN_new();
BIGNUM *iqmp = BN_new();
BIGNUM *r0 = BN_CTX_get(ctx);
BIGNUM *r1 = BN_CTX_get(ctx);
BIGNUM *r2 = BN_CTX_get(ctx);
BIGNUM *r3 = BN_CTX_get(ctx);
if (argc!=4)
{
printf ("%s [p] [q] [exp]\n", argv[0]);
return 0;
}
BN_dec2bn(&p, argv[1]);
BN_dec2bn(&q, argv[2]);
BN_dec2bn(&e, argv[3]);
if(BN_cmp(p, q)<0) {
BIGNUM *tmp = p;
p = q;
q = tmp;
}
// Calculamos n
BN_mul(n, p, q, ctx);
// Calculamos d
BN_sub(r1, p, BN_value_one()); // p-1
BN_sub(r2, q, BN_value_one()); // q-1/
BN_mul(r0, r1, r2, ctx); // (p-1)(q-1)
BN_mod_inverse(d, e, r0, ctx); // d
// Calculamos d mod (p-1)
BN_mod(dmp1, d, r1, ctx);
// Calculamos d mod (q-1)
BN_mod(dmq1, d, r2, ctx);
// Calculamos el inverso de q mod p
BN_mod_inverse(iqmp, q, p, ctx);
// Claves RSA
keypair->n = n;
keypair->d = d;
keypair->e = e;
keypair->p = p;
keypair->q = q;
keypair->dmq1 = dmq1;
keypair->dmp1 = dmp1;
keypair->iqmp = iqmp;
PEM_write_RSAPrivateKey(stdout, keypair,
NULL, NULL, 0, NULL, NULL);
BN_CTX_end(ctx);
BN_CTX_free(ctx);
RSA_free(keypair);
return 0;
}
Ataque de factorizacin a RSA
www.hakin9.org 55
el algoritmo de factorizacin QS.
Este algoritmo lo implementa msie-
ve, programa que puedes descargar
a partir de la tabla de referencias.
msieve lleva la documentacin ne-
cesaria para instalarlo y utilizarlo,
aunque no resulta nada compli-
cado. Pues basta con el siguiente
comando para factorizar el nmero
propuesto:
/msieve -v
99352209973842013949736850
17018576999826711908906
33393965755672874269775
00707
Un ordenador actual puede factorizar
este nmero en unos diez minutos,
ms o menos en funcin del hard-
ware. El resultado es el siguiente:
factor: 297153055211137492311
771648517932014693
factor: 334346924022870445836
047493827484877799
En este punto, factorizado el mdulo
n y con el exponenete de cifrado
65537 obtenido en el apartado an-
terior, ya tenemos todos los datos
necesarios para obtener la clave
privada.
Obtencin de Ia cIave
privada y descifrado deI
mensaje
Dada la difcultad del proceso uti-
lizando herramientas comunes,
desarrollaremos un programa que lo
haga por nosotros. Encontrars las
fuentes en Listado 2.
Para realizar los clculos se ha
utilizado la librera OpenSSL. Las
variables BGNUM son las utilizadas
por esta librera para trabajar con
nmeros grandes. stas tienen una
AP propia para realizar operaciones
como sumas, restas, operaciones
modulares, etc.
El programa de ejemplo em-
pieza colocando en variables
BGNUM los parmetros p, q y e. A
continuacin, si se observa el cdi-
go con detenimiento y con la ayuda
de los comentarios, puede verse el
procedimiento de generacin de la
clave privada. El mismo procedi-
miento indicado anteriormente de
forma terica. De hecho, la nica
diferencia con la generacin de
una clave normal consiste en que
p y q se elegiran aleatoriamente,
y en nuestro caso los obtenemos
de la factorizacin del mdulo.
Finalmente, mediante la ayuda de
PEM _ write _ RSAPrivateKey() escri-
bimos la clave privada en formato
PEM, el utilizado en los ejemplos.
Si comparamos la clave generada
con la clave privada original vere-
mos que hemos conseguido nues-
tro objetivo, pues se ha llegado a
la clave privada a partir de la clave
pblica (Listado 3.).
Listado 3. Llegar a la clave privada a partir de la clave pblica
gcc get_priv_key.c -lssl -o get_priv_key
./get_priv_key 297153055211137492311771648517932014693 \
334346924022870445836047493827484877799 65537
-----BEGIN RSA PRIVATE KEY-----
MIGqAgEAAiEA26dbqzGRt31qincXxy4jjZMMOId/DVT8aTcq8aamDiMCAwEAAQIh
AMvT1oXa/rxF3mrVLrR/RS7vK1WTsQ5CWl/+37wztZOpAhEA+4jgEkfalFH+0S+1
IPKD5wIRAN+NmMH4AF0B8jzMAXHHXGUCEGRpRZnGmVkwSlrTgqj+Zu0CEA7v7CQR
yRxt09zCGNqcYo0CEDEW7mvozMYYLC5o+zgfV4U=
-----END RSA PRIVATE KEY-----
Listado 4. dfact_client
...
for(;;)
{
get_random_seeds(&seed1, &seed2);
switch(status)
{
case DF_CLIENT_STATUS_WAITING:
N = recv_N_number(&rel_by_host, host);
if(!N)
sleep(DF_TIME_TO_RECV);
else
status = DF_CLIENT_STATUS_RUNNING;
break;
case DF_CLIENT_STATUS_RUNNING:
{
msieve_obj *obj = NULL;
obj = msieve_obj_new(N, Hags, relations, NULL,
NULL, seed1, seed2, rel_by_host, 0, 0);
if (obj == NULL)
{
syslog(LOG_ERR, "Factoring initialization failed");
free(N);
return 0;
}
msieve_run(obj);
if(obj) msieve_obj_free(obj);
while(!send_relations(N, host, relations))
sleep(DF_TIME_TO_SEND);
if(unlink(relations)==-1)
syslog(LOG_ERR, "unlink(): %s: %s", relations,
strerror(errno));
status = DF_CLIENT_STATUS_WAITING;
free(N);
}
break;
default:
break;
}
...
www.hakin9.org 56
Prctica
Si guardamos la nueva clave pri-
vada en un fchero de texto, por ejem-
plo en rsa_hacked_privkey.pem, ya
podemos descifrar el mensaje como
sigue:
openssl rsautl -decrypt -inkey
rsa_hacked_privkey.pem -in
cipher.txt
Cuarenta y dos
AIgoritmos modernos
de factorizacin
Los algoritmos de factorizacin han
ido mejorando con el tiempo hasta
llegar a un punto en la actualidad,
en que disponemos de algoritmos
tan rpidos como el mtodo de
curva elptica (ECM), el Quadra-
tic Sieve (QS) o el Number Field
Sieve(NFS). De estos algoritmos
tambin existen diversas variacio-
nes en funcin del tipo de nmero a
factorizar o de la forma de resolver
algunas partes del mismo. Dichos
algoritmos son bastante complejos
y suelen dividirse en varias etapas
en las que se van realizando dife-
rentes clculos que servirn fnal-
mente para factorizar el nmero.
QS y NFS destacan por disponer de
una fase de criba (sieve) en la que
se recopilan una serie de relaciones
que fnalmente se utilizarn para
construir un sistema de ecuaciones
y obtener el resultado. La fase de
criba es posible realizarla en para-
lelo con diferentes mquinas y suele
ser la ms larga.
En los ejemplos anteriores
hemos usado el programa msieve
que es una implementacin del
Multiple Polinomial Quadratic Sieve
(MPQS), una variante del QS. El al-
goritmo QS es el ms rpido cuan-
do se trata de factorizar nmeros de
menos de 110 dgitos. Pero cuando
sobrepasamos este lmite, NFS to-
ma el relevo.
Una variante del NFS utilizada
para factorizar cualquier tipo de
nmero es el GNFS o General
Number Field Sieve. No hay mu-
cho software libre que implemente
GNFS, y el poco que existe, no
destaca ni por su buena documen-
tacin ni por su facilidad de uso. Al
menos, en el momento de escribir
este artculo. En cualquier caso,
vamos a ver como funciona ggn-
fs, una implementacin de GNFS,
que aunque no es del todo estable,
permite factorizar sin demasiados
problemas.
ggnfs est compuesto por un
conjunto de herramientas, que uti-
lizadas una a una, permiten cubrir
todas las etapas en las que se divi-
de este algoritmo. Para un novato,
factorizar un nmero mediante este
procedimiento puede resultar real-
mente complicado, por lo que ggnfs
ofrece un script en perl que hace
todo el trabajo.
Este script permite utilizar el
programa sin quebraderos de ca-
beza, pero desde luego no es la
mejor forma de sacarle partido a
Listado 5. dfact_server
...
for(;;)
{
while(child_count >= DF_MAX_CLIENTS) sleep(1);
sd_tmp = socket_server_accept(sd, client, sizeof(client));
if((pid=fork())==0)
{
close(sd);
process_client(sd_tmp, N, num_relations, rel_by_host, client);
}
else if (pid>0)
{
close(sd_tmp);
child_count++;
}
else
{
perror("fork()");
}
close(sd_tmp);
}
close(sd);
...
Listado 6. dfact_server (process_relations)
void process_relations(char *N, int num_relations, int seconds)
{
for(;;)
{
int n_sieves = get_num_relations_in_hle(DF_FILE_RELATIONS);
printf ("relations: %d, need: %d \n", n_sieves, num_relations);
// Has enought relations?
if(n_sieves>=num_relations)
{
printf("Factoring %s\n", N);
kill(0, SIGUSR1);
uint32 seed1;
uint32 seed2;
uint32 Hags;
Hags |= MSIEVE_FLAG_USE_LOGFILE;
get_random_seeds(&seed1, &seed2);
factor_integer(N,Hags,DF_FILE_RELATIONS,NULL,&seed1,&seed2);
printf("Factoring Done\n");
kill(getppid(), SIGKILL);
exit(0);
}
sleep(seconds);
}
}
www.hakin9.org 58
Prctica
las herramientas que constituyen
ggnfs.
La forma ms sencilla de probar
este programa consisten en editar
un archivo, al que podemos llamar
test.n indicando el nmero que que-
remos factorizar:
cat test.n
n: 1522605027922533360535
618378132637429718068
114961380688657908494
580122963258952897654
000350692006139
A continuacin ejecutamos:
tests/factLat.pl test.n
Esto factorizar el nmero. Eso s, en
unas cuantas horas. Ms o menos,
en funcin del hardware empleado.
Para sacarle ms partido a ggnfs
es necesario prescindir del script
factLat.pl y utilizar las herramientas
que proporciona con los parmetros
correctos. Dado que la utilizacin
de ggnfs da para un artculo entero,
no lo explicar aqu. Lo mejor para
aprender a utilizarlo es leer la do-
cumentacin proporcionada con el
cdigo fuente y acceder al foro de
discusin (ver enlaces).
Tambin es conveniente leer
algunos documentos sobre el algo-
ritmo NFS, aunque hay que tener
en cuenta que se requieren cono-
cimientos avanzados de teora de
nmeros y lgebra lineal.
La necesidad deI
ataque distribuido
La clave factorizada en el ejemplo
es muy pequea si la comparamos
con la longitud de una clave de las
que se suelen usar actualmente.
Si ahora mismo quisiramos crear
una clave RSA para nuestro uso
personal, optaramos por un mnimo
de 1024 bits. Siendo cautelosos
escogeramos una de 2048 o 4096
bits. Si intentamos factorizar una
de estas claves con nuestro PC
de casa, por muy rpido que sea,
veremos como se queda realizan-
do clculos indefnidamente, sin
llegar a ninguna parte. Lo cierto
es que no podremos con una cla-
ve de estas caractersticas. Sin
embargo, los continuos avances
tanto en computacin como en el
campo matemtico, hacen que esta
distancia se vaya reduciendo, y en
determinadas condiciones sea po-
sible realizar ataques distribuidos,
es decir, utilizando miles de mqui-
nas paralelamente en el proceso
de factorizacin. Existen diversos
estudios realizados por expertos
en este campo, que analizan las
posibilidades de atacar una clave
de 1024 bits (ver tabla de enlaces).
De momento, esto est fuera del
alcance de la mayora, aunque pro-
bablemente, no fuera del alcance de
ciertos gobiernos u organizaciones.
Por otra parte, la existencia de
retos como el RSA Factoring Cha-
llenge, comentado anteriormente,
motivan todava ms los estudios
en este campo, as como el desa-
rrollo de herramientas distribuidas
para la factorizacin de nmeros
grandes.
Ataque distribuido
En ejemplos anteriores hemos
conocido el software msieve. Co-
mo hemos visto es de utilizacin
sencilla y el programa est lo su-
fcientemente maduro como para
no dar demasiados problemas al
usuario. Por lo que he visto hasta
el momento, sta es sin duda la
mejor implementacin abierta del
algoritmo Quadratic Sieve. Sin em-
bargo, el programa que se distri-
buye no es ms que una demo del
uso bsico de la librera msieve. Y
solo sirve para ser utilizada en una
nica mquina.
En la documentacin del pro-
grama se muestran un par de
recetas para utilizar el programa
de demostracin con diferentes
mquinas y as poder hacer una
factorizacin distribuida. Pero se
trata de un procedimiento manual
y poco prctico. Por este motivo he
decidido implementar un pequeo
programa de ejemplo que presenta
el uso de la librera msieve para
realizar factorizacin distribuida.
He llamado a este programa dfact
y puedes encontrarlo en el CD que
acompaa la revista o en la seccin
de enlaces.
El programa se puede compilar
con un make y solo requiere que la
librera msive est correctamente
instalada. La ruta de la misma de-
ber incluirse en el Makefle. Una
vez compilado podemos encontrar
dos binarios en la carpeta bin/ co-
rrespondientes al servidor y el clien-
te. El servidor (dfs) se ejecutar en
una mquina con bastante memoria
(necesitar ms cuanto ms grande
sea el nmero) y ser el encargado
de repartir trabajo y coordinar a to-
dos los clientes. El servidor recibe
cuatro parmetros: el nmero a
factorizar, el nmero de relaciones
que queremos que recopile el clien-
te para cada envo y el nmero de
segundos cada cuando queremos
que el servidor compruebe si tiene
los sufcientes datos de los clientes
para terminar la factorizacin con
xito. En el ejemplo siguiente se
pide a los clientes que enven las
relaciones de 5000 en 5000, y al
servidor que verifque el nmero de
relaciones de que dispone cada 60
segundos.
bin/dfs 9935220997384201394
9736850170185769998267
1190890633393965755672
87426977500707 5000 60
En unos cuantos clientes ejecu-
taremos dmc, pasndole como
parmetro la P del servidor y la
ruta de un fchero temporal donde
puede recopilar las relaciones. Por
ejemplo:
bin/dfc /tmp/rel 192.168.1.7
El programa dfact se ha desarrollado
tomando como base la librera msie-
ve. sta ofrece un programa de ejem-
plo llamado demo.c que muestra su
uso de manera sencilla. Si se observa
el cdigo se puede ver que no resulta
complicado de seguir. En el Listado
5. puede verse un pedazo de cdigo
del cliente dfact. En l se muestra el
funcionamiento del blucle principal en
el que el cliente recibe el nmero a
Ataque de factorizacin a RSA
www.hakin9.org 59
factorizar del servidor, calcula las re-
laciones solicitadas mediante msieve,
y se las enva al servidor para que las
procese (Listado 4.).
Veamos como maneja la situa-
cin el servidor (Listado 5.). Cada
cliente que solicita enviar la lista de
relaciones al servidor es gestionado
por process_client() mediante un
proceso separado.
Otro proceso separado se ocupa
de procesar las relaciones que los
clientes van enviando cada cierto
tiempo (Listado 6.).
El programa de ejemplo nos per-
mite factorizar un nmero utilizando
varias decenas de mquinas y,
aunque podra utilizarse en nternet,
la ausencia de autentifcacin y/o
cifrado, entre otros, lo hacen poco
recomendable. Algunas mejoras que
podran ser de inters, y que sin du-
da representarn un buen ejercicio
para el lector, son el uso de SSL,
mejoras en la seguridad, mejoras en
el rendimiento, etc.
Anteriormente hemos comen-
tado que GNFS es ms efciente
que MPQS en la factorizacin de
nmeros de ms de 110 dgitos.
En estos momentos, no parece que
exista ningn software libre que
permita implementar fcilmente un
sistema distribuido de factorizacin
con GNFS, al igual que hemos he-
cho con msieve (QS). Sin embargo,
el autor de msieve lo est dotando
de soporte para GNFS, y aunque
ste se encuentra todava a me-
dias, quizs en no mucho tiempo
lo tengamos disponible. Si eso
sucediese, no sera muy difcil mo-
difcar nuestro ejemplo (dfact) para
realizar factorizacin distribuida
con GNFS.
En cualquier caso ggnfs dis-
pone de la posibilidad de utilizar
varias mquinas para realizar una
factorizacin. Esto puede hacerse
con el script factLat.pl, visto ante-
riormente, aunque es una versin
muy inestable y solo permite utili-
zar unas pocas mquinas en una
LAN.
Para naIizar
Para finalizar, quiero mencionar la
repercusin que pueden tener los
avances matemticos que se rea-
lizan en este campo. Un nmero
que hoy es computacionalmente
imposible de factorizar, maana
podra ser factorizable en pocos
minutos. Todo depende de que a
alguien se le ocurra una forma re-
volucionaria de atacar el problema.
Sin embargo los ms de 20 aos
que lleva en funcionamiento el al-
goritmo RSA avalan la seguridad
del mismo, y hacen poco probable
este hecho.
Por otra parte, la quizs inmi-
nente llegada de la computacin
cuntica s resulta una amenaza
seria a la seguridad de este cono-
cido criptosistema. sto es debido
a la existencia del algoritmo de
Shor (ver seccin de enlaces),
que muestra una forma de atacar
el problema con complejidad po-
linmica. Es decir, que permitira
factorizar una clave en un tiempo
razonable.
Referencias
Factorizacin de nmeros enteros grandes - http://factorizacion.blogspot.com
DFACT http://daniellerch.com/sources/projects/dfact/dfact-hakin9.tar.gz
GGNFS - A Number Field Sieve implementation: http://www.math.ttu.edu/
~cmonico/software/ggnfs/
Yahoo! Group for GGNFS - http://www.groups.yahoo.com/group/ggnfs
MSEVE - nteger Factorization - http://www.boo.net/~jasonp/qs.html
The RSA Factoring Challenge - http://www.rsasecurity.com/rsalabs/
node.asp?id=2092
OpenSSL - http://www.openssl.org
Algoritmo de Shor - http://es.wikipedia.org/wiki/Algoritmo_de_Shor
On the cost of factoring RSA 1024 -
http://www.wisdom.weizmann.ac.il/%7Etromer/papers/cbtwirl.pdf
Factoring estimates for a 1024 bit RSA modulus -
http://www.wisdom.weizmann.ac.il/%7Etromer/papers/factorest.pdf
Sobre eI autor:
Daniel Lerch Hostalot
ngeniero de Software C/C++ en plataformas GNU/Linux,
Master: Cisco Networking Academy Program: CCNA, wireless & Network Security,
ngeniero Tcnico en nformtica de Sistemas por Universitat Oberta de Catalunya
UOC, actualmente trabaja en sector de telecomunicaciones.
Conoce los siguientes lenguajes de programacin: C/C++, ShellScript, Java, Perl,
PHP (prog mdulos en C).
e-mail: dlerch@gmail.com, url: http://daniellerch.com
The RSA Factoring ChaIIenge
RSA-704 (30.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#RSA704
RSA-768 (50.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#
RSA768
RSA-896 (75.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#RSA
896
RSA-1024 (100.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#
RSA1024
RSA-1536 (150.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#
RSA1536
RSA-2048 (200.000$): http://www.rsasecurity.com/rsalabs/node.asp?id=2093#
RSA2048