Вы находитесь на странице: 1из 13

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/259475323

Criptografía de curva Elíptica, Ataque Rho de Pollard

Article · June 2007

CITATIONS READS

0 404

1 author:

Daniel Lerch-Hostalot
Universitat Oberta de Catalunya
18 PUBLICATIONS   37 CITATIONS   

SEE PROFILE

All content following this page was uploaded by Daniel Lerch-Hostalot on 29 December 2013.

The user has requested enhancement of the downloaded file.


Criptografía de Curva
Elíptica: Ataque de Rho
Ataque
de Pollard
Daniel Lerch

Grado de dificultad

En este artículo se pretende dar a conocer la teoría en la que


se basa la criptografía de curva elíptica de forma sencilla e
intentando que sean necesarios los mínimos conocimientos de
matemáticas posibles.

S
in embargo, la teoría asociada a las Criptografía de clave pública
curvas elípticas es extensa y compleja, La criptografía de clave pública permite a dos
por lo que en la sección de referencias usuarios mantener una conversación privada
se presentan algunos recursos adecuados sin tener que acordar inicialmente una clave
para que el lector pueda ampliar sus conoci- común (por otros medios) como ocurre con
mientos. la criptografía simétrica (o de clave secreta).
Por otra parte, las bases aquí expuestas Así, un usuario generará un par de claves (una
deberían ser suficientes para comprender el pública y una privada) y distribuirá la clave
artículo. pública entre todos los usuarios susceptibles
En los apartados prácticos se usa GNU/ de enviarle un mensaje. Cualquier mensaje
Linux y C++. Por lo que es necesario disponer que se cifre con la clave pública sólo podrá
de conocimientos de ambos para seguir el artí-
culo sin problemas.
El artículo empieza presentando las curvas En este artículo aprenderás...
elípticas y las operaciones básicas que se
pueden realizar sobre ellas: las suma y la mul- • Las bases de la criptografía de Curva Elíptica,
tiplicación, así como una técnica utilizada para • Qué es el problema del logaritmo discreto en
contar los puntos que hay en una curva. Estas Curvas Elípticas,
• Algoritmos aplicados a las curvas elípticas,
son las bases para comprender el problema del
• El Ataque Rho de Pollard.
logaritmo discreto en curvas elípticas (ECDLP)
que se presenta posteriormente y es la base
de la criptografía de curva elíptica. A conti-
Lo que deberías saber...
nuación, conociendo las bases necesarias, se
implementan algunos algoritmos en C++ y se • Matemáticas nivel medio,
inicia el desarrollo del ataque Rho de Pollard, • C++ nivel medio,
actualmente considerado el más rápido contra • Criptografía básica.
los criptosistemas de curva elíptica.

2 www.hakin9.org
Criptografía de Curva Elíptica

ser descifrado con la clave privada. tacan RSA [3] y el intercambio de


Como sólo el usuario inicial dispone claves de Diffie-Hellman. El primero
Tiempo exponencial >> Tiempo
de la clave privada nadie más podrá está basado en el problema de fac-
subexponencial >> Tiempo
leer sus mensajes. La misma opera- torización, mientras que el segundo
polinómico
ción se utiliza a la inversa para firmar está basado en el problema del loga-
mensajes. Es decir, un mensaje fir- ritmo discreto.
mado con la clave privada se podrá Ambos problemas han sido exten-
verificar con la clave pública. De esta samente estudiados debido a su im- Aquí es donde entran en juego las
manera sólo el usuario original podrá portancia en criptografía. Actualmente curvas elípticas. Pues nos permiten
firmar mensajes, mientras que cual- para ambos casos existen algoritmos definir un problema matemático si-
quiera podrá verificarlos. de tiempo subexponencial que permi- milar al del logaritmo discreto, al que
Normalmente los sistemas de ten resolverlos. En el caso del proble- llamaremos problema del logaritmo
cifrado de clave pública son más len- ma de factorización, el algoritmo más discreto en curvas elípticas (EC-
tos que los de de clave privada, por rápido hasta la fecha es el Number DLP). Actualmente el algoritmo más
lo que los primeros suelen usarse Field Sieve [3]. En el caso del logarit- rápido que se conoce para resolver
como sistema de intercambio de cla- mo discreto es el Index Calculus [20]. este problema es de tiempo
ves. Posteriormente un cifrado simé- Esto no es suficiente para rom- exponencial, lo que nos permite
trico será el encargado de mantener per completamente el cifrado, pero construir un criptosistema igual de
el resto de la comunicación segura. obliga a utilizar claves muy grandes seguro que RSA (por Listado) con
La criptografía de clave pública se lo que en algunos casos puede ser tamaños de clave inferiores. De
caracteriza por el uso de problemas problemático. Si se encontrase un hecho se estima que una clave RSA
matemáticos computacionalmente algoritmo de tiempo polinómico para de 4096 bits da el mismo nivel de
difíciles, de manera que romper el resolver estos problemas, el cripto- seguridad que una clave de 313 bits
cifrado suele ser el equivalente a re- sistema asociado a ellos quedaría de un sistema de curva elíptica. Esta
solver estos problemas. A lo largo de fuera de combate. Por otra parte, si diferencia resulta realmente notable
la historia de la criptografía de clave se encuentra un problema matemá- cuando se trabaja con dispositivos
pública, los dos problemas matemá- tico que sólo se pueda resolver en móviles, dado que una operación
ticos más usados son el problema tiempo exponencial, podríamos decir como generar una clave, que tarda-
de la factorización y el problema del que el criptosistema sería igual de ría unos pocos segundos mediante
logaritmo discreto. De los algoritmos seguro que los anteriores con tama- un sistema de curva elíptica, podría
más conocidos de clave pública des- ños de clave inferiores. demorarse varios minutos utilizando
un sistema como RSA.

Curvas elípticas
Cuando hablamos de criptografía,
una curva elíptica se define como
2 2
una ecuación y 2 = x3 + Ax + B , donde
A y B son constantes y cumplen
4 A3 + 27 B 2 ≠ 0 . Esta ecuación es
1 1 conocida como ecuación de Weiers-
trass. En la Figura 1 se muestran dos
Listados de la forma que puede to-
mar la gráfica de una curva elíptica.
Se puede observar que la forma
-1 -0,5 0,5 1 1,5 1,5 -1 -0,5 0,5 1 1,5
que toma la Figura 1.a es ligeramen-
te diferente de la 1.b . Esta diferencia
-1 -1
dependerá de los valores que tomen
A y B en la ecuación de Weierstrass,
pues para cada uno de ellos existe
una curva diferente.
-2 -2 Por razones técnicas, a parte de
los puntos que pertenecen a la curva
se considera un punto en el infinito.
Este punto, el (∞,∞) suele denotarse
simplemente como ∞ o 0 . Como ve-
remos más adelante nos resultará
Figura 1. Forma básica realmente útil.

www.hakin9.org 3
Ataque

Suma de puntos Multiplicación otra parte, el número k más pequeño


Para empezar nuestra introducción En el apartado anterior hemos apren- (pero mayor que 0) que multiplicado
al fascinante mundo de las curvas dido a sumar puntos en una curva por un punto P da 0 (infinito), se cono-
elípticas veamos como se suman elíptica. Estas operaciones nos dan ce como orden de ese punto. ¡No
dos puntos situados en una curva. la base que nos permitirá realizar confundir el orden de la curva con el
Lo haremos de forma gráfica, pues operaciones de multiplicación por orden del punto!
nos permite comprender rápida- un escalar. Es decir un número k por Un resultado básico que nace del
mente este concepto. Supongamos un punto P. Esto es más sencillo de enunciado anterior es el siguiente: el
que tenemos dos puntos P y Q en lo que puede parecer. Supongamos orden de un punto P en una curva,
una curva. Observe la Figura 2. Si que queremos calcular kP donde divide al orden de la curva.
trazamos una linea entre estos dos k=27. Podemos realizar un doblado Estos conceptos son de vital
puntos veremos que corta a la cur- de puntos de la forma siguiente: importancia en la teoría asociada a
va en un tercer punto. Si reflejamos las curvas elípticas y los usaremos
este punto a través del eje (cam- en el Ataque Rho de Pollard que se
biamos el signo de su coordenada explica más adelante.
y), obtendremos un punto R. Dicho En este apartado vamos a ver co-
punto R corresponde a la suma de mo se puede calcular el orden de una
P y Q. obteniendo el punto resultante de curva. Para tal propósito utilizaremos
multiplicar P por un escalar k. Este el algoritmo SEA (Schoof-Elkies-Atkin)
P+Q=R procedimiento permite calcular kP que es de tiempo polinómico. Su im-
para valores de k de varios cientos plementación y teoría asociada queda
Esto se conoce como ley del grupo. de dígitos muy rápidamente. El único fuera del alcance de este artículo, pero
Pero no es necesario disponer de problema consiste en el gran tama- el lector puede consultar [5], [6] y [14]
dos puntos para encontrar un ter- ño que adquieren las coordenadas para obtener más detalles.
cero. Pues a partir de un solo punto de los puntos que se van calculando. No es fácil encontrar una imple-
podemos obtener otro. Imaginemos Pero esto no ocurre al trabajar en mentación libre de este algoritmo.
que en el caso anterior P=Q. Enton- campos finitos como suele hacerse Por suerte existe el paquete ELLSEA
ces la linea en lugar de cortar la cur- en criptografía de curva elíptica. [15] implementado por Christophe
va por los puntos P y Q solo lo haría Consulte la Tabla Campos Finitos Doche y Sylvain Duquesne. ELLSEA
por un punto. Es decir, sería una tan- para saber algo más sobre ellos. está desarrollado como script para
gente. En la Figura 3 se ilustra este PARI/GP [16], un sistema de álgebra
caso y algunos más, donde puede Contando puntos en computacional GPL muy utilizado.
verse claramente como funciona curvas elípticas: el Veamos un Listado. Lo primero es
este concepto. algoritmo SEA instalar PARI/GP, para ello lo mejor
En la Figura 3.a se ilustra el Una curva definida sobre un campo es seguir las instrucciones de la
caso con el que hemos empezado. finito tiene un número finito de pun- página del proyecto o usar las herra-
P+Q=-R (anteriormente hemos tos en ella. A este número de puntos mientas de la distribucion GNU/Linux
cambiado el signo de R reflejando lo llamamos orden de la curva. Por utilizada (apt-get, yum, emerge, etc).
el punto a través del eje). En la
Figura 3.b se ilustra el caso co-
mentado anteriormente en el que
se parte de un único punto P. En
este caso la linea que dibujamos es
una tangente a la curva que corta
en el punto -R. De esta manera
P+P = 2P = -R. En la Figura 3.c se Q
ilustra el caso en el que no existe
una linea que pase por P y por Q
que corte en otro punto a la curva P

elíptica. En este caso se dice que


dicha linea corta la curva en un
punto O situado en el infinito, es
decir Ρ + Q = 0 o Ρ + Q = ∞ . En cuarto R
y último lugar representamos un
caso similar, en el que un único
punto al ser sumado por el mismo
corta la curva en el infinito. Figura 2. Suma de puntos

4 www.hakin9.org
Criptografía de Curva Elíptica

Una vez instalado PARI/GP se [13]. Los mismo algoritmos, implemen- La librería GMP nos permitirá usar
descomprime ELLSEA [15] y desde tados en C correrían sustancialmente números grandes sin problemas y nos
dentro del directorio SEA se llama más rápido, pues la ventaja visual de ofrecerá todas las funciones necesa-
a PARI/GP (Listado 1). Lo primero la sobrecarga de operadores, no es rias para nuestra implementación de
será leer el contenido de sea.gp. tal cuando se trata de rendimiento. En curvas elípticas. Así que empezare-
Lo haremos con la instrucción read cualquier caso, los siguientes algorit- mos definiendo algunas estructuras de
(sea). A continuación utilizaremos la mos están desarrollados con objetivo datos. Necesitaremos manejar curvas
instrucción ellinit() para crear una docente, por lo que C++ parece ser la elípticas y puntos en una curva. En el
curva. Los dos últimos parámetros opción correcta. Listado 2 vemos como podemos defi-
están formadas por las variables A
y B de la ecuación de Weirestrass Listado 1. Pari/GP
(Consultar Listado 1). En el Listado
se utiliza A=1 y B=1, es decir la cur- $ gp
Reading GPRC: /etc/gprc ...Done.
va y 2 = x 3 + x + 1 . Finalmente para
GP/PARI CALCULATOR Version 2.3.1 (released)
obtener el orden solo tenderemos i686 running linux (ix86 kernel) 32-bit version
que llamar a la función ellsea() a la compiled: Feb 28 2007, gcc-4.0.3 (Ubuntu 4.0.3-1ubuntu5)
que le pasaremos como parámetro (readline v5.1 enabled, extended help available)
la curva elíptica y el número primo Copyright (C) 2000-2006 The PARI Group
PARI/GP is free software, covered by the GNU General Public License, and
que define el campo finito. Si usa-
comes WITHOUT ANY WARRANTY WHATSOEVER.
mos el número primo 43 vemos que Type ? for help, \q to quit.
el orden es 34 (Listado 1). Es decir, Type ?12 for how to get moral (and possibly technical) support.
la curva mencionada dispone de 34 parisize = 4000000, primelimit = 500000
puntos diferentes. ?
? read("sea")
? E = ellinit([0,0,0,1,1]);
Algoritmos para ? ellsea(E,43)
curvas elípticas: ? 34
Implementación
En los apartados anteriores hemos Listado 2. Estructuras de datos
estudiado cómo realizar las opera-
typedef struct point_t
ciones habituales en curvas elípti- {
cas de forma gráfica. Pero esta no point_t() { infinity = false; }
es la forma más adecuada para un mpz_class x; // Coordenada X
ordenador. Así que en este aparta- mpz_class y; // Coordenada Y
bool infinity; // Es un punto en el infinito?
do veremos algunos algoritmos que
} point_t;
realizan estas operaciones. typedef struct
El lenguaje escogido para la im- {
plementación ha sido C++. El motivo mpz_class a; // Parametro A en la ecuación de Weierstrass
principal es la posibilidad de utilizar la mpz_class b; // Parametro B en la ecuación de Weierstrass
mpz_class n; // Campo finito de la curva
sobrecarga de operadores para rea-
mpz_class o; // Orden de la curva
lizar un programa matemáticamente } elliptic_curve_t;
más claro. Esta ventaja la encontramos
principalmente al usar la librería GMP

-R P
-R
Q
P

P P

P+Q = -R P+P = -R P+Q = 0 P+P = 0


a) b) c) d)

Figura 3. Ejemplos de suma

www.hakin9.org 5
Ataque

nir un punto y una curva. Usaremos el Ahora con unas pocas lineas Solo nos queda el algoritmo de
tipo mpz_class de la librería GMP que podemos realizar una función que la multiplicación, que permite mul-
representa un número entero. nos permite restar dos puntos (Lis- tiplicar un escalar por un punto en
Veamos el tipo point_t. El punto tado 5). una curva. Aunque es relativamen-
cuenta con sus dos coordenadas X e Otra función interesante para te corto, es un poco más difícil de
Y, así como con un booleano que realizar operaciones con puntos entender que los anteriores. Se re-
nos indica si se trata de un punto en y que nos resultará realmente útil comienda leerlo con detenimiento,
el infinito. en la implementación de la multi- pues aunque su comprensión no es
Una curva elíptica queda defini- plicación es el doblado de puntos. necesaria para seguir el resto del
da por los parámetros A y B de la Respecto a esta función, sobran los artículo, es muy instructivo (Lista-
ecuación de Weirestrass que hemos comentarios (Listado 6). do 7).
explicado anteriormente. El tipo ellip-
tic_curve_t define una curva a partir
de los parámetros A y B, del campo X6
finito de la curva y del orden de la X7
misma. Asimilar adecuadamente el 125
contenido del Listado 2 es necesario X5
182
para el correcto seguimiento de los
315
algoritmos posteriores.
Una vez disponemos de los tipos X8
de datos básicos con los que traba- 106
jar: el punto y la curva, ya podemos X4
iniciar el desarrollo de los algoritmos 49

necesarios. Empezaremos por la


suma de puntos, como en los apar-
tados anteriores. 11
X9
El algoritmo de suma del Listado X3 619
3 recibe como parámetros dos puntos
372 144
p1 y p2, un punto r donde retornar el
resultado y una curva en la que se rea- X10
X11
lizan las operaciones. El algoritmo em-
pieza verificando los datos de entrada X2 331
en busca de puntos en el infinito, pues
las suma de un punto P con un punto
O (infinito) da el mismo punto P.
A continuación se calculan las X1
192
nuevas coordenadas del punto re-
sultante de sumar p1 y p2. En este
caso el proceso se realiza despejan-
do adecuadamente la ecuación de
Weirestrass. X0 431
En los algoritmos propuestos en
las Tablas se hace uso de funciones
de la librería GMP como mpz _ mod()
para calcular el módulo o mpz _ Figura 4. Rho
invert() para calcular la inversa
modular. Si desconoce estas u otras
funciones de la librería GMP puede Campos Finitos
Un campo finito consiste en un conjunto finito de elementos con dos operaciones, la
consultar [13].
suma y la multiplicación y que satisface ciertas propiedades aritméticas. Si tenemos
Partiendo del algoritmo de la
un número primo p, todos los números enteros mod p forman el campo finito F p .
suma es muy sencillo realizar el al- Veamos un Listado sencillo para entender el concepto. El campo finito F 5 está forma-
goritmo de la resta. Pero para poder do por los siguientes elementos: F 5 = {0, 1, 2, 3, 4}
hacerlo necesitaremos una función Recordemos que una operación modular consistía en el resto de una división
que nos permita negar un punto. Pa- entera. De manera que 1 mod 5 = 1 , 2 mod 5 = 2 , 3 mod 5 = 3 , 4 mod 5 = 4 ,
ra negar un punto solo tenemos que 5 mod 5 = 0 , 6 mod 5 = 1 y así sucesivamente. De manera que para cualquier
cambiar el signo de su coordenada entero n, al calcular n mod 5 obtendremos un valor en F 5 .
Y (Listado 4).

6 www.hakin9.org
Criptografía de Curva Elíptica

Hasta aquí hemos desarrollado


Listado 3. Suma los algoritmos necesarios para tra-
void ec_add(point_t *r, const point_t *p1, const point_t *p2, const elliptic_ bajar con curvas elípticas. En los si-
curve_t *e) guientes apartados se utilizarán para
{ construir un ataque contra el proble-
mpz_class m;
mpz_class t;
ma del logaritmo discreto, base de la
point_t res; criptografía de Curva Elíptica.
if( (p1->infinity)&&(p2->infinity) )
{
r->x = 0;
El problema del
r->y = 0; logaritmo discreto en
r->infinity = true; curvas elípticas
return;
El problema del logaritmo discreto
}
else if(p1->infinity) para curvas elípticas (conocido como
{ ECDLP) es la base de los criptosiste-
r->x = p2->x; mas de curva elíptica. En apartados
r->y = p2->y;
r->infinity = false; anteriores hemos estudiado la ma-
return; nera de realizar operaciones como
} Q=kP partiendo de k y de P. Esta
else if(p2->infinity)
{
operación es computacionalmente
r->x = p1->x; fácil. Sin embargo obtener k a partir
r->y = p1->y; de P y Q es un problema difícil incluso
r->infinity = false;
para un ordenador. De hecho si utili-
return;
} zamos valores de k lo suficientemente
if(p1->x == p2->x) grandes, la tarea se vuelve computa-
{ cionalmente imposible. Al menos con
if( (p1->y + p2->y) % e->n == 0)
{ los algoritmos y máquinas actuales.
r->x = 0; Pues los algoritmos conocidos para
r->y = 0; resolver este problema son de tiempo
r->infinity = true;
return;
exponencial. En el siguiente apartado
} veremos como aprovechar este pro-
// m = (3x1^2+a) (2y1)^(-1) blema para realizar un intercambio de
m = 3*(p1->x)*(p1->x)+e->a;
claves seguro siguiendo el algoritmo
t = 2*(p1->y);
if(mpz_invert(t.get_mpz_t(), t.get_mpz_t(), e->n.get_mpz_t())==0) de Diffie-Hellman.
{
r->x = 0;
r->y = 0;
Intercambio de claves
r->infinity = true; de Diffie-Hellman en
return; curvas elípticas
} El intercambio de claves de Diffie-
m *= t;
} Hellman es un protocolo basado en el
else problema del logaritmo discreto que
{ // m = (y2-y1) (x2-x1)^(-1) permite intercambiar claves de forma
m = p2->y - p1->y;
t = p2->x - p1->x;
segura. Posteriormente se utilizará la
if(mpz_invert(t.get_mpz_t(), t.get_mpz_t(), e->n.get_mpz_t())==0) clave intercambiada como clave de
{ cifrado simétrico. Este algoritmo se
r->x = 0;
puede adaptar a las curvas elípticas,
r->y = 0;
r->infinity = true; formando el algoritmo ECDH o Elliptic
return; Curve Diffie-Hellman. Veamos paso
} a paso como funciona el algoritmo.
m *= t;
}
// x = m^2 - x1 -x2 • Un usuario A y un usuario B acuer-
res.x = m*m - p1->x - p2->x; dan usar una curva elíptica E sobre
mpz_mod(res.x.get_mpz_t(), res.x.get_mpz_t(), e->n.get_mpz_t());
// y = m(x1-x) -y1
un campo finito Fq de manera que
res.y = (m*(p1->x - res.x) - p1->y) % e->n; el problema del logaritmo discreto
mpz_mod(res.y.get_mpz_t(), res.y.get_mpz_t(), e->n.get_mpz_t()); sea difícil en E ( Fq ) . También acor-
r->x = res.x;
darán un punto P perteneciente
r->y = res.y;
} a la curva de manera que su orden
sea un número primo grande.

www.hakin9.org 7
Ataque

• El usuario A escoge un entero


Listado 4. Negación secreto a, calcula a y envía
void ec_neg(point_t *p) Pa al usuario B.
{ • El usuario B escoge un entero
p->y *= -1; secreto b, calcula y envía
} Pb al usuario A.
• El usuario A calcula aPb = abP .
Listado 5. Resta • El usuario B calcula bPa = baP .
void ec_sub(point_t *r,
const point_t *p1, Finalizado el algoritmo, tanto el
const point_t *p2, usuario A como el usuario B dispo-
const elliptic_curve_t *e)
nen de abP . Un usuario que escucha
{
point_t res;
el canal de comunicación ha podido
res.x = p2->x; obtener Pa y Pb pero estos no son su-
res.y = p2->y; ficientes para obtener abP a menos
ec_neg(&res); que se resuelva el problema del
ec_add(&res, p1, &res, e);
logaritmo discreto.
r->x = res.x;
r->y = res.y;
Ahora el usuario A y el usuario B
} pueden comunicarse utilizando una
clave de cifrado que solo ellos cono-
Listado 6. Doblado cen extrayéndola de abP , por Listado
los X últimos dígitos o el resultado de
void ec_double(point_t *r,
una operación de hash.
const point_t *p,
const elliptic_curve_t *e)
{ Otros criptosistemas
ec_add(r, p, p, e); de curva elíptica
} Existen varios criptosistemas de cur-
va elíptica que se pueden encontrar
Listado 7. Multiplicación
en [5] o en Internet sin demasiado
void ec_mul(point_t *Q, esfuerzo. Los más conocidos son:
const mpz_class k, El intercambio de claves de Diffie-
const point_t *P,
Hellman (explicado en el apartado
const elliptic_curve_t *e)
{
anterior), el algoritmo de firma digital
mpz_class k3; ECDSA, el cifrado Massey-Omura,
unsigned int B; ElGamal, etc.
point_t R;
if( (k==0)||(P->infinity))
{
Software Libre
Q->x = 0; disponible
Q->y = 0; Existen varias implementaciones li-
Q->infinity = true; bres de criptosistemas de curva elíp-
return;
tica como el parche eccGnuPG para
}
R.x = P->x; la conocida herramienta GnuPG[12]
R.y = P->y; o la herramienta SKS [11] que desta-
k3 = k*3; ca por su simplicidad.
B = mpz_sizeinbase(k3.get_mpz_t(), 2);
Como no es mi intención escribir
int j;
for(j=B-2; j>=1; j--) aquí un manual de herramientas de
{ cifrado me limitaré a poner un Lis-
ec_double(&R, &R, e); tado de uso de SKS. En la web del
if( (mpz_tstbit(k3.get_mpz_t(),j)==1)&&(mpz_tstbit(k.get_mpz_t(),j)==0)
proyecto se proporciona una muy
)
ec_add(&R, &R, P, e); buena documentación que permitirá
if( (mpz_tstbit(k3.get_mpz_t(),j)==0)&&(mpz_tstbit(k.get_mpz_t(),j)==1) al lector probar todas sus funcio-
) nalidades sin dificultad alguna. En
ec_sub(&R, &R, P, e); el Listado 8 se muestra el uso de
}
mpz_mod(Q->x.get_mpz_t(), R.x.get_mpz_t(), e->n.get_mpz_t());
SKS para firma firma digital. SKS
mpz_mod(Q->y.get_mpz_t(), R.y.get_mpz_t(), e->n.get_mpz_t()); tiene las funcionalidades de cifrado
} (y compresión), resumen (hash)
y firma digital.

8 www.hakin9.org
Criptografía de Curva Elíptica

Ataques al logaritmo
Listado 9. Factorización Rho de Pollard discreto
// Compilar: g++ rho.cpp -lgmpxx -o rho Resumiendo, podemos decir que
#include <gmpxx.h> resolver el problema del algoritmo
#include <iostream> discreto consiste en obtener k de la
// F(x) = x^2k + a mod n
mpz_class F(mpz_class &x, mpz_class &k, mpz_class &a, mpz_class &n)
fórmula Q = kP a partir de Q y P. Co-
{ mo siempre en estos casos el primer
mpz_class res; ataque que se le viene a uno a la
mpz_class pow;
cabeza es la fuerza bruta, es decir,
pow = 2*k;
mpz_powm(res.get_mpz_t(), x.get_mpz_t(), pow.get_mpz_t(), n.get_mpz_t()); probar con todos los valores de k .
res += a; Un ejemplo de [8] que puede re-
return res;
sultar ilustrativo es el siguiente:
}
int main(int argc, char *argv[]) Supongamos la curva elíptica
{ sobre F23 , Q = (4, 5) y P = (16, 5) . Para
using namespace std; resolver el problema del logaritmo
mpz_class n, U, V, s, g, k, a, p, count;
if (argc!=3) discreto Q = kP calcularemos todos
{ los múltiplos de P hasta resolver el
cout << argv[0] << " [n number] [B bound]" << endl; problema:
return 0;
}
n = argv[1]; y 9 P = (4, 5) . Dado que 9 P = (4, 5) = Q
int B = atoi(argv[2]); sabemos que k = 9 . Lógicamente en
count = 0;
s = 2;
U = s;
V = s;
g = 1;
mpz_fac_ui(k.get_mpz_t(), B);
a = 3;
while(g==1)
{
U = F(U, k, a, n);
V = F(V, k, a, n);
V = F(V, k, a, n);
g = U-V; una aplicación criptográfica real el
mpz_gcd(g.get_mpz_t(), g.get_mpz_t(), n.get_mpz_t());
tamaño de k será lo suficientemente
if(g==n)
{ grande como para que esta forma de
cout << "bad seed" << endl; actuar sea impracticable incluso pa-
U++;
ra miles de ordenadores trabajando
V++;
g=1; en paralelo.
} Pero esta no es la única técnica
count ++; que permite atacar el logaritmo discre-
cout << "count: " << count << "\r";
} to. Existen muchas más como el algo-
cout << endl << g << endl; ritmo Baby Step, Giant Step, el ataque
return 0; MOV, el método Pohlig-Hellman, etc.
Algunos de ellos pueden encontrarse
Listado 8. SKS en [5] y [6]. Pero el ataque de carácter
$ ./sks -kg general más rápido es el algoritmo
SKS. Introduce etiqueta identificadora: miclave Rho de Pollard. Este algoritmo es de
SKS. Introduce tu contraseña: tiempo exponencial con una comple-
-----SKS KEY-----
jidad de , donde N es el orden de
key: 7fZ1gptfpbrjM6wgU3iLqjbFbEZtwUa6jebi
miclave
la curva. Este algoritmo es de tipo pro-
[f7e2e68d]: miclave babilístico y una de sus mayores ven-
$ ./sks -kl tajas es que no requiere almacenar
[f7e2e68d]: miclave grandes cantidades de datos. Además
$ ./sks -s msg.txt msg.sig
es fácilmente paralelizable.
SKS. Introduce tu contraseña:
SKS. Clave de firma: [ed960057]
Lo que queda de artículo está
$ ./sks -v msg.txt msg.sig destinado a la comprensión e imple-
[ed960057]: miclave mentación del ataque Rho de Pollard
SKS. Firma correcta realizada en: 2007-03-07, 19:38 a los Criptrosistemas de Curva Elípti-
ca basados en el ECDLP.

www.hakin9.org 9
Ataque

Introducción representar la forma en la que se Atacando el logaritmo


al algoritmo Rho van generando los elementos como discreto
de Pollard la letra griega rho, de ahí el nom- El apartado anterior puede resultar
Una de las principales cualidades bre del algoritmo. En la Figura 4 se adecuado para comprender las ba-
del método Rho de Pollard es el reproduce un Listado de Wikipedia. ses del algoritmo Rho de Pollard.
tiempo medio que tarda en encon- En este Listado se usa como valor Pero se ha aplicado al problema de
trar una solución ( ), por encima inicial el 431 (cualquier valor sirve) la factorización, y no al problema
de los otros algoritmos que permiten y como función f ( x) = x 2 + 23 mod 703 . ECDLP que es el que nos ocupa. En
atacar el problema del logaritmo Vemos como en el elemento 619 se este apartado aplicaremos el algorit-
discreto en curvas elípticas. Otra inicia el ciclo, que queda cerrado en mo a la resolución del ECDLP con
ventaja importante es que el siste- el elemento 372. un Listado.
ma Rho es de carácter general, lo Volviendo al ejemplo del Listado Lo primero que necesitamos es
que permite usar este algoritmo en 9 y al uso de la función F() es inte- encontrar una función F(x) análoga
cualquier campo finito. Un buen Lis- resante observar como la función es a la utilizada en el apartado anterior.
tado es la implementación de este llamada dos veces con el parámetro V En este caso se tratará de F(S)
sistema como algoritmo de factori- y una sola vez con el parámetro U. Es- donde S será un punto aleatorio
zación. En el Listado 9 se presenta ta técnica, llamada búsqueda de ciclos inicial. Dado que posteriormente
dicho algoritmo implementado en de Floyd, permite acelerar el algoritmo se dedica un apartado completo a
C++/GMP. No entraremos en deta- buscando una colisión entre V y U. estudiar la optimización de la fun-
lle, pues no es el objetivo de este En curvas elípticas el esquema ción F, para empezar usaremos una
artículo estudiar el problema de la es el mismo, pero utilizando puntos función simple como la siguiente:
factorización. Pero dado que vamos en una curva en lugar de números f ( S ) = S + aP + bQ para valores de a
a centrarnos en el algoritmo Rho enteros. y b aleatorios. El punto S inicial lo
de Pollard para curvas elípticas,
la implementación de este mismo
Listado 10. Funciones útiles
algoritmo para factorización puede
servirnos de introducción, pues es bool solve(const mpz_class &U_mP, const mpz_class &U_mQ,
considerablemente más simple. Lo const mpz_class &V_mP, const mpz_class &V_mQ,
mas relevante de este programa const point_t *P, const point_t *Q,
const elliptic_curve_t *e)
es el bucle principal y el uso que se
{
hace en el de la función F(), dado mpz_class k;
que es idéntico al algoritmo que im- mpz_class u = U_mP - V_mP;
plementaremos más adelante para mpz_class v = V_mQ - U_mQ;
atacar el ECDLP. point_t R;
if(!mpz_invert(k.get_mpz_t(), v.get_mpz_t(), e->o.get_mpz_t()))
Utilizamos campos finitos, por lo
return false;
que el número de elementos (orden) k *= u;
con el que trabajaremos será tam- mpz_mod(k.get_mpz_t(), k.get_mpz_t(), e->o.get_mpz_t());
bién finito. Así pues, si definimos una
función que realice un mapeo entre // Verificar k
// ...
dos elementos del grupo y nos de-
}
dicamos a ir realizando mapeos uno void seed_F(point_t *U, point_t *V, mpz_class &U_mP, mpz_class &U_mQ,
tras otro, de todos los elementos, lle- mpz_class &V_mP, mpz_class &V_mQ, const point_t *P, const point_t *Q,
garemos a un punto donde se repe- const elliptic_curve_t *e)
tirán. Por Listado, supongamos que {
// ec_rand_number() Busca un número aleatorio < n usando la API de GMP
tenemos un grupo de elementos en
ec_rand_number(U_mP, e->n);
F35 . Supongamos también que defi- ec_rand_number(U_mQ, e->n);
nimos una función f ( x) = x 2 + 1mod 35, V_mP = U_mP;
entonces si nos dedicamos a hacer V_mQ = U_mQ;
mapeos con esta función: f(0)=1, // P0 = rand(a)P + rand(b)Q
point_t tmp1, tmp2;
f(1)=2, f(2)=5, f(5)=26, f(26)=12,
ec_mul(&tmp1, U_mP, P, e);
f(12)=5 repitiendo de nuevo el ter- ec_mul(&tmp2, U_mQ, Q, e);
cer elemento y generando así un ec_add(U, &tmp1, &tmp2, e);
ciclo. Nuestro rango de soluciones V->x = U->x;
se puede dividir en dos partes, la V->y = U->y
V->infinity = U->infinity;
primera son los elementos {1,2}
// ...
y la segunda los elementos {5, 26, }
12} que forman un ciclo. Podríamos

10 www.hakin9.org
Criptografía de Curva Elíptica

buscaremos de la misma manera, es lizando el cálculo obtenemos k =13 . este apartado implementaremos en
decir, partiendo de dos valores a y En este punto podemos verificar que C++ este algoritmo, que nos servirá
b aleatorios, multiplicaremos por P y 13(0, 6) = (3, 23) , resolviendo el pro- para atacar problemas en campos
Q respectivamente y sumaremos los blema en dos iteraciones, lejos de finitos mayores.
resultados. De momento utilizare- las 13 necesarias en un ataque de Partiendo de la implementación
mos como función f ( S ) = S + 4 P + 3Q . fuerza bruta. del algoritmo presentado en el Lista-
Como Listado tomaremos la cur- do 9 podemos desarrollar mediante
va definida por y 2 = x3 +12 x + 36 mod 43 Ataque Rho de Pollard: un esquema similar una implementa-
de orden 53, y un punto en ella Implementación ción para curvas elípticas.
P = (0, 6) . Supongamos ahora que Hemos estudiado como funciona Lo primero que necesitamos es
Q = (3, 23) . En los sistemas de cripto- el algoritmo Rho de Pollard y como una función que nos permita inicia-
grafía de curva elíptica todos estos usarlo para atacar el ECDLP. En lizar los valores con los que traba-
datos son públicos. Nuestro objetivo
será encontrar un valor k que cum-
pla kP = Q . Lo que en un sistema Listado 11. Ataque Rho
criptográfico supondría encontrar // ...
la clave. int F(mpz_class &R_mP, mpz_class &R_mQ, point_t *R, const point_t *P,
Basándonos en lo que hemos const point_t *Q, const point_t *S, const elliptic_curve_t *e)
aprendido sobre el algoritmo Rho de {
k = 4;
Pollard sabemos que tenemos que
ec_mul(&M, k, P, e);
manejar un punto U y un punto V, k = 3;
aplicando la función F(S) dos veces ec_mul(&T, k, Q, e);
a V por cada una que la apliquemos ec_add(&M, &M, &T, e);
a U. Efectuaremos este procedi- R_mP += 4;
R_mQ += 3;
miento en repetidas ocasiones hasta
// ...
encontrar una colisión. }
Una vez encontramos la coli- // ...
sión disponemos de F ( Si ) = F ( S j ) mpz_class U_mQ;
, que también puede representarse mpz_class V_mP;
mpz_class V_mQ;
como ai P + bi Q = a j P + b j kP . Co-
point_t R;
mo sabemos que kP = Q podemos point_t P;
sustituir en la ecuación obteniendo point_t Q;
ai P + bi kP = a j P + b j kP y despejar point_t U;
k = (ai − a j )(b j + bi )−1 . point_t V;
elliptic_curve_t E;
Existe otra manera de encontrar
// Inicialización de valores
el resultado sin necesidad de en- seed_F(&U, &V, U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E);
contrar una colisión. Esta consiste for(;;)
en la posibilidad de localizar durante {
la ejecución del algoritmo ecua- if(!F(U_mP, U_mQ, &U, &P, &Q, &U, &E))
{ seed_F(&U, &V, U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E); continue; }
ciones como aP + Q = 0 , aP + Q = P
if(!F(V_mP, V_mQ, &V, &P, &Q, &V, &E))
, aP + Q = Q o similares. Pues igual { seed_F(&U, &V, U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E); continue; }
que en el caso anterior permitirían if(!F(V_mP, V_mQ, &V, &P, &Q, &V, &E))
resolver k . { seed_F(&U, &V, U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E); continue; }
Finalmente veamos como // Colisión?
if( (V.x==U.x) && (V.y==U.y) )
resolver el problema planteado.
{
Empezamos en un punto aleatorio // Busca una solución
P0 = 21P + 26Q = (14, 29) . if(solve(U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E))
Aplicamos F (U ) = 25P + 29Q = (13, 29) {
y F ( F (V )) = 29 P + 32Q . No hay break;
}
colisión. Aplicamos de nuevo
else
F(U) y F(F(V)) y durante el cál- {
culo de la segunda vemos que seed_F(&U, &V, U_mP, U_mQ, V_mP, V_mQ, &P, &Q, &E);
F(F(V)) = P = 37P+38Q. Lo que ya nos continue;
permite encontrar un resultado. Des- }
}
pejamos k = 36(−38)−1 mod 53 (notar
}
que es una operación modulo 53, // ...
es decir el orden de la curva). Rea-

www.hakin9.org 11
Ataque

jaremos. He llamado a esta función sante es la que calculará la solución cada punto guardado, es necesario
seed _ F() y se encargará de buscar cuando encontremos la colisión. disponer de su relación con P y Q,
un punto aleatorio en la curva con A esta función le he llamado solve(). pues es necesaria si queremos des-
el que empezar. Otra función intere- Encontrar una colisión no implica pejar k como se mostró en el apar-
siempre encontrar la solución, por tado anterior. Con este propósito
Listado 12. Casos especiales lo que solve() deberá verificar que usaremos las variables U y V para
kP = Q . En caso contrario se conti- almacenar los puntos, y las variables
// ... nuará con la búsqueda de colisiones U_mP, U_mQ, V_mP y V_mQ para
// aP+bQ=P
(Listado 10). guardar los multiplicadores. De esta
if( (R->x==P->x)&&(R->y==P->y) )
{
En el caso de las curvas elípticas manera cada punto V podrá repre-
// ... hay algunos factores adicionales sentarse también como VmP P +VmQ Q ,
} a tener en cuenta. Por ejemplo, para y lo mismo con U (Listado 11).
// aP+bQ=Q
if( (R->x==Q->x)&&(R->y==Q->y) )
{
// ... Referencias
}
// aP+bQ=0 • [1] http://daniellerch.com,
if(R->infinity) • [2] http://daniellerch.com/dfact.html,
{ • [3] Daniel Lerch, Ataque de factorización a RSA. hakin9 – nº19,
// ...
• [4] Wikipedia, Curva Elíptica: http://es.wikipedia.org/wiki/Curva_
}
el%C3%ADptica,
// ...
• [5] Lawrence C. Washington, Elliptic Curves, Number Thoery and Cryptography.
Chapman & Hall/CRC,
Listado 13. Función F
• [6] Richard Crandall, Carl Pomerance, Prime Numbers, A computational Perspec-
// ... tive. 2Ed. Sptrigler,
switch (mpz_mod_ui(k.get_mpz_t(), • [7] Alfred Menezes, Evaluation of Security Level of Cryptography: The Elliptic Cur-
S->x.get_ ve Discrete Logarithm Problem (ECDLP),
mpz_t(), • [8] Certicom, Online Elliptic Curve Cryptography Tutorial: http://www.certicom.com/
3)) index.php?action=ecc_tutorial,home,
{
• [9] The Certicom ECC Challenge: http://www.certicom.com/
/* M0 = 4P + 3Q */
index.php?action=res,ecc_challenge,
case 0:
• [10] Certicom, Challenge Lists and Prizes: http://www.certicom.com/
k = 4;
ec_mul(&M, k, P, e); index.php?action=res,ecc_solution,
k = 3; • [11] SKS, Criptografía de Bolsillo: http://pagina.de/sks,
ec_mul(&T, k, Q, e); • [12] eccGnuPG. Implemetación GnuPG con curvas elípticas: http://
ec_add(&M, &M, &T, e); www.calcurco.cat/eccGnuPG/document.es.html,
R_mP += 4; • [13] GMP, GNU Multiple Precision Arithmetic Library: http://gmplib.org/,
R_mQ += 3; • [14] Google: http://google.com,
break; • [15] Ellsea: http://www.ufr-mi.u-bordeaux.fr/~belabas/pari/scripts/ellsea.tar.gz,
/* M1 = 9P + 17Q */
• [16] PARI/GP: http://pari.math.u-bordeaux.fr/,
case 1:
• [17] The Certicom ECC Challenge: http://www.certicom.com/
k = 9;
index.php?action=ecc,ecc_challenge,
ec_mul(&M, k, P, e);
k = 17; • [18] P.C. Oorschot, M.J. Wiener, Parallel Collision Search with Cryptanalytic Appli-
ec_mul(&T, k, Q, e); cations: http://cr.yp.to/bib/1999/vanoorschot.pdf,
ec_add(&M, &M, &T, e); • [19] Nicholas Lamb, An investigation into Pollard's Rho Method for attacking Elliptic
R_mP += 9; Curve Cryptosystems: http://www.cs.ualberta.ca/~nlamb/PollardRhoDiscussion.
R_mQ += 17; pdf,
break; • [20] Wikipedia, Index Calculus: http://en.wikipedia.org/wiki/Index_calculus_algo-
/* M2 = 19P + 6Q */ rithm.
case 2:
k = 19;
ec_mul(&M, k, P, e);
k= 6;
ec_mul(&T, k, Q, e); Sobre el Autor
ec_add(&M, &M, &T, e); Daniel Lerch (http://daniellerch.com) es Ingeniero de Sistemas por la Universidad
R_mP += 19; Oberta de Catalunya y Master en Cisco Networking, Wireless & Network Security. Ac-
R_mQ += 6;
tualmente trabaja en el sector de las telecomunicaciones como Ingeniero de Software
break;
C/C++ en plataformas GNU/Linux.
}
En su tiempo libre coordina el proyecto OpenDomo (http://opendomo.org) e inves-
// ...
tiga en seguridad informática y criptografía.

12 www.hakin9.org
Criptografía de Curva Elíptica

Con estas indicaciones el lector anteriores (U=V1 o V2 ...?). Así


ya puede construir una primera ver- aumentaremos considerablemente
sión del ataque Rho de Pollard. las posibilidades de encontrar una
colisión. Por otra parte, mantener
Verificación de valores una lista de resultados demasiado
intermedios larga podría llevar a producir un
Durante el uso normal del pro- descenso del rendimiento por la
grama, principalmente en las pérdida de tiempo consultando
llamadas a seed _ F() y solve() dicha lista en cada iteración. Por
nos podemos encontrar con va- lo que será necesario encontrar un
lores que podrían darnos una valor adecuado para el tamaño de
solución inmediata, sin tener que buffer.
esperar una colisión. Como se Por otra parte, una mejora inte-
ha explicado anteriormente estos resante es la de utilizar operaciones
valores se producen al encon- basadas en coordenadas Mont-
trar ecuaciones como aP + Q = 0 , gomery. Entre otros beneficios,
aP + Q = P , aP + Q = Q o similares. eliminan la necesidad de utilizar
En el Listado 12 se muestra un operaciones de inversión, las cua-
Listado de como detectarlas. En les son bastante lentas. Consulte
estos casos, se llamaría a solve() [6] y [14].
con los parámetros adecuados in- Para atacar criptosistemas de
tentando encontrar una solución. curva elíptica como los planteados
en The Certicom ECC Challenge
Optimización [17] es necesario recurrir a ver-
A continuación se plantean algunas siones distribuidas del ataque Rho
posibles mejoras que se pueden de Pollard [18]. No entraremos en
aplicar a nuestra implementación: detalle, pues hay materia suficien-
El rendimiento del algoritmo te para otro artículo. En cualquier
depende en gran parte de la fun- caso, el lector puede consultar
ción F(). Para un análisis detallado [17] para más información sobre
consultar [19]. La función F() que el reto.
hemos usado en los Listados es
la más básica. Un paso más ha- Conclusiones
cia una mejora en el rendimiento Aunque la criptografía de curva
consiste en realizar particiones. elíptica parece ser más segura que
Cada partición consistirá en una los algoritmos de clave pública más
función diferente a evaluar, de utilizados (con claves de menor ta-
manera que al aplicar F(S) se maño), lo cierto es que no se ha in-
escoja una partición en función vestigado tanto. Por lo que los mas
de las características de S y se de 25 años que avalan la seguridad
aplique. Para hacerlo más claro de criptosistemas como RSA conti-
veamos un Listado utilizando tres núan pesando mucho.
particiones. Sabremos cuál de las Actualmente la criptografía de
tres particiones utilizar en función curva elíptica está creciendo en
de la coordenada X del punto de uso, aunque se mantiene todavía
entrada. Así si realizamos x mod 3 a la sombra del famoso RSA. Qui-
, podremos elegir entre las tres zás en no demasiado tiempo su uso
particiones (Listado 13). se extienda tanto como merece.
Otra forma sencilla de aumentar Por otra parte existen diferentes
las posibilidades de encontrar una lineas de investigación que hacen
colisión, consiste en mantener en pensar en la posibilidad de la
memoria un listado de los últimos existencia de un algoritmo subex-
resultados obtenidos. De esta for- ponencial que permita resolver el
ma cada vez que comparemos el ECDLP, pero por ahora el ataque
resultado (U=V?) actual para ver si más rápido es el método Rho de
hay colisión, realmente lo compara- Pollard, un algoritmo de tiempo
remos con un listado de resultados exponencial. l

www.hakin9.org 13
View publication stats

Вам также может понравиться