Economics Structure Eugene Silberberg
Economics Structure Eugene Silberberg
Economics Structure Eugene Silberberg
net/publication/259475323
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.
Grado de dificultad
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
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
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
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
6 www.hakin9.org
Criptografía de Curva Elíptica
www.hakin9.org 7
Ataque
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
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
www.hakin9.org 13
View publication stats