You are on page 1of 52

UNIVERSIDAD AUTÓNOMA DE MADRID

FACULTAD DE CIENCIAS

TRABAJO FIN DE GRADO

EL PROBLEMA DEL LOGARITMO DISCRETO PARA CURVAS


ELÍPTICAS Y SUS APLICACIONES CRIPTOGRÁFICAS

María Inés de Frutos Fernández


MAYO 2014

Tutor: Adolfo Quirós Gracián


Abstract

An elliptic curve over a field K is a projective non-singular curve of genus 1 with a distinguished
rational point P∞ . The discrete logarithm problem (DLP) consists in, given a cyclic group
G = hbi and an element y ∈ G, finding an integer n such that bn = y. We show that
the K-rational points of an elliptic curve E form an additive abelian group, with P∞ as the
identity element. We also introduce the Weierstrass equation of an elliptic curve. After that,
we present some cryptographical applications of the discrete logarithm problem over elliptic
curves, including Diffie-Hellman key exchange, Massey-Omura encryption and ECDSA digital
signatures. We analyze some general attacks on the DLP: Baby-Step Giant-Step, Pollard’s rho
algorithm and Silver-Pohlig-Hellman attack. All of these attacks are exponential, which makes
them useless when the size of the group G is big. We also describe two specifics attacks: the
subexponential algorithm Index Calculus, which works over F∗q , and Xedni Calculus, which is an
attack on the DLP over elliptic curves. Finally, we compare the performances of several attacks
over F∗q and E(Fq ): Baby-Step Giant-Step, four variants of Pollard’s rho method and Index
Calculus (the last one, only over F∗q ). We conclude that, on groups of the sizes we consider,
Pollard’s rho attack works best for computing isolated logarithms, while Index Calculus is the
fastest method when several attacks need to be made.
Índice general

Introducción 1

1. Curvas elípticas. Definición y ley de grupo. 3


1.1. Definición. Ecuación de Weierstrass. . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2. Ley de grupo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2. El problema del logaritmo discreto en grupos cíclicos. 9

3. Aplicaciones criptográficas del problema del logaritmo discreto. 11


3.1. Intercambio de claves de Diffie-Hellman. . . . . . . . . . . . . . . . . . . . . . . 11
3.2. Criptosistema de Massey-Omura. . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3. Criptosistema de Elgamal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4. Esquema de firma digital de Elgamal. . . . . . . . . . . . . . . . . . . . . . . . . 14
3.5. Algoritmo de firma digital sobre curvas elípticas (ECDSA). . . . . . . . . . . . . 16
3.6. Esquema de cifrado integrado en curvas elípticas (ECIES). . . . . . . . . . . . . 16

4. Ataques generales al problema del logaritmo discreto. 18


4.1. Fuerza bruta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2. Baby-Step Giant-Step. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3. Algoritmo rho de Pollard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.4. Algoritmo de Silver-Pohlig-Hellman. . . . . . . . . . . . . . . . . . . . . . . . . . 20

5. Index Calculus y Xedni Calculus. 23


5.1. Index Calculus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.2. Xedni Calculus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6. Rendimiento de los ataques al problema del logaritmo discreto. 28


6.1. Descripción de las pruebas realizadas. . . . . . . . . . . . . . . . . . . . . . . . . 28
6.2. Conclusiones sobre Baby-Step Giant-Step. . . . . . . . . . . . . . . . . . . . . . 29
6.3. Variantes del algoritmo rho de Pollard. . . . . . . . . . . . . . . . . . . . . . . . 29
6.4. Análisis del algoritmo rho de Pollard lineal sobre distintos grupos. . . . . . . . . 31
6.5. ¿Es Index Calculus mejor? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

A. Variedades y curvas algebraicas. 35


A.1. Variedades afines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
A.2. Variedades proyectivas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A.3. Curvas algebraicas. Divisores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
A.4. Formas diferenciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
A.5. El teorema de Riemann-Roch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

i
B. Ecuaciones cuadráticas en cuerpos finitos. 42
B.1. Cálculo de raíces cuadradas en cuerpos finitos. . . . . . . . . . . . . . . . . . . . 42
B.2. Ecuaciones cuadráticas en cuerpos finitos. . . . . . . . . . . . . . . . . . . . . . 44

C. Algoritmos auxiliares para el uso de curvas elípticas. 46


C.1. Selección de curvas elípticas criptográficamente buenas. . . . . . . . . . . . . . . 46
C.2. Codificación de mensajes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

ii
Introducción.
Dado un grupo cíclico finito G, un generador b de G y una potencia y de b, el logaritmo
discreto de y en base b es cualquier entero n tal que bn = y. El problema del logaritmo discreto
(DLP), consiste precisamente en, dados los elementos y y b, encontrar el entero n.
La inversa del logaritmo discreto es la exponenciación en un grupo finito, para la cual existe
un algoritmo polinomial (cúbico). Sin embargo, calcular logaritmos discretos es un problema
difícil: no se conoce ningún algoritmo subexponencial general (es decir, que no dependa de la
estructura del grupo concreto) para resolverlo. Por tanto, la exponenciación en un grupo finito
es una función de un solo sentido, que puede ser usada como base para sistemas de criptografía
de clave pública.
Existen varios protocolos criptográficos que basan su seguridad en la dificultad del DLP.
Originalmente, dichos criptosistemas se implementaban operando sobre el grupo de unidades de
un cuerpo finito; sin embargo, sobre este tipo de grupos existe un ataque subexponencial para
calcular logaritmos discretos: el Index Calculus. Para evitar esta vulnerabilidad, se presentan
como alternativa los criptosistemas basados en el DLP sobre curvas elípticas.
Una curva elíptica E definida sobre un cuerpo K es una curva algebraica sobre K, proyectiva,
lisa, de género 1 y con un punto P∞ ∈ E(K), que se denomina origen o punto en el infinito.
Es posible definir una operación suma con la cual los puntos de dicha curva forman un grupo
abeliano y, en particular, sus puntos racionales componen un subgrupo de éste.
Al contrario de lo que ocurre en F∗q , no se conoce ningún ataque subexponencial para el
DLP sobre curvas elípticas cualesquiera con coeficientes en cuerpos finitos, de modo que, salvo
para tipos específicos de curvas, los únicos ataques posibles son los generales, que requieren un
tiempo de ejecución exponencial.
Como consecuencia, cuando los criptosistemas basados en el DLP se implementan sobre
curvas elípticas, es posible obtener el mismo nivel de seguridad que en un sistema tradicional,
utilizando claves de longitud significativamente menor.
En el capítulo 1 de este trabajo se introduce la definición de curva elíptica con coeficientes
en un cuerpo K y se presenta un modelo para dicho tipo de curvas: la ecuación de Weierstrass.
También se define una operación suma sobre los puntos de una curva elíptica E y se demuestra
que dicha operación dota a los puntos de la curva de estructura de grupo abeliano. Además, se
define el conjunto de puntos K-racionales de la curva E y se prueba que dicho conjunto es un
subgrupo de E.
En el capítulo 2 se define el problema del logaritmo discreto sobre grupos cíclicos finitos y se
analiza por qué, pese a que todos los grupos cíclicos finitos del mismo orden son isomorfos entre
sí, la dificultad del problema varía enormemente según la presentación del grupo. Se introduce
la exponenciación en un grupo finito como función de un solo sentido, y se proporciona un
algoritmo eficiente (de orden cúbico) para calcularla: la exponenciación mediante cuadrados
iterados.

1
El capítulo 3 describe varias aplicaciones criptográficas del problema del logaritmo discreto.
Originalmente, la mayor parte de estas aplicaciones no se basaban en curvas elípticas, sino en
el grupo de unidades de un cuerpo finito de gran tamaño. Sin embargo, la mayor dificultad
del problema del logaritmo discreto sobre curvas elípticas hace que, al adaptar los algoritmos
para utilizar éstas, se pueda obtener el mismo nivel de seguridad con claves mucho más cortas
que cuando se emplea la versión clásica del criptosistema. En particular, se han estudiado las
siguientes aplicaciones: el intercambio de claves de Diffie-Hellman, el esquema de firma digital
de Elgamal, el estándar de firma digital DSS, y tres sistemas de cifrado: los criptosistemas de
Massey-Omura y Elgamal, y el esquema de cifrado integrado en curvas elípticas (ECIES).
En el capítulo 4 se estudian tres ataques generales al problema del logaritmo discreto: el
ataque Baby-Step Giant-Step, el método rho de Pollard y el algoritmo de Pohlig-Hellman. Para
ello, se describe el funcionamiento de cada uno de los algoritmos y se analiza su rendimiento
teórico, tanto en tiempo como en memoria. Estos tres ataques resultan ser exponenciales, con
lo cual no resultan prácticos sobre grupos de gran tamaño.
Además de estos ataques de carácter general, en el capítulo 5 se estudia el algoritmo Index
Calculus, que permite resolver el DLP en tiempo subexponencial sobre el grupo de unidades de
un cuerpo finito. También se describe el ataque Xedni Calculus, especialmente diseñado para
resolver el problema del logaritmo discreto sobre curvas elípticas, y se advierte que dicho ataque
no es práctico sobre grupos grandes, aunque tiene gran interés teórico.
Como parte de este trabajo, se ha implementado en Sage el ataque Baby-Step Giant-Step,
cuatro variantes del algoritmo rho de Pollard y el ataque Index Calculus. Los cinco primeros
se han programado tanto sobre F∗q como sobre E(Fq ), mientras que el último sólo tiene sentido
sobre el primer grupo. También se han programado funciones para exponenciar en un grupo
finito, siguiendo el algoritmo de cuadrados iterados, y para elegir curvas elípticas aleatorias que
satisfagan ciertas propiedades deseables desde el punto de vista criptográfico.
Una vez implementados los ataques, se han llevado a cabo pruebas para estudiar su
rendimiento. Los resultados obtenidos, recogidos en el capítulo 6, indican que, salvo Baby-
Step Giant-Step, los algoritmos se ajustan bien a sus tiempos de ejecución teóricos. Además,
para grupos de los tamaños probados, se concluye que Pollard rho es el algoritmo más rápido
para calcular un único logaritmo discreto. En cambio, si se desea resolver varias veces el DLP
sobre el mismo grupo y con el mismo generador, Index Calculus es la opción más eficiente.
Por último, la memoria incluye tres apéndices: el A proporciona un resumen sobre variedades
y curvas algebraicas con los conceptos necesarios para entender el capítulo 1; el B explica cómo
resolver ecuaciones cuadráticas sobre cuerpos finitos; y el C describe métodos para seleccionar
curvas elípticas criptográficamente buenas y para codificar mensajes como puntos de éstas.
Las principales referencias consultadas para el capítulo 1 han sido [13], especialmente para
la base necesaria de geometría algebraica, y [16], para la demostración de la asociatividad de la
suma de puntos sobre una curva elíptica. El estudio de las aplicaciones criptográficas del DLP,
así como de los posibles ataques a dicho problema, se ha basado fundamentalmente en [16], [9],
[4], [6] y [1]. Para el ataque Xedni Calculus se han utilizado los artículos originales, [12] y [3].

2
1. Curvas elípticas. Definición y ley de grupo.
En este capítulo se introducen el concepto de curva elíptica y un modelo para dicho tipo de
curvas, la ecuación de Weierstrass. También se demuestra que los puntos racionales de una curva
elíptica forman un grupo abeliano, característica explotada en la criptografía. En el apéndice
A se proporciona un resumen de los conceptos de geometría algebraica necesarios para este
capítulo.
Denotaremos por K un cuerpo perfecto y por K una clausura algebraica (fija) de K.

1.1 Definición. Ecuación de Weierstrass.


Definición 1.1. Una curva elíptica E definida sobre un cuerpo K es una curva algebraica sobre
K, proyectiva, lisa, de género 1 y con un punto P∞ ∈ E(K), que se denomina origen o punto
en el infinito (ver apéndice A).
En la práctica, suele ser más cómodo trabajar con ecuaciones que caractericen los puntos
de tales curvas. Aunque existen varios modelos de ecuaciones para describir curvas elípticas,
presentaremos sólo el más extendido: la ecuación de Weierstrass.
Definición 1.2. Una ecuación de Weierstrass es una ecuación de la forma

Y 2 Z + a1 XY Z + a3 Y Z 2 = X 3 + a2 X 2 Z + a4 XZ 2 + a6 Z 3 , (1.1.1)

donde los coeficientes a1 , . . . , a6 pertenecen a un cuerpo K. Una ecuación de este tipo define
una curva C en P2 . Si a1 , . . . , a6 ∈ K, diremos que C está definida sobre K.
Los puntos afines de la curva C son aquellos cuya coordenada Z es no nula. Tomando Z = 0,
la ecuación se reduce a X 3 = 0, que implica X = 0. Como las coordenadas X, Y , Z no pueden
ser todas nulas, deducimos que [0, 1, 0] es el único punto de la curva con Z = 0. Llamaremos a
[0, 1, 0] punto en el infinito, y lo denotaremos como P∞ .
Observación. Todas las rectas afines verticales pasan por P∞ .
Observación. Para aligerar la notación, normalmente se escribe la versión afín de la ecuación
de Weierstrass, utilizando como coordenadas no homogéneas x = X/Z e y = Y /Z. Así,

C : y 2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6 . (1.1.2)

Cuando se utiliza esta notación para representar la curva proyectiva C, es importante no olvidar
que el punto en el infinito P∞ = [0, 1, 0] sigue formando parte de la misma.
A la ecuación de Weierstrass 1.1.2 se le asocian las siguientes cantidades:

b2 = a21 + 4a2 b8 = a21 a6 + 4a2 a6 − a1 a3 a4 + a2 a23 − a24


b4 = 2a4 + a1 a3 ∆ = −b22 b8 − 8b34 − 27b26 + 9b2 b4 b6
b6 = a23 + 4a6

3
Definición 1.3. La cantidad ∆ se denomina discriminante de la ecuación de Weierstrass.

Definición 1.4. La forma diferencial invariante asociada a la ecuación de Weierstrass,


denotada ω, se define como

dx dy
ω= = 2 .
2y + a1 x + a3 3x + 2a2 x + a4 − a1 y

Si char(K) 6= 2, podemos realizar el cambio y = 21 (y − a1 x − a3 ), que transforma 1.1.2 en

C : y 2 = 4x3 + b2 x2 + 2b4 x + b6 .

x−3b2 y
Si además char(K) 6= 3, el cambio x = 36
, y= 108
da lugar a

C : y 2 = x3 + Ax + B,

donde A = −27(b22 − 24b4 ) y B = −54(−b32 + 36b2 b4 − 216b6 ).


Para que una ecuación de Weierstrass pueda definir una curva elíptica, hay que garantizar
la ausencia de puntos singulares, para lo cual se estudia el valor de ∆.

Lema 1.1. Sea C la curva dada por una ecuación de la forma 1.1.1. Entonces C no es singular
en P∞ .

Demostración. Como C está dada por la ecuación homogénea

F (X, Y, Z) = Y 2 Z + a1 XY Z + a3 Y Z 2 − X 3 − a2 X 2 Z − a4 XZ 2 − a6 Z 3 = 0,

∂F
basta comprobar que ∂Z
(P∞ ) = 1 6= 0.

Proposición 1.1. La curva C dada por una ecuación de Weierstrass sobre K es no singular
si y sólo si ∆ 6= 0.
Si C es singular, lo es en un único punto.

Demostración. Gracias al lema 1.1, podemos trabajar en coordenadas afines. Por simplicidad
supondremos que char(K) 6= 2, lo que nos permite utilizar la ecuación reducida

C : f (x, y) = y 2 − 4x3 − b2 x2 − 2b4 x − b6 = 0.

C es singular si y sólo si existe (x0 , y0 ) ∈ C tal que

2y0 = 12x20 + 2b2 x0 + 2b4 = 0,

es decir, un punto (x0 , 0) con x0 una raíz doble de 4x3 + b2 x2 + 2b4 x + b6 = 0. Dicho polinomio
cúbico tiene una raíz doble si y sólo si su discriminante, que es 16∆, se hace cero. Además, no
puede tener dos raíces dobles, luego C tiene a lo sumo un punto singular.

La proposición 1.2 permite establecer una equivalencia entre curvas elípticas y curvas dadas
por una ecuación de Weierstrass. Necesitaremos el siguiente lema (proposición III.1.5 de [13]).

4
Lema 1.2. Sea C una curva suave definida mediante una ecuación de Weierstrass. Entonces
la forma diferencial invariante ω asociada a dicha ecuación es regular y libre de ceros (es decir,
div(ω) = 0).
Proposición 1.2. Sea E una curva elíptica definida sobre un cuerpo K.
(a) Existen funciones x, y ∈ K tales que la aplicación

φ : E → P2
P 7→ [x(P ), y(P ), 1]
P∞ 7→ [0, 1, 0]

es un isomorfismo entre E/K y una curva definida por una ecuación de Weierstrass

C : Y 2 + a1 XY + a3 Y = X 3 + a2 X 2 + a4 X + a6 ,

con coeficientes a1 , . . . , a6 ∈ K.

(b) Si C es una curva lisa dada por una ecuación de Weierstrass, entonces C es una curva
elíptica definida sobre K con origen [0, 1, 0].
Demostración. (a) Consideramos los espacios vectoriales L(nP∞ ), para n ≥ 1. Aplicando el
Teorema de Riemann-Roch (concretamente A.1 (c) con g = 1), tenemos que

l(nP∞ ) = dim L(nP∞ ) = n para todo n ≥ 1.

Como l(P∞ ) = 1 y K ⊂ L(P∞ ), no hay funciones sobre E con un único polo simple.
Al ser l(2P∞ ) = 2 y l(3P∞ ) = 3, podemos escoger funciones x, y ∈ K(E) tales que {1, x}
sea una base de L(2P∞ ) y {1, x, y} de L(3P∞ ). Lo que es más, la proposición II.5.8 de [13]
garantiza que podemos escoger x, y ∈ K(E). Nótese que x tiene que tener un polo de orden
exactamente 2 en P∞ , e y un polo de orden exactamente 3 en el mismo punto.
Las siete funciones 1, x, y, x2 , xy, x3 e y 2 pertenecen a L(6P∞ ), que tiene dimensión 6. Por
tanto, es posible establecer una relación lineal no trivial entre ellas:

A1 + A2 x + A3 y + A4 x2 + A5 xy + A6 y 2 + A7 x3 = 0,

con A1 , . . . , A7 ∈ K (donde hemos vuelto a utilizar II.5.8 de [13]). Además, A6 A7 6= 0, puesto


que de lo contrario obtendríamos la relación lineal trivial, ya que cada término restante tendría
un polo de orden distinto en P∞ .
Haciendo el cambio x = −A6 A7 x, y = A6 A27 y y dividiendo el resultado entre A36 A47 ,
obtenemos una ecuación de Weierstrass. Los resultados II.2.1 y II.2.3 de [13] garantizan que la
transformación φ con x e y así definidos es un morfismo, así como que φ(P∞ ) = [0, 1, 0].
(b) C es lisa y tiene un punto racional [0, 1, 0], luego sólo falta ver que su género g es 1. Por
el lema 1.2 tenemos que div(ω) = 0, así que utilizando A.1 (b) con KC = ω, obtenemos

0 = deg(KC ) = 2g − 2 ⇒ g = 1.

5
1.2 Ley de grupo.
Sea E una curva elíptica definida sobre K mediante una ecuación de la forma 1.1.2. El
conjunto de puntos K-racionales de E es E(K) = {(a, b) ∈ E : a, b ∈ K} ∪ {P∞ }.
Nuestro objetivo será dotar al conjunto E(K) de estructura de grupo (abeliano), para lo
cual partiremos del siguiente resultado.

Teorema 1.1 (Teorema de Bézout). Sean C1 y C2 dos curvas planas proyectivas de grados
respectivos m y n, sin ninguna componente común. Entonces C1 y C2 se cortan en exactamente
mn puntos, contando multiplicidades.

Aplicando el teorema anterior con C1 = E y C2 = L, donde L ⊂ P2 es una recta proyectiva,


obtenemos que E y L se cortan en exactamente tres puntos, contando sus multiplicidades.

Lema 1.3. Sea E una curva elíptica definida sobre un cuerpo K. Sea L una recta que corta a
E en dos puntos P y Q pertenecientes a E(K) (o una recta tangente a E en el punto racional
P ). Entonces el tercer punto de corte de L y E es también racional.

Demostración. Por simplicidad, sólo daremos la prueba para char(K) 6= 2, 3. Así, E viene dada
por una ecuación de la forma y 2 = x3 + ax + b, con a, b ∈ K. Podemos suponer que P y Q son
distintos de P∞ (si no lo son, el resultado es trivial) y escribir P = (x1 , y1 ) y Q = (x2 , y2 ).
Supongamos en primer lugar que x1 6= x2 . Entonces la recta que pasa por P y Q no
−y1
es vertical, y por tanto podemos escribirla como y = αx + β, con α = xy22 −x 1
∈ K y
2 3
β = y1 − αx1 ∈ K. La ecuación (αx + β) = x + ax + b tiene exactamente 3 raíces en
K, dos de las cuales son x1 y x2 . Denotamos por x3 la tercera raíz.

(αx + β)2 = x3 + ax + b ⇔ x3 − α2 x2 + (a − 2αβ)x + (b − β 2 ) = 0.

El primer término de la segunda igualdad se puede escribir como

(x − x1 )(x − x2 )(x − x3 ) = x3 − (x1 + x2 + x3 )x2 + (x1 x2 + x1 x3 + x2 x3 )x − x1 x2 x3 .

Igualando coeficientes tenemos que x3 = α2 − x1 − x2 ∈ K, ya que x1 , x2 , α2 ∈ K. Además,


como β ∈ K, tenemos que y3 = αx3 + β ∈ K.
Supongamos ahora que x1 = x2 . Pueden darse dos casos:

1. Q 6= P , o Q = P y la tangente a la curva en P es vertical. Entonces la recta que une P


y Q es vertical, y por lo tanto P∞ , que es un punto racional, es el tercer punto de corte.

2. Q = P y la tangente a la curva en P no es vertical. Es decir, x1 es una raíz doble de


(αx + β)2 = x3 + ax + b, siendo y = αx + β la recta tangente a E en el punto P . Para
calcular α derivamos implícitamente en la ecuación y 2 = x3 + ax + b:

3x2 + a 3x2 + a
2yy 0 = 3x2 + a ⇒ y 0 = ⇒ α= 1 ∈ K.
2y 2y1

6
Nótese que se cumple y1 6= 0, pues de lo contrario la recta sería verticcal. Por lo tanto,
despejando como en el primer caso tenemos:
!2 ! ! !
3x21 + a 3x21 + a 3x21 + a
x3 = − 2x1 ∈ K, y3 = x3 + y1 − x1 ∈ K
2y1 2y1 2y1

Definición 1.5 (Ley de grupo). Sean P, Q ∈ E y sea L la recta que pasa por P y Q (o la
línea tangente a E en P , si P = Q). Denotamos por R el tercer punto de corte de E y L. Sea
L0 la recta que pasa por R y P∞ . Entonces P + Q es el tercer punto de corte de E y L0 .

La existencia de P + Q como elemento de E está garantizada por el Teorema de Bézout. Si


P y Q son puntos racionales, entonces el lema 1.3 garantiza además que P + Q ∈ E(K). De
este modo, la suma P + Q es una operación interna sobre E(K).

Proposición 1.3. La adición de puntos en una curva elíptica E según la definición 1.5 es una
operación interna que satisface las siguientes propiedades:

(1) Asociatividad: (P1 + P2 ) + P3 = P1 + (P2 + P3 ) para todos P1 , P2 , P3 ∈ E.

(2) Existencia de neutro: P + P∞ = P para todo P ∈ E.

(3) Existencia de inversos: Dado P ∈ E, existe R ∈ E tal que P + R = P∞ . Dicho R se denota


usualmente como −P , y es el tercer punto de corte con E de la recta que une P y P∞ .

(4) Conmutatividad: P1 + P2 = P2 + P1 para todos P1 , P2 ∈ E.

Es decir, los puntos de E forman un grupo abeliano aditivo, cuyo neutro es el punto P∞ .

Demostración. (1) La demostración de la propiedad asociativa requiere un lema geométrico


previo, y se presenta al final de la sección.
(2) Sea L la recta que corta a E en P y P∞ , y sea R el tercer punto de corte de E y L.
Entonces la recta L0 que pasa por R y P∞ coincide con L, y por tanto comparte los puntos de
intersección con E de ésta. Se sigue que el punto P + P∞ debe coincidir con P .
(3) Sea L una recta proyectiva que interseca a E en los puntos P , Q y R. Entonces, aplicando
dos veces la definición de suma de puntos tenemos que (P + Q) + R = P∞ . Tomando Q = P∞
y aplicando (2), obtenemos P∞ = (P + P∞ ) + R = P + R.
(4) La conmutatividad es obvia, ya que la recta que pasa por P1 y P2 es la misma que pasa
por P2 y P1 .

Observación. Aplicando el lema 1.3 con P un punto racional y Q = P∞ ∈ E(K), obtenemos


que −P es también un punto racional.

Observación. El lema 1.3 garantiza que E(K) es un subgrupo de E.

Para demostrar la asociatividad de la operación 1.5 partiremos del siguiente resultado, cuya
prueba completa puede consultarse en la sección 2.4 de [16].

7
Teorema 1.2. Sea C(X, Y, Z) un polinomio cúbico homogéneo, y sea C la curva de P2 descrita
por la ecuación C(X, Y, Z) = 0. Sean l1 , l2 , l3 , m1 , m2 , m3 rectas proyectivas tales que li 6= mj
para 1 ≤ i, j ≤ 3. Denotamos por Pij el punto en que se cortan las rectas li y mj .
Supongamos que Pij es un punto no singular de C para todo (i, j) 6= (3, 3). Además, si k ≥ 2
de los puntos Pi1 , Pi2 , Pi3 coinciden para algún i, exigimos que li corte a C con multiplicidad
al menos k en dicho punto. Análogamente, si k ≥ 2 de los puntos P1j , P2j , P3j coinciden para
algún j, exigimos que mj corte a C con multiplicidad al menos k en dicho punto. Entonces, el
punto P33 también pertenece a la curva C.

Veamos cómo aplicar este resultado para probar la asociatividad de la suma. Sea E una
curva elíptica y sean P , Q y R tres puntos pertenecientes a E. Denotando por A, B a la recta
que pasa por los puntos A y B (o a la tangente a la curva en A si A = B),definimos

l1 = P, Q, l2 = P∞ , Q + R, l3 = R, P + Q
m1 = Q, R, m2 = P∞ , P + Q, m3 = P, Q + R.

Tenemos las siguientes intersecciones entre dichas rectas:

l1 l2 l3
m1 Q −(Q + R) R
m2 −(P + Q) P∞ P +Q
m3 P (Q + R) X

Tabla 1.1: Puntos de corte.

Supongamos en primer lugar que se cumplen todas las hipótesis del teorema 1.2. En ese
caso, todos los puntos de la tabla 1.1 pertenecen a E, incluyendo el punto X. La recta l3
corta a E en los puntos R, P + Q y X, de forma que aplicando la definición de suma se obtiene
X = −((P + Q) + R). Haciendo lo análogo para m3 , obtenemos X = −(P + (Q + R)). Igualando
las expresiones y tomando inversos, obtenemos que (P +Q)+R = P +(Q+R), como queríamos
probar.
Falta por tanto verificar las hipótesis del teorema, es decir, que las multiplicidades de las
intersecciones son correctas y que ninguna línea li coincide con ninguna mj .
Para la primera de éstas, sólo tenemos que asegurarnos de que el punto en el infinito no
causa problemas. Nótese que la recta tangente a E en P∞ es Z = 0, que sólo corta a E en P∞ ,
con multiplicidad 3. Por tanto, si dos entradas de alguna fila o columna de la tabla son iguales
a P∞ , también lo es la tercera, luego la recta correspondiente interseca a E con orden 3 en P∞ .
Si li = mj para algunos i, j, el teorema 1.2 no es aplicable. Sin embargo, la comprobación
de la asociatividad en estos 9 casos es sencilla, y sólo requiere utilizar la conmutatividad de la
suma, la igualdad (P1 + P2 ) − P2 = P1 y el hecho de que tres puntos colineares de E suman P∞ .

8
2. El problema del logaritmo discreto en grupos cíclicos.
La criptografía asimétrica o de clave pública se basa en el uso de funciones de un solo sentido,
es decir, de funciones cuyo cálculo es fácil pero cuya inversa es difícil calcular sin disponer de
información adicional. El objetivo de este capítulo es mostrar que la exponenciación en un
grupo cíclico finito es, en general, una de estas funciones.

Definición 2.1. Sea G un grupo finito, b un elemento de G e y una potencia de b. El logaritmo


discreto de y en base b es cualquier entero n tal que bn = y.

Definición 2.2. El problema del logaritmo discreto, abreviado DLP, consiste en, dado un grupo
finito G, un elemento b ∈ G y un y ∈ hbi, encontrar el logaritmo discreto de y en base b.

Observación. Si se utiliza notación aditiva, el equivalente a la exponenciación es el producto


de un elemento del grupo por un número entero. En este caso, se tiene que el logaritmo discreto
de y en base b es cualquier entero n tal que n · b = y.

Si la base b es un generador de G, el logaritmo discreto estará definido para todos los


elementos de G; de lo contrario, sólo para aquellos pertenecientes al subgrupo hbi. Para facilitar
la exposición, y salvo que se indique expresamente lo contrario, asumiremos que la base b para
la cual se calculan los logaritmos es siempre un generador del grupo G. Es decir, restringiremos
nuestro análisis al caso en que el grupo G es cíclico.
Al decir que la exponenciación modular es fácil, nos referimos a que existe un algoritmo
polinomial en el tamaño del problema para llevarla a cabo. Un posible algoritmo es el método
de cuadrados iterados, que se describe a continuación.
Sea G un grupo cíclico finito multiplicativo, b un generador del grupo y n un entero positivo.
Típicamente, tanto n como el orden del grupo serán muy grandes. Para calcular bn se utiliza el
siguiente algoritmo:

Expresar n = k−1 i
P
i=0 ni 2
aux ← g
potencia ← 1
for i = 0 to k - 1 do
if ni = 1 then
potencia = potencia · aux
end if
aux = aux · aux
end for
return potencia
Algoritmo 2.1: Exponenciación modular mediante cuadrados iterados.

Para calcular el coste del algoritmo, consideramos como operación básica la multiplicación de
dos elementos del grupo. En cada paso del bucle principal se realizan una o dos multiplicaciones
de este tipo, y en total se entra k = blog2 (n) + 1c veces al bucle. En consecuencia, el número
total de multiplicaciones es O(log2 (n)), es decir, lineal en el número de bits de n.

9
El coste temporal dependerá por tanto del coste de multiplicar dos elementos del grupo.
Por ejemplo, fijemos un b ∈ U (Z/mZ) y consideremos G = hbi. Si b < m y siempre que se
realiza un producto se reduce inmediatamente después módulo m, el coste de cada producto
será O(log22 (m2 )) = O(log22 (m)), lo cual da un coste global de O(log2 (n) log22 (m)) al algoritmo.
Además, por el Pequeño Teorema de Fermat sabemos que bφ(m) = 1 para cualquier b ∈ G.
Por tanto, si el exponente n es mayor que φ(m), y conocemos este último, utilizaremos
como exponente n mód φ(m). Así, como n mód φ(m) < φ(m) < m, la estimación temporal
O(log2 (n) log22 (m)) puede reemplazarse por O(log32 (m)).
En general, si el producto de dos elementos del grupo G no es muy costoso, la exponenciación
podrá llevarse a cabo de manera eficiente. Por el contrario, la dificultad del problema del
logaritmo discreto varía enormemente dependiendo del grupo cíclico y el generador escogidos.
Por ejemplo, si G = Z/mZ con la suma y la base elegida es b = 1, el problema del logaritmo
discreto es trivial: dado un x ∈ G, dicho x visto como entero es su propio logaritmo discreto.
Claramente se trata de un caso extremo pero, dado que todos los grupos cíclicos finitos del
mismo orden son isomorfos entre sí, ¿no sería posible reducir el problema del logaritmo discreto
en un grupo cíclico cualquiera de tamaño m a este problema sencillo?
Afortunadamente para la criptografía, la respuesta es no. Para ver que un grupo cíclico
G = hgi de tamaño m es isomorfo a Z/mZ con la suma, se utiliza la aplicación

ϕ : Z/mZ → G
n 7→ g n

Sin embargo, para reducir el problema al caso sencillo, tendríamos que hacer explícito el
isomorfismo inverso. Pero eso sería, precisamente, resolver el problema del logaritmo discreto
en el grupo G para la base g.
Para dar una intuición de por qué dicho problema es difícil, mostramos en la figura 2.1 la
gráfica de la función 3n sobre F∗1231 . Observamos que dicha exponencial tiene apariencia caótica,
a diferencia de lo que ocurre en los reales.

Figura 2.1: Gráfica de la función 3n sobre F∗1231 .

10
3. Aplicaciones criptográficas del problema del logaritmo
discreto.
A lo largo de este capítulo se describen varios esquemas de criptografía pública basados en el
problema del logaritmo discreto. Aunque originalmente estos criptosistemas se definieron sobre
el grupo de unidades de un cuerpo finito, aquí presentaremos su versión adaptada a curvas
elípticas, utilizando por tanto notación aditiva.
La razón de utilizar curvas elípticas en criptografía es que éstas permiten alcanzar un mayor
nivel de seguridad utilizando claves más pequeñas que los criptosistemas públicos tradicionales.
Por ejemplo, se estima que para obtener el mismo nivel de seguridad que un sistema RSA con
clave de 4096 bits, basta utilizar una clave de 313 bits en un sistema basado en curvas elípticas.
Con una clave de 160 bits en este último, se obtiene un nivel de seguridad comparable al de un
sistema RSA con clave de 1375 bits, o al de un sistema con clave de 1369 bits cuya seguridad
se base en el DLP sobre un cuerpo finito ([5]).
Esta diferencia en seguridad se debe a que se conocen algoritmos subexponenciales para
romper el problema del logaritmo discreto en F∗q , como el ataque Index Calculus descrito en
la sección 5.1, mientras que no existen ataques equivalentes para curvas elípticas generales.
Sin embargo, para determinadas curvas elípticas sí existen ataques que permiten reducir el
problema del logaritmo discreto en E(Fq ) a uno en F∗q ; por tanto, para conseguir un aumento
efectivo de la seguridad, habrá que evitar dicho tipo de curvas.
Para mayor generalidad, en los esquemas descritos a continuación hemos supuesto que son
los propios usuarios quienes eligen el cuerpo Fq y la curva E(Fq ) que se utilizarán. Cuando el
esquema requiere seleccionar un punto P ∈ E(Fq ) que genere un subgrupo de tamaño grande
(y típicamente primo), también suponemos que es responsabilidad de los usuarios acordarlo.
En la práctica, normalmente se utilizan las curvas recomendadas por el Instituto Nacional
de Estándares y Tecnología de Estados Unidos (NIST). Este organismo propone varias curvas
estándar, indicando para cada una su ecuación de Weierstrass, el tamaño del cuerpo sobre el
que está definida, el punto a utilizar como base para calcular logaritmos y el orden de éste ([7]).

3.1 Intercambio de claves de Diffie-Hellman.


Los criptosistemas de clave pública son mucho más lentos que los criptosistemas simétricos,
por lo que no es común utilizarlos para cifrar comunicaciones completas, sino combinarlos con
un criptosistema simétrico para proveer determinados servicios.
Uno de los usos más típicos de la criptografía asimétrica consiste en permitir que los usuarios
de un criptosistema de clave simétrica acuerden de manera segura la clave a utilizar. El primer
sistema de intercambio de claves fue propuesto por Whitfield Diffie y Martin Hellman en 1976,
y originalmente se implementó sobre grupos cíclicos de la forma F∗p , con p primo.
Supongamos que A y B son dos usuarios de un criptosistema simétrico que desean acordar
una clave numérica para cifrar sus comunicaciones. Para ello, pueden seguir el siguiente proceso:

11
1: A y B fijan una curva elíptica E sobre un cuerpo Fq tal que el DLP sea difícil en E(Fq ), así
como un punto P ∈ E(Fq ) cuyo orden sea grande (típicamente, E y P se escogen de forma
que dicho orden sea primo). E, Fq y P son de dominio público.
2: A escoge un entero a, calcula Ka = aP y envía dicho valor a B.
3: B escoge un entero b, calcula Kb = bP y envía dicho valor a A.
4: A calcula K = aKb = abP .
5: B calcula K = bKa = baP .
6: A y B obtienen una clave numérica a partir de K, utilizando un método preestablecido.
Como K = baP = abP , A y B obtendrán la misma clave. El número total de claves depende
de |hP i| y de cómo se extraiga la clave a partir de K, y habrá que asegurar que sea lo bastante
grande para impedir un ataque por fuerza bruta sobre el criptosistema simétrico.
Incluso si un atacante intercepta los mensajes intercambiados por A y B, sólo conocerá la
curva E, el cuerpo Fq y los puntos P , aP y bP . Por tanto, para calcular la clave deberá resolver
el problema de Diffie-Hellman: dados P , aP y bP en E(Fq ), obtener el punto abP .
Si el atacante puede resolver el problema del logaritmo discreto en E(Fq ), claramente puede
obtener a a partir de P y aP y utilizarlo para calcular K tal y como hizo A. Se conjetura que
en realidad ambos problemas son igual de difíciles.

3.2 Criptosistema de Massey-Omura.


Un criptosistema de clave pública para el intercambio de mensajes, y no sólo de
claves, que basa su seguridad en el DLP es el criptosistema de Massey-Omura. Aunque
parte de una idea similar a la del algoritmo de Diffie-Hellman, este sistema no requiere
intercambiar claves, aunque sí dos intercambios de mensajes. A continuación se describe su
funcionamiento:
1: A y B fijan una curva elíptica E sobre un cuerpo finito Fq tal que el DLP sea difícil en
E(Fq ). Denotamos por N el orden de E(Fq ).
2: A representa el mensaje a enviar como un punto M ∈ E(Fq ), siguiendo un mecanismo como
el descrito en la sección C.2.
3: A escoge un entero secreto mA ∈ U (Z/N Z), calcula P1 = mA M y envía dicho valor a B.
4: B escoge un entero secreto mB ∈ U (Z/N Z), calcula P2 = mB P1 y envía dicho valor a A.
5: A calcula m−1A mód N y envía P3 = m−1
A P2 a B.
6: B calcula mB mód N y obtiene P4 = m−1
−1
B P3 .

Veamos que el valor P4 obtenido finalmente por B se corresponde con el punto asociado al
mensaje original. Como la suma en E(Fq ) es conmutativa, se cumple

P4 = m−1 −1 −1 −1
B mA mB mA M = mB mB mA mA M.

Tenemos que justificar que mA y m−1


A se cancelan en la expresión anterior (en dicho caso, lo
−1
mismo será cierto para mB y mB , obteniéndose así el resultado deseado).

12
Por definición de m−1 −1
A , se tiene que mA mA = 1 + kN , para k ∈ Z. Como N = |E(Fq )|, por
el teorema de Lagrange se tiene que N R = P∞ para todo R ∈ E(Fq ). Por lo tanto,

m−1
A mA M = (1 + kN )M = M + kN M = M + P∞ = M, (3.2.1)

como queríamos demostrar.


Es importante recalcar que, para utilizar este método, es necesario calcular el orden de
E(Fq ). Para ello, es posible utilizar el algoritmo de Schoof, que es polinomial en el número de
bits de q; concretamente, su complejidad es O(log8 q). Aunque este cálculo no sea muy rápido,
sólo es necesario realizarlo una vez al establecer el protocolo, y por tanto no repercute en el
tiempo necesario para intercambiar mensajes cifrados.

Observación. Para utilizar este criptosistema, es imprescindible disponer de un buen


mecanismo de autenticación. De no ser así, cualquier persona C podría hacerse pasar por B,
obteniendo los mensajes destinados a éste, o enviar mensajes fingiendo que proceden de A.

3.3 Criptosistema de Elgamal.


El método de encriptación de Elgamal fue propuesto por Taher Elgamal en 1984. Para poder
recibir mensajes, un usuario B debe comenzar por generar una pareja de claves.
En primer lugar, B escoge un cuerpo finito Fq , una curva E(Fq ) sobre la que el DLP sea
difícil y un punto PB ∈ E(Fq ), típicamente con orden primo grande. Por último, escoge un
entero s y calcula QB = sPB . La clave pública de B es (Fq , E(Fq ), PB , QB ), y la privada es s.
Conociendo la clave pública de B, A puede enviarle mensajes del siguiente modo:
1: A expresa el mensaje como un punto M ∈ E(Fq ), utilizando el método de la sección C.2.
2: A selecciona un entero aleatorio k y calcula M1 = kPB .
3: A calcula M2 = M + kQB .
4: A envía (M1 , M2 ) a B.
Para descifrar el mensaje recibido, B calcula

M2 − sM1 = (M + kQB ) − skPB = (M + ksPB ) − skPB = M.

Un atacante E sólo tiene acceso a la clave pública de B y a los puntos M1 y M2 . Si E puede


resolver el DLP en E(Fq ), entonces puede obtener s a partir de PB y QB o k a partir de M1
y PB ; cualquiera de estos valores le permite recuperar el mensaje original. En caso contrario,
parece imposible que E pueda atacar el sistema sólo con la información de que dispone.
Una observación importante es que el entero k utilizado en el paso 2 debe ser aleatorio y
distinto en cada envío de mensajes. De no ser así, M1 sería el mismo en todos los mensajes
0 0
cifrados y, conociendo dos mensajes (M1 , M2 ), (M1 , M2 ), E obtendría M2 − M2 = M 0 − M . Así,
si E conociera uno de los mensajes en claro, inmediatamente podría recuperar el otro.

13
3.4 Esquema de firma digital de Elgamal.
En algunas aplicaciones informáticas, es fundamental garantizar que el emisor de un mensaje
sea realmente quien dice ser. Para ello, es necesario proporcionar un protocolo de firma digital.
Además, al igual que las firmas tradicionales van asociadas a una hoja de papel concreta, es
necesario ligar cada firma digital a un único documento, pues de lo contrario cualquier usuario
que reciba un mensaje firmado por A podrá suplantarlo en cualquier comunicación posterior.
A continuación se describe un esquema de firma digital ideado por Taher Elgamal, en el que
se utiliza el problema del logaritmo discreto para proveer autenticación del emisor.
Antes de poder firmar mensajes, un usuario A debe generar una pareja de claves. Para ello,
elige una curva E sobre un cuerpo Fq de modo que el DLP sobre E(Fq ) sea difícil, un punto
PA ∈ E(Fq ) cuyo orden N suele ser un primo grande, y un entero secreto s, y calcula QA = sPA .
Además, A debe seleccionar una función f : E(Fq ) → Z cuya imagen sea grande y tal que
cada elemento de ésta tenga un número pequeño de preimágenes. Un ejemplo de función con
dichas propiedades es f (x, y) = x (es decir, la primera proyección interpretada como un entero),
para la cual como mucho dos puntos de E producen la misma salida.
La clave pública de A es (Fq , E(Fq ), f, PA , QA ) y su clave privada es el entero s. Para firmar
un mensaje, A hace lo siguiente:
1: A representa el mensaje, o una función hash 1 del mismo, como un entero 0 ≤ m < N .
2: A escoge un entero aleatorio k ∈ U (Z/N Z) y calcula R = kPA .
3: A calcula a ≡ k −1 (m − sf (R)) mód N .
4: La firma del mensaje es el par (R, a). A envía a B el mensaje firmado (m, R, a).

Nótese que este esquema no proporciona confidencialidad, ya que el mensaje se envía en


texto plano. Por tanto, resulta útil para firmar documentos de carácter público, tales como
contratos o escrituras. Si, por el contrario, se desea que la comunicación sea confidencial, será
necesario utilizar algún criptosistema para cifrar el mensaje antes de generar la firma.
Para verificar el origen del mensaje, el receptor B hace lo siguiente:
1: B calcula V1 = f (R)QA + aR y V2 = mPA .
2: Si V1 = V2 , B acepta la firma.

Comprobemos que si la firma es válida se cumple que V1 = V2 . Para ello, comenzaremos por
probar que kV1 = kV2 :

a ≡ k −1 (m − sf (R)) mód N ⇔ ka ≡ m − sf (R) mód N


1
Una función hash H es una función que recibe entradas de longitud arbitraria y produce salidas de longitud
fija. Además, debe tener las siguientes propiedades:

1) Dado un mensaje m, el cálculo de H(m) debe ser muy rápido.

2) Dado y, es computacionalmente imposible encontrar m con H(m) = y.

3) Es computacionalmente imposible encontrar mensajes m1 y m2 con H(m1 ) = H(m2 ).

14
Por tanto, existe l ∈ Z tal que ka = m − sf (R) + lN , de forma que se cumple:

kV1 = k(f (R)QA + aR) = kf (R)QA + kaR =


= kf (R)QA + (m − sf (R) + lN )R = kf (R)QA + mR − sf (R)R + lN R =
= kf (R)sPA + mkPA − sf (R)kPA + klN PA = kf (R)sPA + mkPA − sf (R)kPA + P∞ =
= kf (R)sPA + kmPA − kf (R)sPA = kmPA = kV2 .

Para finalizar, observamos que kV1 = kV2 ⇒ k −1 kV1 = k −1 kV2 . Entonces, utilizando la
ecuación 3.2.1, deducimos que V1 = V2 , como queríamos demostrar.
Si un atacante E fuese capaz de calcular logaritmos discretos, entonces podría recuperar s
a partir de los puntos PA y QA , tras lo cual estaría en disposición de hacerse pasar por A.
Otra posibilidad sería, tras interceptar una firma (m, R, a), utilizar los puntos R = kPA
y PA para obtener el entero k, y después resolver la congruencia ka ≡ m − sf (R) mód N
para encontrar s. Dicha congruencia tiene d = mcd(f (R), N ) soluciones, de forma que si d es
pequeño, E puede probar con cada una hasta encontrar el valor s para el que sPA = QA .
Sin embargo, podría no ser necesario saber calcular logaritmos discretos para hacerse pasar
por A: dado un mensaje m, basta producir una pareja (R, a) para la cual se satisfaga la ecuación
V1 = V2 . Es decir, E necesita encontrar un punto R y un entero a que verifiquen

f (R)QA + aR = mPA .

En este punto, E tiene dos opciones: elegir un R y resolver el problema del logaritmo discreto
para encontrar a, o bien fijar a y tratar de encontrar un R = (x, y) para el que se dé la igualdad.
En principio, este problema parece al menos tan complejo como el del logaritmo discreto, aunque
no se ha estudiado con tanta profundidad. Tampoco ha podido descartarse la existencia de un
método que permita obtener R y a simultáneamente. La creencia general es que la seguridad
del sistema de firma de Elgamal es muy próxima a la del DLP sobre el grupo E(Fq ).
Por último, veamos que escoger el entero k de forma aleatoria para cada nueva firma es
esencial para la seguridad del sistema. Si A utiliza el mismo k para cifrar m y m0 , E lo percibe
de inmediato, ya que R coincide en los dos mensajes firmados (m, R, a) y (m0 , R, a0 ). A partir
de dichos mensajes firmados, E plantea el siguiente sistema de congruencias:

ka ≡ m − sf (R) mód N
ka0 ≡ m0 − sf (R) mód N,

del que restando obtiene


k(a − a0 ) = (m − m0 ) mód N.

Entonces, hay d = mcd(a − a0 , N ) posibles valores para k, de modo que E puede ir probando
todos ellos hasta que alguno verifique R = kPA . Como hemos visto antes, conociendo k es
posible calcular s, y por tanto falsificar la firma de A en cualquier mensaje.

15
3.5 Algoritmo de firma digital sobre curvas elípticas (ECDSA).
Existe una variante del sistema de firma de Elgamal, llamada algoritmo de firma digital
(DSA), en la cual se basa el estándar de firma digital DSS propuesto por el NIST en 1991.
Vamos a ver una adaptacion del algoritmo DSA para curvas elípticas, llamada ECDSA.
A elige un cuerpo Fq y una curva E(Fq ) tal que |E(Fq )| = f r, con r un primo grande y f
un entero pequeño. También escoge un punto PA ∈ E(Fq ) de orden r y un entero secreto s, y
calcula QA = sPA .2 Salvo s, A publica todos los datos anteriores.
El mecanismo para firmar un entero m (por ejemplo, una función hash de un mensaje) es
el siguiente:
1: A escoge un entero aleatorio k ∈ U (Z/rZ) y calcula R = kPA = (x, y).
2: A calcula a = k −1 (m + sx) mód r.
3: A envía a B el mensaje firmado (m, R, a).

Para verificar la firma:


1: B calcula u1 = a−1 m mód r y u2 = a−1 x mód r.3
2: B calcula V = u1 PA + u2 QA .
3: B acepta la firma si V = R.

Si la firma es correcta, se cumple la condición de verificación, ya que:

V = u1 PA + u2 QA = a−1 mPA + a−1 xQA = a−1 (mPA + xsPA ) = a−1 (m + xs)PA = kPA = R.

Al igual que en el sistema de firma de Elgamal, es fundamental escoger un k aleatorio para


cada firma. La ventaja de este algoritmo frente al anterior es que la comprobación de la firma
sólo requiere calcular dos múltiplos de puntos de la curva, frente a los tres del algoritmo original.
Como estas operaciones son las más caras de la comprobación, la mejora de eficiencia resulta
muy notable cuando se van a realizar muchas verificaciones de firmas.

3.6 Esquema de cifrado integrado en curvas elípticas (ECIES).


Este sistema se diferencia de los anteriormente descritos en que proporciona simultánea-
mente los sevicios de confidencialidad y autenticación del mensaje cifrado.
Para generar una pareja de claves, el usuario B elige un cuerpo finito Fq , una curva E(Fq )
en la que el problema del logaritmo discreto sea difícil y un punto PB de la curva, siendo
N = orden(PB ) por lo general un primo grande. Además, elige un entero secreto s, que será su
clave privada. La clave pública de B está formada por (Fq , E(Fq )), N, PB , QB = sPB ).
El algoritmo también utiliza dos funciones hash H1 y H2 , así como una función Ek de cifrado
simétrico (y su correspondiente función de descifrado Dk ). Todas estas funciones son públicas.
2
Para escoger PA , basta con tomar al azar un P̃ ∈ E(Fq ) y comprobar si f P̃ 6= P∞ . Si es así, podemos tomar
PA = f P̃ ; de lo contrario, escogemos un nuevo P̃ .
3
Si m + sx ≡ 0 mód r, no existe a−1 mód r. Para evitar este problema, basta con que A compruebe si es
a invertible y, en caso de no serlo, seleccione un nuevo valor para k.

16
Veamos el procedimiento a seguir para enviar un entero m a B, conociendo su información
pública:
1: A elige un entero aleatorio k tal que 1 ≤ k < N .
2: A calcula los puntos R = kPB y Z = kQB .
3: A evalúa H1 (R, Z) = k1||k2, es decir, interpreta la salida como dos cadenas de bits de
longitudes prefijadas.
4: A utiliza k1 para obtener el mensaje cifrado C = Ek1 (m) y calcula el valor t = H2 (C, k2 ),
que será utilizado por B para validar dicho texto cifrado.
5: A envía a B la tupla (R, C, t).
El proceso de descifrado es el siguiente:
1: B calcula Z = sR(= ksPB = kQB ).
2: B evalúa H1 (R, Z) y escribe la salida como k1||k2.
3: Si H2 (C, k2 ) 6= t, B rechaza el texto cifrado.
4: En otro caso, B calcula m = Dk1 (C).

Como se ha mencionado anteriormente, este sistema permite autenticar los mensajes


(concretamente en el paso 3 del descifrado). Este hecho hace imposible realizar un ataque
0
de texto cifrado escogido: el atacante E puede generar un entero k2 de longitud adecuada
0
y utilizarlo para calcular t0 = H2 (C, k2 ); sin embargo, como la función hash es resistente a
colisiones, la probabilidad de que t = t0 es casi nula, con lo cual, en la práctica, B se limitará a
rechazar el texto cifrado.
Una diferencia de este criptosistema respecto a 3.2 y 3.3 es que el mensaje no se representa
como un punto de la curva elíptica, sino como un entero que se cifra mediante el algoritmo
simétrico Ek . Para textos muy grandes esto supone una ventaja, ya que sólo es necesario operar
con puntos de la curva elíptica para obtener las claves k1 y k2 , después de lo cual todos los
fragmentos del mensaje pueden cifrarse eficientemente.

17
4. Ataques generales al problema del logaritmo discreto.
En este capítulo se describen varios ataques generales al problema del logaritmo discreto.
Estos ataques funcionan sobre grupos cíclicos arbitrarios, pero requieren un tiempo de ejecución
exponencial; por tanto, en la práctica no son útiles sobre grupos de gran tamaño.
Al igual que en el capítulo anterior, utilizaremos notación aditiva. Denotaremos por G el
grupo cíclico sobre el que resolver el problema del logaritmo discreto y por N el orden del mismo.
Usaremos n para denotar el número de bits de N (en particular, n = O(log2 N )). Dados un
generador P de G y un elemento cualquiera Q ∈ G, buscaremos k ∈ Z tal que kP = Q.

4.1 Fuerza bruta.


El algoritmo más sencillo para resolver el problema del logaritmo discreto consiste en ir
calculando los elementos kP , para k = 0, 1, ..., N − 1, hasta dar con el primer entero para
el cual kP = Q. Sin embargo, este algoritmo es lineal en el orden del grupo, y por tanto
exponencial en el número de bits de N . Como consecuencia, si el grupo es de tamaño grande
(como ocurre con los grupos utilizados en criptografía), este ataque deja de ser posible.

4.2 Baby-Step Giant-Step.



Este algoritmo, desarrollado por Daniel Shanks en 1969 ([10]), permite reducir a O( N ) el
número de intentos necesarios para calcular k en el caso peor.
l√ m
En primer lugar, calculamos m = N . Si no conocemos el orden del grupo, pero sí una
l√ m
cota superior M de éste, definimos m = M .
Una vez hecho esto, escribimos k = qm + r, con 0 ≤ q, r < m, y observamos que

kP = Q ⇔ (qm + r)P = Q ⇔ q(mP ) = Q − rP.

Calculamos el conjunto de baby-steps B = {(Q − rP, r), 0 ≤ r < m}. Si encontramos una
pareja de la forma (P∞ , r), entonces tendremos que Q = rP , y por tanto el logaritmo discreto
de Q en base P será igual a r.
De lo contrario, fijamos R = mP y, para q = 1, 2, ..., m − 1, comparamos el giant-step qR
con la primera componente de cada elemento (Q − rP, r) de B. Si coincide con alguna,

qR = Q − rP ⇔ qmP = Q − rP ⇔ Q = (qm + r)P,

de modo que la respuesta del algoritmo será qm + r.


Nótese que, como m2 ≥ N y P es un generador de G, siempre habrá un k en el rango
{0, 1, ..., m2 − 1} tal que kP = R.
Este algoritmo requiere almacenar una tabla de m elementos. Para analizar su coste
temporal, tomaremos la adición (o sustracción) de elementos del grupo como operación básica.

18
Como máximo se calculan m baby-steps, cada uno de los cuales se obtiene restando P al anterior.
A lo sumo se generan m giant-steps, requiriendo cada uno una adición de elementos del grupo.
Además, el algoritmo requiere calcular un múltiplo de un elemento (R = mP ), lo cual es
posible realizando O(log N ) = O(n) sumas si se utiliza el algoritmo 2.1. Por tanto, este último
cálculo resulta despreciable, y el coste global del algoritmo es de O(m) sumas.
√ n
Si m = N , el número de bits de m es O(2 2 ). Por tanto, el algoritmo Baby-Step Giant-
Step es exponencial en n2 , lo cual supone una gran mejora respecto al ataque por fuerza bruta,
exponencial en n.

4.3 Algoritmo rho de Pollard.


En esta sección se describe la versión original del algoritmo rho de Pollard. En primer lugar,
fijamos una partición del grupo G en tres clases, G = G1 tG2 tG3 , de forma que P∞ 6∈ G2 y que
sea fácil comprobar a qué clase pertenece un elemento de G. Definimos una función f : G → G
tal que 




P + R si R ∈ G1 ,

f (R) = 2R si R ∈ G2 ,


Q + R si R ∈ G3 .

Elegimos un x0 ∈ {1, . . . , N } aleatorio y calculamos el punto R0 = x0 P . Definimos la


sucesión
Ri+1 = f (Ri ),

Los elementos de ésta se pueden escribir como Ri = xi P + δi Q, donde


 




xi +1 mód N si Ri ∈ G1 , 



δi mód N si Ri ∈ G1 ,
 
xi+1 = 2xi mód N si Ri ∈ G2 , y δi+1 = 2δi si Ri ∈ G2 ,

 

x si Ri ∈ G3 . δ + 1 mód N si Ri ∈ G3 .
 
i i

Como G es finito, en algún momento se tendrá que Ri+j = Ri , para j > 0. Esto implica

xi+j P + δi+j Q = xi P + δi Q ⇒ (xi − xi+j )P = (δi+j − δi )Q = (δi+j − δi )kP,

de donde se obtiene la congruencia

xi − xi+j ≡ k(δi+j − δi ) mód N.

El valor de k es único si d = (δi+k − δi , N ) = 1. Si la solución no es única pero d es pequeño,


el logaritmo discreto de y puede encontrarse probando con las posibles opciones módulo N . Si
d es demasiado grande, se aplica de nuevo el algoritmo tomando un x0 distinto.
Estudiemos la cantidad de memoria requerida por este ataque. Como G es finito, la sucesión
Ri es periódica tras s iteraciones iniciales, con periodo l. Por tanto, si 2j > máx{s, l}, el intervalo
[2j , . . . , 2j+1 ] contiene un periodo completo, lo que garantiza encontrar una coincidencia. Este
hecho nos permite almacenar sólo las tuplas (Ri , xi , δi ) cuyo índice i sea una potencia de 2.

19
En cada paso mantendremos una única tupla (Ri , xi , δi ) en memoria, que sustituiremos por
(R2i , x2i , δ2i ) al llegar al término R2i de la sucesión.

Por otro lado, vamos a ver que al calcular O( N ) términos de la sucesión, la probabilidad
de encontrar una coincidencia es mayor que 1/2. Sea D(N, t) el suceso de, al hacer t elecciones
equiprobables e independientes de elementos de {1, . . . , N }, obtener t elementos distintos.

N N −1 N −t+1
P (D(N, t)) = · ··· =
N N   N  
1 2 t−1

=1· 1− · 1− ··· 1 − .
N N N

Si N y t son muy grandes, podemos aproximar la probabilidad anterior mediante

1 2 (t−1) t(t−1) t2
e− N e− N · · · e− N = e− 2N ≈ e− 2N .

Por lo tanto, la probabilidad de encontrar al menos una coincidencia en las t selecciones es de


t2
aproximadamente 1 − e− 2N . Igualando dicha expresión a 1/2, obtenemos
s
1 t2 1 t2 1 √
≈ e− 2N ⇔ ln ≈ − ⇔ t≈ −2N ln ≈ N.
2 2 2N 2

Mientras que Baby-Step Giant-Step es determinista, el algoritmo rho de Pollard sólo



responde en tiempo O( N ) con una cierta probabilidad. Sin embargo, éste último método

solamente requiere O(1) memoria, frente al O( N ) empleado por el primero.
En [15] se presentan tres alternativas a la función f , con el objetivo de mejorar la eficiencia
global del método rho de Pollard. La sección 6.3 muestra las diferencias de rendimiento
obtenidas al emplear estas nuevas funciones.

4.4 Algoritmo de Silver-Pohlig-Hellman.


Cuando el orden N de G es suave, es decir, todos sus factores primos son pequeños, existe un
algoritmo eficiente para encontrar logaritmos discretos. Dicho algoritmo fue publicado en 1978
por Stephen Pohlig y Martin Hellman, e independientemente descubierto por Roland Silver.
La idea en que se basa el algoritmo es que, si N = ts=1 pess , donde los ps son primos distintos,
Q

entonces el logaritmo discreto k en base P de Q queda unívocamente determinado módulo N


por las t congruencias k ≡ ks mód pess , donde ks es el logaritmo discreto módulo pess de Q.
Siguiendo la prueba del Teorema Chino del Resto (Proposición I.3.3. de [4]), k puede
calcularse mediante la fórmula
t
X
k= ks ms ns , (4.4.1)
s=1

donde ms = pNses y ns = m−1s mód pess . Veamos cómo calcular los valores ks , para s = 1, . . . , t.
En primer lugar, para cada primo p divisor de N , calculamos las raíces p-ésimas de la
unidad: Rp,j = jNp
P , para j = 1, . . . , p − 1. Nótese que, si la base P está fija, esta tabla puede
precalcularse antes de comenzar el ataque y reutilizarse al calcular el logaritmo discreto de
cualquier Q ∈ G.

20
Fijemos ahora un divisor primo p = ps de N y denotemos e = es . Escribimos

k ≡ k0 + k1 p + · · · + ke−1 pe−1 mód pe , con 0 ≤ ki < p.

Nuestro objetivo es calcular los e coeficientes ki que determinan k módulo pe .


Para determinar k0 , comenzamos por calcular Np Q. Dicho valor es una raíz p-ésima de la
unidad, y por tanto coincide con Rp,j para algún j ∈ {0, . . . , p − 1}. De hecho, como Q = kP ,

N N N k0 N
Q = kP = (k0 + k1 p + · · · + ki−1 pi−1 )P = P = Rp,k0 ,
p p p p

de modo que fijamos k0 como el j que hace que Np Q = Rp,j .


Una vez calculados k0 , k1 , . . . , ki−1 , para determinar ki escribimos

Qi = Q − (k0 + k1 p + · · · + ki−1 pi−1 )P.

Tomando logaritmos discretos a ambos lados de la igualdad, obtenemos

log Qi ≡ log Q − (k0 + k1 p + · · · + ki−1 pi−1 ) ≡


≡ k − (k0 + k1 p + · · · + ki−1 pi−1 ) ≡
≡ ki pi + · · · + ke−1 pe−1 ≡
≡ pi (ki + ki+1 p + · · · + ke−1 pe−1−i ) mód pe .

De la última expresión se deduce que N N


Q = P∞ , y por tanto pi+1
pi i
Qi es una raíz p-ésima de
N
la unidad. Fijamos ki igual al j ∈ {0, . . . , p − 1} tal que pi+1 Qi = Rp,j .
Una vez calculados k0 , ki , . . . , ke−1 , habremos determinado k de manera unívoca módulo pe .
Tras hacer lo mismo para todos los factores primos distintos de N , utilizaremos la fórmula 4.4.1
para obtener k.
A continuación analizaremos la eficiencia del algoritmo, suponiendo que ya conocemos la
factorización de N . Nótese que, de no ser así, para factorizar N basta ir dividiéndolo por
primos pequeños hasta obtener su descomposición completa (podemos utilizar este método
para factorizar porque, por hipótesis, N es suave).
Consideraremos como operaciones básicas la suma y comparación de elementos del grupo.
Calcular pNess P requiere O(log N ) sumas, para cada s = 1, . . . , t, de forma que el coste conjunto
es O( ts=1 log N ). El cálculo de la tabla Rp,j requiere O( ts=1 ps ) sumas de elementos del grupo.
P P

Por tanto, el coste global de la parte de precálculo del algoritmo es O( ts=1 (log N + ps )).
P

Veamos ahora cuánto cuesta determinar k mód pess . Encontrar k0 requiere calcular un
múltiplo de un elemento, lo cual tiene coste O(log N ), y realizar O(ps ) comparaciones. Para
encontrar ki , donde i = 1, . . . , es , hay que calcular un múltiplo de un elemento, invertirlo,
realizar una suma y calcular otro producto de un elemento por un entero, tras lo cual se
compara el resultado con las ps raíces Rps ,j de la unidad. Por tanto, encontrar cada ki supone
O(log N + ps ) operaciones básicas.

21
Sumando para todos los divisores primos de N , obtenemos que el coste global del algoritmo
es O( ts=1 es (log N + ps )) = O( ts=1 es (n + ps )).
P P

Este coste puede mejorarse cambiando la forma de determinar los ki para cada primo ps .
Nótese que, fijado un divisor primo ps de N , para determinar cada ki hay que resolver el
problema del logaritmo discreto en un grupo de tamaño ps . Si en lugar de comparar con
los elementos Rps ,j se utiliza el algoritmo Baby-Step Giant-Step (4.2), el cálculo de cada ki

supondrá un coste de O(log N + ps ), y por tanto el coste global del algoritmo pasará a ser

O( ts=1 es (n + ps )).
P

El coste de determinar k mód N utilizando el Teorema Chino del Resto no se ha tenido


en cuenta, puesto que no supone realizar operaciones con elementos del grupo G. En cualquier
caso, obtener k mediante la fórmula 4.4.1 sólo supone un coste de O(n2 ) operaciones con bits.
El algoritmo de Silver-Pohlig-Hellman funciona muy bien cuando todos los divisores primos
de N son pequeños. Por el contrario, si N tiene un divisor primo q con su mismo orden de
magnitud, como el algoritmo requiere calcular logaritmos discretos en un grupo de orden q, ya
no supone ninguna ventaja respecto a los ataques 4.2y 4.3 anteriormente descritos.
Si N tiene un divisor primo grande, pero también varios factores primos pequeños, este
ataque puede utilizarse para obtener información parcial sobre el valor de k; en particular, se
obtiene k módulo el producto de dichos factores primos. Para evitar este problema, y así hacer
que el DLP sea resistente a este ataque, el grupo G suele escogerse de forma que su orden sea
un primo grande.

22
5. Index Calculus y Xedni Calculus.
En este capítulo se describen dos ataques al problema del logaritmo discreto sobre grupos
finitos específicos, lo que los distingue de los ataques generales del capítulo 4.

5.1 Index Calculus.


Cuando el grupo G sobre el que queremos resolver el problema del logaritmo discreto es
el grupo de unidades de un cuerpo finito (G = F∗q ), existe un algoritmo específico, el Index
Calculus, que permite calcular logaritmos discretos en tiempo subexponencial.
El algoritmo se divide en dos partes. En la primera, se fija una base de factores y se calculan
los logaritmos discretos de todos sus elementos. Fijados un grupo cíclico y un generador de éste,
esta fase de precálculo sólo tiene que ejecutarse una vez. En la segunda parte se utilizan los
resultados de la primera para computar el logaritmo discreto de un elemento cualquiera de G.
En principio, esta idea podría funcionar sobre cualquier grupo finito. Sin embargo, existen
grupos, como las curvas elípticas, para los que no se sabe cómo elegir la base de factores ni
cómo calcular eficientemente relaciones entre éstos, lo que hace imposible el ataque.
Supongamos primero que G = F∗p , con p primo, y sea g un generador de F∗p . Dado un
elemento y ∈ F∗p , buscamos x tal que g x ≡ y mód p.
En primer lugar, fijamos una cota c y definimos como base de factores B = {r primo | r ≤ c}.
Diremos que un entero b es B-liso si todos sus factores primos pertenecen a B. Para calcular
los logaritmos discretos de los elementos de la base, escogemos números z ∈ {1, . . . , p − 2} y
comprobamos si los valores g z mód p son B-lisos. En caso afirmativo, calculamos

gz rf (r,z) .
Y
mód p =
r∈B

Cada vector (f (r, z))r∈B se denomina relación. Denotamos por x(r) el logaritmo discreto de r
en base g. Buscamos |B| relaciones y observamos que
P
x(r)f (r,z)
gz ≡ rf (r,z) ≡ g x(r)f (r,z) ≡ g
Y Y
r∈B mód p.
r∈B r∈B

Por tanto, cada relación nos proporciona una congruencia


X
z≡ x(r)f (r, z) mód (p − 1).
r∈B

Suponiendo que las B congruencias son linealmente independientes (si no, habrá que incluir
nuevas relaciones), podemos resolver el sistema anterior, obteniendo así los logaritmos discretos
de los elementos de la base de factores.
Cuando queremos calcular el logaritmo discreto de un y ∈ Fp , suponiendo que ya hemos
realizado la precomputación descrita, comenzamos por elegir al azar un δ ∈ {1, . . . , p − 2} y
comprobar si el elemento yg δ es B-liso.

23
Si no lo es, elegimos un nuevo δ. En otro caso, podemos escribir
P
x(r)e(r)
yg δ ≡ re(r) ≡ g x(r)e(r) ≡ g
Y Y
r∈B mód p,
r∈B r∈B

y por lo tanto
X
x≡ x(r)e(r) − δ mód (p − 1).
r∈B

La eficiencia de este algoritmo depende mucho de la base de factores empleada. Si B es


demasiado grande, resolver el sistema de congruencias de la fase de precomputación será muy
costoso. Si B es demasiado pequeño, habrá muchos elementos de G que no serán B-lisos, con
lo cual la segunda parte del algoritmo requerirá mucho tiempo.
El capítulo 16 de [11] estudia cómo elegir de manera óptima el tamaño de la base de
1 1/2
factores. Tomando c = e[ 2 (log p log log p) ] , se obtiene que el orden de ejecución del algoritmo es
1/2
O(e[(2+o(1))(log p log log p) ] ), y por tanto subexponencial.
Cuando G = F∗q , con q = pn , n > 1, también es posible aplicar el ataque Index Calculus.
.
Recordemos que Fq ' Fp [x] (f (x)) , donde f (x) ∈ Fp [x] es un polinomio irreducible de grado n.
Esto permite expresar los elementos de Fq como polinomios de la forma a0 +a1 x+· · ·+an−1 xn−1 ,
con ai ∈ Fp . En particular, las constantes son los elementos de Fp .
Supondremos que n es grande y p un primo pequeño (lo bastante pequeño como para
poder construir una tabla con los logaritmos discretos de todos los elementos de F∗p ). Como
g 0 = g (q−1)/(p−1) es un generador de F∗p , si sabemos calcular logaritmos discretos en base g 0
en F∗p , inmediatamente conocemos los logaritmos en base g de las constantes. Así, podemos
suponer que calcular el logaritmo discreto de una constante a ∈ F∗p < F∗q es fácil.
En la fase de precomputación, escogemos como base de factores B el conjunto de todos
los polinomios mónicos irreducibles de grado menor o igual que un determinado m < n.
Diremos que un elemento de F∗q es B-liso si su asociado mónico sólo tiene factores irreducibles
en B. Escogemos enteros t ∈ {1, . . . , q − 2} aleatorios, calculamos los correspondientes g t y
comprobamos si son B-lisos. Si g t es B-liso, podemos escribir

g t = g0 hf (h,t) , con g0 ∈ F∗p .


Y

h∈B

Tomando logaritmos discretos a ambos lados de la igualdad, obtenemos


X
t − log(g0 ) ≡ f (h, t) log(h) mód (q − 1).
h∈B

Al igual que en el caso primo, buscamos B relaciones linealmente independientes y resolvemos


el sistema, obteniendo así los logaritmos discretos de los elementos de B.
Como antes, para calcular el logaritmo discreto x de y ∈ F∗q , elegimos un δ ∈ {1, . . . , q − 2}
aleatorio, comprobamos si yg δ es B-liso y, en caso afirmativo, obtenemos

yg δ = y0 he(h)
Y X
⇒ x ≡ log(y0 ) + log(h)e(h) − δ mód (q − 1).
h∈B h∈B

24
5.2 Xedni Calculus.
El ataque conocido como Xedni Calculus fue ideado por Joseph Silverman en el año 2000
([12]), y tiene como objetivo resolver el problema del logaritmo discreto sobre los puntos
racionales de una curva elíptica definida sobre Fp .
Antes de esto, se habían realizado intentos para adaptar el algoritmo Index Calculus a
curvas elípticas. Esto requería levantar la curva E/Fp a una curva E/Q, levantar varios puntos
de E(Fp ) a E(Q) y utilizar relaciones entre estos últimos para resolver el DLP. Sin embargo,
tanto encontrar una curva E/Q adecuada como levantar los puntos a ésta son problemas muy
difíciles, probablemente más que el DLP original. Vamos a ver que la idea de Silverman invierte
en cierto modo este procedimiento; de ahí que su algoritmo se denomine Xedni Calculus.
Recordemos el planteamiento del problema: sea Ep /Fp una curva elíptica, y sean S, T dos
puntos de Ep (Fp ). Buscamos un entero m tal que S = mT en Ep (Fp ).
La idea de Silverman consiste en escribir varios puntos de la forma si S + ti T y levantarlos
a una curva elíptica sobre Q; si los puntos resultantes son dependientes, es posible escribir
una relación lineal entre ellos, y esto permite resolver el problema del logaritmo discreto sobre
Ep (Fp ).
Desafortunadamente, el propio Silverman, junto con otros autores, analizó este algoritmo y
comprobó que no es práctico cuando el primo p está en el rango que habitualmente se utiliza
en criptografía basada en curvas elípticas ([3]). Aun así, el ataque resulta de interés teórico.
Utilizaremos Np para denotar el número de puntos de Ep (Fp ). Además, para cada conjunto
de r puntos Pi = [xi , yi , zi ], 1 ≤ i ≤ r, definimos la matriz B = B(P1 , . . . , Pr ) cuya i-ésima fila
está formada por los 10 monomios cúbicos en xi , yi , zi :
 
x3 x21 y1 x1 y12 y13 x21 z1 x1 y1 z1 y12 z1 x1 z12 y1 z12 z13
 1
. .. .. .. 
 ..
B= . . .

 
x3r x2r yr xr yr2 yr3 x2r zr xr yr zr yr2 zr xr zr2 yr zr2 zr3

Una vez fijada la notación de la sección, pasamos a describir el algoritmo.


Paso 1. Fijar un entero r, 4 ≤ r ≤ 9, que será el número de puntos a levantar. Elegir
también un entero M que sea producto de primos pequeños (en particular, se requiere p 6 | M );
dichos primos se utilizarán para imponer condiciones auxiliares.
Paso 2. Escoger r puntos PM,i = [xM,i , yM,i , zM,i ], 1 ≤ i ≤ r, con coeficientes enteros y
tales que
(i) PM,1 = [1, 0, 0], PM,2 = [0, 1, 0], PM,3 = [0, 0, 1], PM,4 = [1, 1, 1].

(ii) Para cada primo l | M , la matriz B(PM,1 , . . . , PM,r ) módulo l tenga rango r.
Además, encontrar coeficientes uM,1 , . . . , uM,10 tales que las coordenadas de todos los puntos
PM,1 , . . . , PM,r satisfagan la congruencia

uM,1 x3 + uM,2 x2 y + uM,3 xy 2 + uM,4 y 3 + uM,5 x2 z + uM,6 xyz


+ uM,7 y 2 z + uM,8 xz 2 + uM,9 yz 2 + uM,10 z 3 ≡ 0 mód M (5.2.1)

Nótese que basta resolver módulo M un sistema lineal de r ecuaciones y 10 incógnitas.

25
El método de Mestre para producir curvas elípticas de rango alto se basa en escoger los
coeficientes de una curva elíptica de forma que ésta tenga el máximo número de puntos posible
módulo l, para todos los primos l pequeños. Similarmente, el trabajo de Mestre permite deducir
que, si se elige una curva con pocos puntos módulo l para muchos primos pequeños, entonces
es probable que el rango de la curva sea menor de lo habitual. Ésta es la justificación heurística
para este paso del algoritmo.
Paso 3. Escoger aleatoriamente r parejas de enteros (si , ti ), con 1 ≤ si , ti , < Np y calcular

Pp,i = si S − ti T ∈ Ep (Fp ) para cada 1 ≤ i ≤ r.

Supondremos que Pp,i 6= P∞ y que Pp,i 6= Pp,j si i 6= j, pues de lo contrario el cálculo de m es


casi inmediato, siempre y cuando (si , NP ) = 1 ó (si − sj , NP ) = 1, respectivamente.
Paso 4. Hacer un cambio de variables en P2 de la forma
    
X0
 
α
 1,1
α1,2 α1,3  X 
 0
 Y  = α2,1 α2,2 α2,3   Y 
  
    
Z0 α3,1 α3,2 α3,3 Z
que envíe los cuatro primeros puntos a

Pp,1 = [1, 0, 0], Pp,2 = [0, 1, 0], Pp,3 = [0, 0, 1], Pp,4 = [1, 1, 1].

La ecuación para la curva Ep tras este cambio será de la forma

up,1 x3 + up,2 x2 y + up,3 xy 2 + up,4 y 3 + up,5 x2 z + up,6 xyz


+ up,7 y 2 z + up,8 xz 2 + up,9 yz 2 + up,10 z 3 ≡ 0 mód p (5.2.2)

Paso 5. Utilizar el Teorema Chino del Resto para encontrar enteros u01 , . . . , u010 que
satisfagan
u0i ≡ up,i mód p y u0i ≡ uM,i mód M para todo 1 ≤ i ≤ 10.

Paso 6. Levantar los puntos escogidos en los pasos 2 y 3 a P2 (Q). Es decir, encontrar
puntos Pi = [xi , yi , zi ] con coordenadas enteras que verifiquen

Pi ≡ Pp,i mód p y Pi ≡ PM,i mód M para todo 1 ≤ i ≤ r. (5.2.3)

Para mayor eficiencia, es preferible encontrar soluciones con coordenadas pequeñas. En


particular, siempre se toma P1 = [1, 0, 0], P2 = [0, 1, 0], P3 = [0, 0, 1] y P4 = [1, 1, 1].
Paso 7. Sea B = B(P1 , . . . , Pr ). Encontrar una solución u = [u1 , . . . , u10 ] del sistema

Bu = 0, (5.2.4)

con coeficientes enteros pequeños y que además satisfaga

u ≡ [u01 , . . . , u010 ] mód M p. (5.2.5)

26
Denotamos por Cu la cúbica de ecuación

Cu : u1 x3 + u2 x2 y + u3 xy 2 + u4 y 3 + u5 x2 z + u6 xyz
+ u7 y 2 z + u8 xz 2 + u9 yz 2 + u10 z 3 = 0 (5.2.6)

Por construcción:

La fórmula 5.2.3 garantiza que los Pi son levantamientos de los puntos originales Pp,i .

La condición 5.2.5 asegura que la curva Cu es un levantamiento de Ep , tras aplicar el


cambio de coordenadas del paso 4.

El sistema 5.2.4 obliga a que los puntos P1 , . . . , Pr pertenezcan a la curva Cu .

Paso 8. Hacer un cambio de coordenadas para escribir Cu en forma de Weierstrass


estándar, enviando P1 al punto en el infinito. La ecuación resultante es

Eu : y 2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6 (5.2.7)

con a1 , . . . , a6 ∈ Z. Llamaremos Q1 = P∞ , Q2 , . . . , Qr a las imágenes de P1 , . . . , Pr .


Paso 9. Comprobar si Q2 , . . . , Qr ∈ Eu (Q) son independientes. Si lo son, volver al paso 2
ó 3. En caso contrario, escribir una relación

n2 Q2 + · · · + nr Qr = P∞ (5.2.8)

y fijar n1 = −(n2 + · · · + nr ).
Como Q1 = P∞ , la relación lineal 5.2.8 es equivalente a la equivalencia lineal de divisores

n2 ((Q2 ) − (Q1 )) + · · · + nr ((Qr ) − (Q1 )) ∼ 0.

Como Cu ∼ = Eu mediante el cambio de variables del paso 8, que envía Pi a Qi , de la equivalencia


anterior deducimos

n1 (P1 ) + n2 (P2 ) + · · · + nr (Pr ) ∼ 0, y por tanto


n1 P1 + n2 P2 + · · · + nr Pr = P∞ en Cu .

Paso 10. Calcular los valores


r
X r
X
s= ni s i y t= ni ti .
i=1 i=1

Si (s, Np ) > 1, hay que volver a los pasos 2 ó 3. De lo contrario, se tiene

m = logT (S) ≡ s−1 t mód NP ,

con lo que el problema queda resuelto.

Observación. Antes de devolver el resultado, es necesario comprobar que es correcto (es decir,
que S = mT en Ep (Fp )), ya que existe una pequeña probabilidad de que el sistema 5.2.4 no
tenga rango máximo módulo p, lo cual puede dar lugar a un valor erróneo para m.

27
6. Rendimiento de los ataques al problema del logaritmo
discreto.
En este capítulo se describen las pruebas de rendimiento realizadas, así como las conclusiones
obtenidas. Utilizaremos la notación del capítulo 4.

6.1 Descripción de las pruebas realizadas.


Como parte del trabajo, se han implementado en Sage ([14]) el ataque Baby-Step Giant-
Step, cuatro versiones del algoritmo rho de Pollard (ver 6.3) y el ataque Index Calculus. Los
cinco primeros se han implementado sobre F∗q y sobre curvas elípticas con coeficientes en Fq ,
mientras que Index Calculus sólo es aplicable a F∗q .
Se han realizado seis pruebas de rendimiento distintas, dependiendo del tipo de grupo.
Las dos primeras utilizan F∗p y F∗q ; las cuatro restantes emplean curvas elípticas definidas,
respectivamente, sobre varios cuerpos de la forma F2n , F3n , F5n y Fp para p primos grandes.
Para poder ejecutar pruebas sobre curvas elípticas, se ha seguido el algoritmo descrito en
la sección C.1 para realizar un programa que, dado un cuerpo finito Fq , devuelve una curva
elíptica E con coeficientes en Fq y un punto P que genera un subgrupo de E de orden primo,
cuyo tamaño mínimo queda limitado por una cota establecida por el usuario.
A continuación se describe el esquema general seguido para realizar las pruebas. En cada
iteración del bucle principal, se hace lo siguiente:
1: Seleccionar el siguiente grupo G sobre el que realizar la prueba.
2: Elegir un generador x de G.
3: Realizar la fase de precomputación de Index Calculus (si éste puede aplicarse sobre G).
4: for i = 1 to 100 do
5: Elegir un elemento aleatorio y ∈ G.
6: Medir el tiempo empleado por cada uno de los cinco algoritmos (seis si se puede aplicar
Index Calculus) para calcular el logaritmo discreto de y en base x.
7: end for
La selección de los grupos se realiza de forma distinta según el tipo de prueba:

En las pruebas sobre F∗p , para determinar cada primo p se escoge un primo entre 2j y
2j+1 , para j = 10, . . . , 29.

En las pruebas sobre F∗q , se han empleado los grupos de unidades de F7n , para n = 3, . . . , 8.

En las pruebas sobre curvas definidas sobre Fp , para cada j = 10, . . . , 24 se escoge al azar
un primo p entre 2j y 2j+1 y se busca una curva aleatoria E definida sobre Fp y un punto
P ∈ E que genere un subgrupo de orden mayor o igual que |E|/2.

En las pruebas restantes sobre curvas elípticas, se utilizan como cuerpos base F2n , para
n = 10, . . . , 25, F3n , para n = 6, . . . , 15 y F5n , para n = 4, . . . , 11.

28
6.2 Conclusiones sobre Baby-Step Giant-Step.
En la sección 4.2, estimamos el tiempo de ejecución del algoritmo Baby-Step Giant-Step

como O( N ), donde N = |G|. Sin embargo, en todas las pruebas realizadas, la curva de
tiempos del algoritmo se comporta como O(N ). En la figura 6.1 se muestran los tiempos medios
de ejecución obtenidos sobre curvas con coeficientes en cuerpos Fp , para p primo.

Figura 6.1: Tiempo medio de ejecución del algoritmo Baby-Step Giant-Step sobre curvas E/Fp .

La diferencia entre los tiempos teóricos y los obtenidos en la práctica se debe a que, al
realizar la estimación temporal teórica, sólo se computa el número de sumas de elementos del
grupo. Sin embargo, en cada paso del bucle principal del algoritmo Baby-Step Giant-Step, se

compara un elemento de G con la tabla de O( N ) baby steps, almacenados en una lista.
Las listas en Python se implementan como array de punteros, con lo cual es muy frecuente
que cada acceso a un elemento de la lista provoque un fallo de caché, obligando a acceder a
disco para recuperar el elemento. Como se requiere un total de O(N ) comparaciones, cada una
de ellas muy lenta por el tiempo empleado en acceder a memoria, éste será el orden de ejecución
real del algoritmo. Concluimos que, para que una implementación de este algoritmo sea útil,
debe utilizarse un tipo de datos distinto para almacenar la tabla de baby steps.

6.3 Variantes del algoritmo rho de Pollard.


En [15], Teske propone tres alternativas a la función iterante del algoritmo rho de Pollard:

1. Pollard modificado. Se utiliza una partición de G en tres subconjuntos, se escogen


enteros aleatorios m, n, ∈ {1, . . . , N }, se calculan Pm = mP y Pn = nQ y se define





Pm + R si R ∈ G1 ,

f (R) = 2R si R ∈ G2 ,



P + R si R ∈ G3 .

n

2. Pollard lineal. Se utiliza una partición de G en 20 conjuntos. Se eligen al azar enteros


m1 , n1 , . . . , m20 , n20 ∈ {1, . . . , N } y se calculan los puntos Mi = mi P + ni Q, para

29
i = 1, . . . , 20. Denotamos por s(R) ∈ {1, . . . , 20} la clase de la partición a la que pertenece
el elemento R. La función iterante se define como f (R) = Ms(R) + R.

3. Pollard combinado. Se utiliza una partición de G en 20 clases, se eligen 4 números


distintos u1 , . . . , u4 , se sortean mi , ni ∈ {1, . . . , N } para i ∈ {1, . . . , 20} \ {u1 , u2 , u3 , u4 }.
y se calculan los correspondientes puntos Mi = mi P + ni Q. La función iterante es

Ms(R)

+ R si s(R) ∈ {1, . . . , 20} \ {u1 , u2 , u3 , u4 },
f (R) = 
2R en otro caso.

En la figura 6.2 se muestran los tiempos medios obtenidos al ejecutar cada una de las
versiones del algoritmo sobre el grupo de unidades de cuerpos de tamaño primo. Observamos
que la versión original del algoritmo es, en media, la más lenta, mientras que la versión lineal
resulta ser la más rápida, seguida por la versión combinada. En las pruebas realizadas sobre F∗q
y sobre curvas elípticas se han obtenido resultados similares.

Figura 6.2: Comparativa entre las variantes de Pollard-rho sobre F∗p .

Además de conocer el tiempo medio de ejecución, nos interesa saber el número de veces que

termina cada algoritmo sin proporcionar respuesta en tiempo O( N ). Para poder hacer esto,

se ha implementado el algoritmo rho de Pollard de forma que sólo realice un máximo de c N
pruebas, donde c es una constante prefijada por el usuario. Concretamente, en las pruebas aquí
descritas se ha utilizado c = 20.
En la tabla 6.1 se muestran los números de errores obtenidos para los últimos siete grupos.
Cuando p − 1 tiene muchos factores primos pequeños, el número de errores es en general mucho
mayor; además, la figura 6.2 muestra un peor rendimiento del algoritmo en dichos casos. La
razón es que, en ese caso, es muy probable que la congruencia a resolver por el algoritmo tenga
más soluciones de las permitidas, lo cual obliga a comenzar de nuevo.
El grupo F∗204735481 es el que acumula un mayor número de errores, lo cual es consistente con
el pico que aparece en dicho punto en la figura 6.2 para los cuatro algoritmos, así como con el
gran número de factores muy pequeños de p − 1 = 204735480.

30
Por último, observamos que las versiones lineal y combinada se ven, en general, menos
afectadas por la descomposición de p−1. Concluimos que, al aleatorizar el algoritmo, se obtiene
mayor protección respecto a cambios en la factorización del tamaño del grupo.

p Factorización de p − 1 Original Modificada Lineal Combinada


13893553 24 · 33 · 29 · 1109 17 28 7 7
26528899 2 · 3 · 11 · 401953 1 3 4 0
2
40901771 2 · 5 · 7 · 13 · 6421 2 6 3 1
128061191 2 · 5 · 461 · 27779 0 0 0 0
3
204735481 2 · 3 · 5 · 1706129 24 40 5 21
370043243 2 · 185021621 0 0 0 0
731408519 2 · 97 · 149 · 25303 0 0 1 0

Tabla 6.1: Número de errores en función de p.

6.4 Análisis del algoritmo rho de Pollard lineal sobre distintos


grupos.
En esta sección estudiaremos las diferencias de rendimiento de la versión lineal del algoritmo
rho de Pollard al actuar sobre F∗p , F∗q y E/Fp , basándonos en las figuras 6.3, 6.4 y 6.5.
En cada figura se muestran los tiempos de ejecución medios, así como la curva de tiempos

teórica O( N ), ajustada a los tiempos medios. Además, se grafican los tiempos medios sumando
y restando una desviación típica, para dar una idea de la dispersión de los tiempos de las pruebas
realizadas.
En los tres casos, el grado de ajuste de los tiempos medios a la curva teórica es muy alto.
Sin embargo, en los dos primeros se observan puntos alejados de la curva, mientras que en el
tercero todos los puntos aparecen muy cercanos a su posición teórica.
La causa de estas diferencias reside en el orden de los grupos utilizados. Como hemos visto
en la sección 6.3, la factorización del orden del grupo influye en el rendimiento del algoritmo.
En el caso de las curvas elípticas, hemos escogido siempre subgrupos de orden primo, que es
precisamente el caso en que mejor se comporta el algoritmo de Pollard.

Figura 6.3: Eficiencia de Pollard-rho lineal sobre F∗p .

31
Figura 6.4: Eficiencia de Pollard-rho lineal sobre F∗q .

Figura 6.5: Eficiencia de Pollard-rho lineal sobre E/Fp .

6.5 ¿Es Index Calculus mejor?


En esta sección estudiaremos el rendimiento del algoritmo Index Calculus y lo compararemos
con la versión lineal del algoritmo rho de Pollard. En la figura 6.6 se muestran los resultados
obtenidos al ejecutar al ataque Index Calculus sobre grupos de orden primo.
En las pruebas realizadas sobre F∗p , se ha utilizado la cota óptima para la base de factores,
1 1/2
c = e[ 2 (log p log log p) ] . Como vimos en la sección 5.1, el tiempo teórico esperado al utilizar esa
1/2
cota es O(e[(2+o(1))(log p log log p) ] ).
Para los tamaños de grupo utilizados, el tiempo empleado en el cálculo de logaritmos
concretos es despreciable, por lo que la figura 6.6 muestra sólo los tiempos dedicados a la
precomputación. Podemos observar que el grado de ajuste a la curva teórica es muy alto.
Como el ataque rho de Pollard es exponencial, e Index Calculus es subexponencial,
esperamos que el rendimiento del segundo sea mejor. Sin embargo, al comparar las figuras
6.6 y 6.3, observamos que Index Calculus es más lento que el ataque rho de Pollard. Para
explicar este hecho, hay que tener dos cosas en cuenta.

32
Figura 6.6: Eficiencia de Index Calculus sobre F∗p .

En primer lugar, que Index Calculus sea subexponencial y Pollard rho exponencial, sólo
nos dice que, asintóticamente, el primer ataque será más rápido. Deducimos que los grupos
utilizados no son lo bastante grandes para que emplear Index Calculus suponga una ventaja.
En segundo lugar, hemos mencionado que el algoritmo Index Calculus destina todo su
tiempo de ejecución (salvo una cantidad despreciable) a la fase de precomputación, que sólo
tiene que ejecutarse una vez.
Nos interesa saber a partir de qué número de ataques este tiempo de precomputación
compensa al utilizado por el ataque rho Pollard. Para ello, para cada primo p mostramos
en la tabla 6.2 el número m que se obtiene al dividir el tiempo de precomputación de Index
Calculus entre el tiempo medio del ataque rho de Pollard (tomando parte entera por arriba).
A partir de dicho número de ataques m, es más rentable utilizar Index Calculus. Observamos
que todos los m son menores que 8.

p 13893553 26528899 40901771 128061191 204735481 370043243 731408519


m 2 2 4 7 3 4 5

Tabla 6.2: Ejecuciones de Pollard-rho durante una precomputación de Index Calculus.

Para el rango de primos utilizado, concluimos que, si se va a realizar un único ataque,


es preferible emplear el algoritmo rho de Pollard. Sin embargo, cuando se ataca un sistema
criptográfico, típicamente se desea descifrar un gran número de mensajes cifrados con el mismo
esquema (en nuestro caso, esto supone calcular muchos logaritmos discretos en el mismo cuerpo
y sobre la misma base). Por tanto, en una situación típica de criptoanálisis, será preferible
utilizar Index Calculus.
Por último, comparando los puntos tercero y cuarto comenzando por la derecha de las
gráficas 6.2 y 6.6, observamos que el tipo de factorización de p − 1 influye de manera opuesta en
Pollard y en Index Calculus. En efecto, si p − 1 tiene muchos factores pequeños, será más fácil
encontrar relaciones entre los elementos de la base de factores empleada en la precomputación
de Index Calculus. Por tanto, el algoritmo será más eficiente en dichos casos, al contrario de lo
que ocurría con el algoritmo rho de Pollard.

33
Apéndices

34
A. Variedades y curvas algebraicas.
En este apéndice se presentan algunos conceptos relativos al campo de la geometría
algebraica, que serán necesarios para estudiar ciertas características de las curvas elípticas.
Utilizaremos K para denotar un cuerpo perfecto y K para denotar una clausura algebraica
(fija) de K. Además, K[X] = K[X1 , · · · , Xn ] denotará un anillo de polinomios en n variables
con coeficientes en K, e I ⊂ K[X] un ideal de éste.

A.1 Variedades afines.


Definición A.1. El espacio afín de dimensión n sobre K es el conjunto de n-tuplas

An = An (K) = {P = (x1 , . . . , xn ) : xi ∈ K}.

El conjunto de puntos K-racionales de An es

An (K) = {P = (x1 , . . . , xn ) ∈ An : xi ∈ K}.

Definición A.2. Un conjunto algebraico (afín) es un conjunto de la forma

VI = {P ∈ An : f (P ) = 0 para todo f ∈ I}.

Si V es un conjunto algebraico, definimos los ideales

I(V ) = {f ∈ K[X] : f (P ) = 0 para todo P ∈ V }.


I(V /K) = {f ∈ K[X] : f (P ) = 0 para todo P ∈ V } = I(V ) ∩ K[X].

Un conjunto algebraico V está definido sobre K, y se denota V /K, si su ideal I(V) se puede
generar mediante polinomios de K[X]. Si V está definido sobre K, entonces el conjunto de
puntos K-racionales de V es V (K) = V ∩ An (K).

Definición A.3. Una variedad afín V es un conjunto algebraico afín irreducible, es decir, que
no puede ser expresado mediante la unión de dos subconjuntos algebraicos propios.
K[X]
Si V es una variedad definida sobre K, su anillo de coordenadas afín es K[V ] = I(V /K)
.
El cuerpo cociente de dicho anillo, denotado K(V ), recibe el nombre de cuerpo de funciones de
V /K. Análogamente se definen K[V ] y K(V ).

Definición A.4. La dimensión de una variedad V se define como el supremo de las longitudes
m de cadenas V0 ⊂ V1 ⊂ . . . ⊂ Vm de subvariedades de V distintas y no vacías.

El teorema de la base de Hilbert garantiza que todos los ideales de K[X] y K[X] están
finitamente generados, hecho empleado en la siguiente definición.

35
Definición A.5. Sea V una variedad, P ∈ V y f1 , . . . , fm ∈ K[X] un conjunto de generadores
de I(V ). Entonces V es no singular o lisa en el punto P si la matriz m × n
!
∂fi
(P )
∂Xj 1≤i≤m, 1≤j≤n

tiene rango n − dim(V ).


Si V es no singular en todo punto, decimos que V es no singular o lisa.

Definición A.6. El anillo local de V en P , denotado K[V ]P es el anillo

f
K[V ]P = {F ∈ K(V ) : F = para f, g ∈ K[V ] con g(P ) 6= 0}.
g

Si F = fg ∈ K[V ]P , entonces F (P ) = fg(P


(P )
)
está bien definida en P . Se dice que las funciones
de K[V ]P son regulares (o están definidas) en el punto P .

A.2 Variedades proyectivas.


Definición A.7. El n-espacio proyectivo sobre K, denotado Pn o Pn (K), es el conjunto de
(n + 1)-tuplas (x0 , · · · , xn ) ∈ An tales que al menos una de los xi es no nula, módulo la relación

de equivalencia (x0 , · · · , xn ) ∼ (y0 , · · · , yn ) si existe un λ ∈ K tal que xi = λyi para todo i.
Una clase de equivalencia {(λx0 , · · · , λxn )} se denota como [x0 , · · · , xn ], y los valores x0 , . . . , xn
se denominan coordenadas homogéneas del punto de Pn correspondiente.
El conjunto de puntos K-racionales en Pn es Pn (K) = {[x0 , · · · , xn ] ∈ Pn : todo xi ∈ K.}

Nótese que si P = [x0 , · · · , xn ] ∈ Pn (K), esto no significa que todas sus coordenadas xi
pertenezcan a K. Sin embargo, fijando una coordenada xj 6= 0, sí que se verifica xi /xj ∈ K
para todo i.

Definición A.8. Un polinomio f ∈ K[X] = K[X0 , · · · , Xn ] es homogéneo de grado d si

f (λX0 , · · · , λXn ) = λd f (X0 , · · · , Xn ) para todo λ ∈ K.

Un ideal I ⊂ K[X] es homogéneo si está generado por polinomios homogéneos.

Si f es un polinomio homogéneo, entonces tiene sentido preguntarse si f (P ) = 0 para un


P ∈ Pn . Esto nos permite asociar conjuntos a ideales, tal y como hicimos en el caso afín.

Definición A.9. Sea I ⊂ K[X] un ideal homogéneo. El conjunto algebraico (proyectivo)


asociado a I es
VI = {P ∈ Pn : f (P ) = 0 para todo f ∈ I homogéneo}.

Si V es un conjunto algebraico proyectivo, el ideal (homogéneo) de V es el ideal I(V ) de K[X]


generado por {f ∈ K[X] : f es homogéneo y f (P ) = 0 para todo P ∈ V }.
V está definida sobre K, y se denota V /K, si I(V ) se puede generar mediante polinomios
homogéneos de K[X].
Si V está definida sobre K, el conjunto de puntos K-racionales de V es V (K) = V ∩ Pn (K).

36
Definición A.10. Una variedad proyectiva V es un conjunto algebraico proyectivo irreducible.

El espacio proyectivo Pn contiene muchas copias del espacio afín An . Por ejemplo, para cada
i ∈ {0, . . . , n}, podemos definir la inclusión

φi : An → Pn
(y1 , · · · , yn ) 7→ [y1 , · · · , yi−1 , 1, yi , · · · , yn ].

Si denotamos Ui = {P = [x0 , · · · , xn ] ∈ Pn : xi 6= 0}, entonces existe una biyección natural

φi −1 : Ui → An
x0 xi−1 xi+1 xn
[x0 , · · · , xn ] 7→ ( , · · · , , , · · · , ).
xi xi xi xi

Fijado un i, identificaremos An con el conjunto Ui ⊂ Pn mediante la biyección φi .


Sea V un conjunto algebraico proyectivo con ideal homogéneo I(V ) ⊂ K[X]. Entonces
V ∩ An = φi −1 (V ∩ Ui ) es un conjunto algebraico afín con ideal I(V ∩ An ) dado por

I(V ∩ An ) = {f (Y1 , · · · , Yi−1 , 1, Yi+1 , · · · , Yn ) : f (X0 , · · · , Xn ) ∈ I(V )}.

Como los conjuntos U0 , . . . , UN cubren todo Pn , cualquier variedad proyectiva queda cubierta
por los conjuntos V ∩ U0 , . . . , V ∩ UN , cada uno de los cuales es una variedad afín vía la
correspondiente aplicación φi −1 .
El proceso de reemplazar f (X0 , · · · , Xn ) por f (Y1 , · · · , Yi−1 , 1, Yi+1 , · · · , Yn ) se conoce como
deshomogeneización con respecto a Xi .
Por otra parte, para f (Y ) ∈ K[Y ] podemos definir

X0 Xi−1 Xi+1 Xn
f ∗ (X0 , · · · , Xn ) = Xid f ( ,··· , , ,··· , ),
Xi Xi Xi Xi

donde d = grado(f ) es el menor entero para el que f ∗ es un polinomio. Decimos que f ∗ es la


homogeneización de f con respecto a Xi .

Definición A.11. Sea V un conjunto afín algebraico con ideal I(V ). Consideramos V como
un subconjunto de Pn , vía la aplicación φi .
La clausura proyectiva de V , denotada V , es el conjunto algebraico proyectivo cuyo ideal
homogéneo está generado por {f ∗ (X) : f ∈ I(V )}.

Proposición A.1. (a) Sea V una variedad afín. Entonces V es una variedad proyectiva y
V = V ∩ An .

(b) Sea V una variedad proyectiva. Entonces V ∩ An es una variedad afín y se cumple

V ∩ An = ∅ ó V = V ∩ An .

(c) Si una variedad afín (proyectiva) V está definida sobre K, entonces V (V ∩ An ) también
está definida sobre K.

37
La proposición A.1 permite asociar a cada variedad afín V una única variedad proyectiva
W . Los puntos de W \ V se denominan puntos en el infinito de W .

Definición A.12. Sea V /K una variedad proyectiva, y sea An ⊂ Pn tal que V ∩ An 6= ∅.

La dimensión de V es la dimensión de V ∩ An .

El cuerpo de funciones de V , denotado K(V ), se define como K(V ∩ An ).

Análogamente, K(V ) se define como K(V ∩ An ).

Definición A.13. Sea V una variedad proyectiva, P ∈ V , y sea An ⊂ Pn tal que P ∈ An .

V es no singular o suave en P si V ∩ An lo es.

El anillo local de V en P , denotado K[V ]P , es el anillo local de V ∩ An en P .

Una función F ∈ K(V ) es regular (o está definida) en P si pertenece a K[V ]P , y en ese


caso, tiene sentido evaluar F en P .

Observación. El cuerpo de funciones de Pn también se puede definir como el subcuerpo de


K(X) = K(X0 , · · · , Xn ) compuesto por las funciones racionales F (X) = fg(X)
(X)
, donde f y g son
polinomios homogéneos del mismo grado. Las expresiones de este tipo están bien definidas en
todos los puntos P ∈ Pn tales que g(P ) 6= 0.
Análogamente, el cuerpo de funciones de una variedad proyectiva V se puede definir como
el cuerpo de funciones racionales F (X) = fg(X)
(X)
tales que

f y g son polinomios homogéneos del mismo grado.

g 6∈ I(V ).
f f0
g
∼ g0
si f g 0 − f 0 g ∈ I(V ).

A.3 Curvas algebraicas. Divisores.


Definición A.14. Una curva es una variedad proyectiva de dimensión 1.

Definición A.15. Sea C una curva, sea P ∈ C un punto no singular de ésta y sea
MP = {f ∈ K[C]P : f (P ) = 0}, que resulta ser un ideal principal, el único ideal maximal
de K[C]P . Definimos la aplicación

ordP : K[C]P → {0, 1, 2, . . .} ∩ {∞}


f 7→ ordP (f ) = máx{d ∈ Z : f ∈ MPd }.
 
f
Extendemos ordP a K(C), definiendo ordP g
= ordP (f ) − ordP (g), de forma que

ordP : K(C) → Z ∪ {∞}.

Un uniformizante para C en P es una función t ∈ K(C) tal que ordP (t) = 1, es decir, un
generador de MP .

38
Definición A.16. Sea C una curva y P ∈ C no singular. Si f ∈ K(C), el orden de f en P es
igual a ordP (f ).

Si ordP (f ) < 0, decimos que f tiene un polo en P , y escribimos f (P ) = ∞.

Si ordP (f ) ≥ 0, decimos que f es regular (o está definida) en P , y podemos calcular f (P ).

Si ordP (f ) > 0, decimos que f tiene un cero en P .

Proposición A.2. Sea C una curva suave y sea f ∈ K(C). Entonces hay sólo una cantidad
finita de puntos de C en los que f tiene un cero o un polo. Además, si f no tiene ningún polo,
entonces f ∈ K.

Definición A.17. El grupo de divisores de una curva C, denotado Div(C), es el grupo


abeliano libre generado por los puntos de C. Un divisor de C es una suma formal
X
D= nP (P ),
P ∈C

donde los nP ∈ Z y todos excepto una cantidad finita son nulos.


El grado de un divisor D, denotado deg(D), se define como la suma
X
deg(D) = nP .
P ∈C

Definición A.18. Sea C una curva suave y sea f ∈ K(C)∗ . El divisor asociado a f , denotado
div(f ), se define como
X
div(f ) = ordP (f )(P ).
P ∈C

Definición A.19. Un divisor D ∈ Div(C) es principal si es de la forma D = div(f ) para algún


f ∈ K(C)∗ .
Dos divisores D1 y D2 son linealmente equivalentes (denotado D1 ∼ D2 ) si D1 −D2 es principal.
El grupo de Picard de C, que se denota P ic(C), es el cociente de Div(C) por el subgrupo de
divisores principales.

Proposición A.3. Sea C una curva suave y sea f ∈ K(C)∗ . Entonces



(a) div(f ) = 0 si y sólo si f ∈ K .

(b) deg(div(f )) = 0.

A.4 Formas diferenciales.


Definición A.20. Sea C una curva. El espacio de formas diferenciales sobre C, denotado ΩC ,
es el K(C)-espacio vectorial generado por los símbolos de la forma dx para x ∈ K(C), sujetos
a las siguientes relaciones:

(a) d(x + y) = dx + dy para todos x, y ∈ K(C).

39
(b) d(xy) = x dy + y dx para todos x, y ∈ K(C).

(c) da = 0 para todo a ∈ K.

Proposición A.4. Sea C una curva. ΩC es un espacio vectorial de dimensión 1 sobre K(C).

Proposición A.5. Sea C una curva suave, sea P ∈ C y sea t ∈ K(C) un uniformizante en P .

(a) Para cada ω ∈ ΩC existe una única función g ∈ K(C), dependiendo de ω y de t, tal que
ω = g dt.
Denotamos g mediante ω/dt.

(b) Sea f ∈ K(C) regular en P . Entonces df /dt también es regular en P .

(c) La cantidad ordP (ω/dt) depende sólo de ω y P , pero no del uniformizante t empleado.
Llamaremos a dicho valor orden de ω en P , y lo denotaremos mediante ordP (ω).

(d) Sean x, f ∈ K(C) con x(P ) = 0, y sea p = char(K). Entonces,

ordP (f dx) = ordP (f ) + ordP (x) − 1, si p 6 | ordP (x),


ordP (f dx) ≥ ordP (f ) + ordP (x), si p | ordP (x).

(e) Para todos los puntos P de C excepto una cantidad finita, se tiene ordP (ω) = 0.

Definición A.21. Sea ω ∈ ΩC . El divisor asociado a ω es


X
div(w) = ordP (w)(P ).
P ∈C

Definición A.22. Un diferencial ω ∈ ΩC es regular si ordP (w) ≥ 0 para todo P ∈ C.


Un diferencial ω ∈ ΩC es libre de ceros si ordP (w) ≤ 0 para todo P ∈ C.

Observación. Como la proposición A.4 garantiza que ΩC es un espacio vectorial de dimensión


1, dados ω1 , ω2 ∈ ΩC no nulos, existe una función f ∈ K(C)∗ tal que ω1 = f ω2 . Por tanto,
div(ω1 ) = div(f ) + div(ω2 ), lo que hace que la siguiente definición tenga sentido.

Definición A.23. La clase de divisores canónicos de C es la imagen en P ic(C) de div(ω), para


cualquier diferencial no nulo ω ∈ ΩC .
Cualquier divisor perteneciente a dicha clase recibe el nombre de divisor canónico.

A.5 El teorema de Riemann-Roch.


Definición A.24. Un divisor D = P ∈C nP (P ) ∈ Div(C) es positivo o efectivo, y se denota
P

D ≥ 0, si nP ≥ 0 para todo P ∈ C.
Si D1 , D2 ∈ Div(C), escribimos D1 ≥ D2 para indicar que D1 − D2 es positivo.

Definición A.25. Sea D ∈ Div(C). Asociamos a D el conjunto de funciones

L(D) = {f ∈ K(C)∗ : div(f ) ≥ −D} ∪ {0}.

40
Se puede probar que L(D) es un K-espacio vectorial de dimensión finita. Denotaremos su
dimensión mediante l(D) = dimK (L(D)).

Ejemplo A.1. Sea D ∈ Div(C) tal que deg(D) < 0. Entonces L(D) = {0} y por tanto
l(D) = 0.
Para ver esto, supongamos que existe f ∈ L(D) tal que f 6= 0. Entonces, utilizando la
proposición A.3, tendríamos

0 = deg(div(f )) ≥ deg(−D) = −deg(D),

lo cual implicaría que deg(D) ≥ 0.

Ejemplo A.2. Consideramos el divisor D = 0 ∈ Div(C). Veamos que L(0) = {K} y por tanto
l(0) = 1.
0 ∈ L(0) por definición del conjunto. Sea f 6= 0, y sea div(f ) =
P
nP (P ) su divisor
asociado. Si f pertenece a L(0), entonces nP ≥ 0 para todo P ∈ C. Pero, por la proposición
A.3, deg(div(f )) = 0, y por tanto todos los nP tienen que ser nulos. De este modo, obtenemos
que f ∈ K.

Teorema A.1 (Riemann-Roch). Sea C una curva suave y sea KC un divisor canónico de
C. Existe un entero g, denominado género de C, tal que para cada divisor D ∈ Div(C),

l(D) − l(KC − D) = deg(D) − g + 1.

Corolario A.1. (a) l(KC ) = g.

(b) deg(KC ) = 2g − 2.

(c) Si deg(D) > 2g − 2, entonces l(D) = deg(D) − g + 1.

41
B. Ecuaciones cuadráticas en cuerpos finitos.
A continuación estudiaremos cómo resolver ecuaciones de la forma ax2 + bx + c = 0, donde
a 6= 0, b y c son elementos de un cuerpo finito Fq . Observamos que, como a 6= 0, se cumple
ax2 + bx + c = 0 ⇔ x2 + a−1 bx + a−1 c = 0, lo cual nos permite restringir nuestro análisis al
caso en que a = 1.

B.1 Cálculo de raíces cuadradas en cuerpos finitos.


q−1
Proposición B.1. Sea a ∈ F∗q . La ecuación xn = a tiene soluciones en F∗q si y sólo si a d = 1,
siendo d = (n, q − 1). Además, si la ecuación tiene soluciones, entonces tiene exactamente d
soluciones distintas.

Demostración. Sea g un generador de F∗q . Entonces existen enteros α, y tales que a = g α y


x = g y , de modo que:

xn = a ⇔ (g y )n = g α ⇔ yn ≡ α mód (q − 1).

Por un resultado clásico de teoría de números (Proposición 3.3.1 de [2]), la congruencia


yn ≡ α mód (q − 1) tiene solución si y sólo si d = (n, q − 1) | α, y en dicho caso existen d
soluciones distintas módulo q − 1. Por tanto, para obtener el enunciado de la proposición, basta
q−1
probar que d | α ⇔ a d = 1. Para ello, utilizando el hecho de que g es un generador, se tiene:

q−1 q−1 α α
a d = (g α ) d = (g q−1 ) d = 1 ⇔ ∈ Z ⇔ d | α.
d

Aplicando directamente la proposición anterior, podemos saber cuándo un elemento de un


cuerpo finito es un residuo cuadrático:

Si Fq es un cuerpo finito de característica 2, todos sus elementos son cuadrados, ya que


en ese caso d = (q − 1, 2) = 1 y, como consecuencia del Teorema de Lagrange, cualquier
a ∈ F∗q satisface aq−1 = 1. Además, la proposición nos dice que cada elemento tiene una
única raíz cuadrada.

Si Fq es un cuerpo finito de característica impar, d = (q − 1, 2) = 2 y, por tanto a ∈ F∗q


q−1
es un residuo cuadrático si y sólo si a 2 = 1. En este caso, si a es un residuo cuadrático,
entonces tiene exactamente dos raíces cuadradas.
n
Consideremos primero el caso de caracteristica 2. Como todo a ∈ F2n satisface a2 = a (ya
n n−1
que el orden de F∗2n es 2n − 1, y 02 = 0), la única raíz cuadrada de a es el elemento a2 .
Si Fq = Fpn es un cuerpo finito de característica impar, el cálculo de las raíces cuadradas de
un elemento no es tan directo. Sin embargo, el método descrito a continuación permite realizarlo
en tiempo polinomial.

42
Este algoritmo calcula una de las raíces cuadradas de un elemento a ∈ Fpn , el cual
hemos comprobado que es un cuadrado. Nótese que, una vez conocida una de las raíces de
a, multiplicándola por −1 se obtiene la raíz restante.
Además del elemento a, el algoritmo recibe como entrada un elemento w ∈ F∗pn tal que la
ecuación x2 = w no tenga soluciones en F∗pn .
A continuación se muestra el pseudocódigo del algoritmo:

Expresar pn − 1 = 2α s, con s impar.


s+1
r=a 2
if α > 1 then
b = ws
for k = 0 to α − 2 do

k−1 j
2 2α−k−2
bj0 +2j1 +···+2 k−1 r

if 
 a

 = 1 then

jk = 0
else
jk = 1
end if
end for
α−2
return bj0 +2j1 +···+2 jα−2 r
end if
return r
Algoritmo B.1: Cálculo de la raíz cuadrada en Fpn , para p impar.

Veamos por qué funciona el algoritmo anterior. En primer lugar, afirmamos que r es casi
2
una raíz cuadrada de a, en el sentido de que ra es una raíz 2α−1 -ésima de la unidad, ya que
!2α−1 !2α−1
r2 as+1 α−1 q−1
= = as2 =a 2 =1
a a

donde la última igualdad es cierta porque a es un cuadrado en F∗pn .


A continuación mostraremos que, al multiplicar r por una raíz 2α -ésima de la unidad
adecuada, se obtiene un x tal que x2 = a. Para calcular dicha raíz, observemos en primer
lugar que b es una raíz 2α -ésima primitiva de la unidad:
α
b es una raíz 2α -ésima de la unidad porque b2 = (ws )2 = wp
α n −1
= 1.
β
b es primitiva porque, si no lo fuera, existiría un β tal que 0 < β < α y b2 = 1. Pero
entonces b sería una potencia par de una raíz 2α -ésima primitiva de la unidad, y por tanto
un cuadrado en F∗pn . Sin embargo, esto es imposible porque, como w no es un cuadrado y
s es impar,  n s
pn −1 pn −1 p −1
b 2
s
= (w ) 2 = w 2 = (−1)s = −1.

Como b es una raíz 2α -ésima primitiva de la unidad, sólo falta encontrar un j ∈ {0, . . . , 2α −1}
tal que x = bj r cumpla x2 = a. De hecho, podemos suponer que j < 2α−1 , ya que al multiplicar
α−1
x por b2 = −1, se obtiene la otra raíz cuadrada de a, −x. Por tanto, el exponente j se puede
escribir en binario como j = j0 + 2j1 + · · · + 2α−2 jα−2 .

43
 k−1 j
2
bj0 +2j1 +···+2 k−1 r

Suponiendo que conocemos los dígitos j0 , ..., jk−1 tales que c = a


es una
α−k−1 2α−k−2
raíz 2 -ésima de la unidad, para determinar el dígito jk calculamos d = c . Si d = 1,
entonces c ya era una raíz 2α−k−2 -ésima de la unidad, y por tanto fijamos jk = 0. Por el
k
contrario, si d = −1, cb2 es una raíz 2α−k−2 -ésima de la unidad, así que tenemos que fijar
jk = 1. De este modo, tras calcular el dígito jα−2 , se tiene que bj r es una raíz cuadrada de a.
pn −1 s+1
Observación. Si pn ≡ 3 mód 4, entonces α = 1, s = 2
yr=a 2 es la raíz buscada, pues
 s+1
2  p+1 2 p+1 p−1
r2 = a 2 = a 4 =a 2 = aa 2 = a,

donde la última igualdad es cierta por ser a un cuadrado.

Observación. Como exactamente la mitad de los elementos de F∗pn son cuadrados, para
encontrar rápidamente un w ∈ F∗pn tal que x2 = w no tenga solución, basta ir escogiendo
p−1
elementos aleatorios hasta dar con un w tal que w 2 = −1.

Por último, analicemos el coste temporal del algoritmo, estimando el número de productos
de elementos del cuerpo. Supondremos que ya conocemos un no cuadrado w, que sólo hay
que buscar una vez. Por la sección 2, sabemos que calcular una potencia requiere O(log q)
multiplicaciones; por tanto éste es el coste de calcular b y r. En cada paso del bucle principal
se realiza una exponenciación; como el bucle tiene α − 1 < log2 q pasos, su coste global es de
O(log2 q) multiplicaciones. Por tanto, éste será el coste temporal del algoritmo completo.
Si q es primo, la multiplicación de dos elementos de Fq requiere O(log2 q) operaciones con
bits, así que el coste temporal del algoritmo será de O(log4 q) operaciones básicas.

B.2 Ecuaciones cuadráticas en cuerpos finitos.


Dada una ecuación de la forma x2 + bx + c = 0, con coeficientes en un cuerpo Fq de

2
característica impar, podemos utilizar la fórmula x = −b± 2b −4c para calcular sus soluciones. Por
tanto, para resolver ecuaciones de este tipo, basta utilizar la proposición B.1 para determinar
si b2 − 4c es un cuadrado en Fq y, en caso afirmativo, calcular su raíz cuadrada aplicando el
algoritmo B.1.
Si la ecuación tiene coeficientes en F2n , no es posible aplicar este método. Sin embargo, vamos
a ver que este tipo de ecuaciones aparecen de manera natural al trabajar con curvas elípticas
sobre F2n , y presentaremos un método alternativo para resolverlas, siguiendo [8]. Supongamos
que tenemos una curva elíptica E/F2n , con ecuación de Weierstrass

E : y 2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6 .

Para generar un punto aleatorio de dicha curva, escogemos aleatoriamente un x ∈ F2n e


intentamos encontrar un y ∈ F2n tal que (x, y) ∈ E. Es decir, fijado un x ∈ F2n , buscamos una
solución de la ecuación
f (y) = y 2 + by + c = 0,

donde b = a1 x + a3 y c = −(x3 + a2 x2 + a4 x + a6 ).

44
n−1
Si b = 0, la ecuación anterior tiene siempre una única solución, dada por y = c2 .
Supondremos por tanto que b 6= 0, en cuyo caso existe b−1 y se obtiene

f (y) = 0 ⇔ b−2 f (y) = 0 ⇔ b−2 y 2 + b−1 y + cb−2 = 0 ⇔ g(b−1 y) = 0,

donde g(y) = y 2 + y + cb−2 . Es decir, y es una raíz de g si y sólo si by es una raíz de f , lo cual
nos permite restringir nuestro análisis a polinomios de la forma g(y).
Como g 0 (y) = 1 6= 0, el polinomio g(y) tiene dos raíces distintas en F2n . Una vez conocida
una raíz u de g, es fácil comprobar que la otra raíz es igual a u + 1. Nos preguntamos primero
si g(y) tiene raíces en F2n .

Definición B.1. Sea x ∈ F2n . La traza de x, denotada T r(x), se define como

n−1
n−1 i
T r(x) = x + x2 + · · · + x2 x2
X
=
i=0

Observación. La traza de un x ∈ F2n queda fija mediante cualquier σ ∈ Gal(F2n /F2 ) = hφi,
donde φ es el automorfismo de Frobenius, ya que queda fija mediante φ:

n−1 2 n−1 n n−1


φ(T r(x)) = (x + x2 + · · · + x2 ) = x2 + · · · + x2 + x2 = x2 + · · · + x 2 + x = T r(x).

Por tanto, T r(x) ∈ {0, 1} para todo x ∈ F2n .

Lema B.1. El polinomio g(y) = y 2 +y+d ∈ F2n [y] tiene una raíz u ∈ F2n si y sólo si T r(d) = 0.

Demostración. Supongamos que u ∈ F2n es una raíz de g. Entonces u2 +u+d = 0 ⇒ u2 +u = d.


n
Por tanto, T r(d) = T r(u2 + u) = T r(u2 ) + T r(u) = u2 + u = 2u = 0.
Para probar el recíproco, supongamos T r(d) = 0, y sea u ∈ F2n una de las raíces de g.
n n
Entonces 0 = T r(d) = T r(u2 + u) = u2 + u ⇒ u2 = u ⇒ u ∈ F2n .

Por el lema anterior, para saber si existe y tal que (x, y) ∈ E, habrá que comprobar si
T r(cb−2 ) = 0 (de no ser así, habrá que seleccionar un nuevo valor de x).
Supongamos que g(y) tiene raíces en F2n . Al estar trabajando sobre un cuerpo de
característica 2, sabemos que g(u) = 0 ⇔ u2 + u = cb−2 . Por tanto, para encontrar u deberemos
buscar la preimagen de cb−2 mediante la aplicación h : F2n −→ F2n tal que h(y) = y 2 + y.
Consideramos F2n como espacio vectorial sobre F2 . La aplicación h es lineal, ya que:

Si u, v ∈ F2n , entonces h(u + v) = (u + v)2 + (u + v) = u2 + v 2 + u + v = h(u) + h(v).

Si u ∈ F2n y λ ∈ F2 , entonces h(λu) = (λu)2 + (λu) = λu2 + λu = λh(u).

Para encontrar las raíces de g, fijamos una base de F2n y escribimos la matriz Ah de la
aplicación h, así como el vector d correspondiente al elemento cb−2 , ambos con respecto a dicha
base. Las dos raíces de g son las soluciones de la ecuación matricial Ah v = d.

45
C. Algoritmos auxiliares para el uso de curvas elípticas.
C.1 Selección de curvas elípticas criptográficamente buenas.
Para utilizar los criptosistemas del capítulo 3, es necesario decidir sobre qué curva elíptica
se va a trabajar, además de encontrar un punto P que genere un subgrupo de orden grande,
y típicamente primo. El objetivo de esta sección es proporcionar un método para seleccionar
dichos parámetros.
En primer lugar, fijamos un primo p y un cuerpo finito Fq , donde q = pd . Buscaremos una
curva elíptica definida sobre dicho cuerpo.
1: Elegimos aleatoriamente A, B ∈ Fq . Si 4A3 + 27B 2 = 0, hacemos una nueva elección. En
caso contrario, obtenemos la curva E : y 2 = x3 + Ax + B.
2: Calculamos n = |E(Fq )|, utilizando el algoritmo de Schoof.
3: Buscamos un primo r grande tal que E(Fq ) tenga un subgrupo de orden r (dicho subgrupo
será necesariamente cíclico). Para ello, intentamos expresar n = rs, con r primo y s menor o
igual que una cota prefijada. Una forma de hacer esto es ir dividiendo n por primos menores
que un determinado límite (tantas veces como sea posible) y comprobar si el r resultante
es primo. Si no lo es, volvemos al paso 1.
4: Buscamos un punto R ∈ E(Fq ) aleatorio, eligiendo al azar un x ∈ F y comprobando si
q q
3
f (x) = x + Ax + B es un cuadrado. Si lo es, tomamos R = (x, f (x)); de lo contrario
elegimos un nuevo valor de x.
5: Buscamos un punto P ∈ E(Fq ) con orden igual a r. Para ello, calculamos P = sR y
comprobamos si P 6= P∞ . Si es así, hemos terminado; si no, volvemos al paso 6.

Observación. El método descrito en esta sección ha sido el utilizado en las pruebas realizadas
como parte del trabajo. Además de programar la versión aquí expuesta, se ha adaptado el
algoritmo a los casos en que el cuerpo sobre el que se define la curva es de característica 2 ó 3.

C.2 Codificación de mensajes.


Varios de los criptosistemas descritos en el capítulo 3 requieren representar el texto plano
como un punto de una curva elíptica E definida sobre un cuerpo Fq . Nos gustaría hacer esto
de manera sistemática, para que un usuario legítimo del sistema pueda recuperar fácilmente el
mensaje en claro, m, si conoce su punto asociado Pm .
Partimos de una curva E con ecuación y 2 = x3 + a2 x2 + a4 x + a6 , donde a2 , a4 , a6 ∈ Fq .
Supondremos que el mensaje a enviar es un entero m en el rango 0 ≤ m < M , que q = pn es
grande y que p = char(Fq ) ≥ 3 (esta última hipótesis facilita la siguiente exposición, pero se
puede adaptar el algoritmo al caso de característica 2). A continuación se describe un algoritmo
probabilístico polinomial para embeber el mensaje m en la curva E.

46
Observación. No se conoce ningún algoritmo determinista polinomial en el número de bits
de q que cumpla esta misma función. Sin embargo, con algoritmos probabilísticos como el que
vamos a ver, es posible conseguir una proporción de fallos muy baja.

En primer lugar, fijamos un entero κ lo bastante grande para contentarnos con una
probabilidad de fallo aproximada de 21κ . En la práctica, suele bastar κ = 30 ó κ = 50.
Suponemos que el cuerpo Fq es tal que q > M κ. Escribimos los enteros 1, . . . , M κ como
mκ + j, con 0 ≤ m < M y 1 ≤ j < M y utilizamos algún método estándar para establecer
una biyección entre dichos enteros y un subconjunto de Fq . Una posibilidad es escribir cada
entero en base p y utilizar sus n dígitos, vistos como elementos de Fp , como coeficientes de un
polinomio de grado n − 1 correspondiente a un elemento de Fq .
De este modo, dado un número m, para cada j = 1, 2, . . . , κ obtenemos un elemento x ∈ Fq
asociado a mκ + j. Para dicho x, calculamos el lado derecho de

y 2 = f (x) = x3 + a2 x2 + a4 x + a6

y buscamos una raíz cuadrada de f (x), utilizando el método descrito en B.1. Si encontramos
un y tal que y 2 = f (x), tomamos Pm = (x, y). Si tal y no existe, incrementamos j y probamos
con el x correspondiente.
Si encontramos un x para el que f (x) es un cuadrado antes de que j se haga mayor que κ,
podemos recuperar m mediante la fórmula [ x̃−1
κ
], donde x̃ es el entero asociado a x mediante la
biyección entre enteros y elementos de Fq .
Se puede probar que f (x) es un cuadrado para aproximadamente la mitad de los x posibles.
Por tanto, la probabilidad de que este método termine sin encontrar un punto Pm cuya
coordenada x corresponda a un x̃ entre mκ + 1 y mκ + κ es tan solo de 21κ , aproximadamente.

47
Bibliografía
[1] R. Avanzi, C. Doche, T. Lange, K. Nguyen y F. Vercauteren, Handbook of elliptic and
hyperelliptic curve cryptography, 1a Ed., Chapman & Hall/CRC, Boca Raton, 2006.

[2] K. Ireland y M. Rosen, A classical introduction to modern number theory, 2a Ed., Springer,
New York, 1990.

[3] M. J. Jacobson, N. Koblitz, S. H. Silverman, A. Stein y E. Teske, Analysis of the Xedni


Calculus attack, Design, Codes and Cryptography, vol. 20, (2000), 41-64.

[4] N. Koblitz, A course in number theory and cryptography, 2a Ed., Springer, New York, 1994.

[5] A. K. Lenstra y E. R. Verheul, Selecting cryptographic key sizes, Journal of Cryptology,


vol. 14, (2001), 255–293.

[6] A. J. Menezes, P. C. van Oorschot y S. A. Vanstone, Handbook of applied cryptography, 5a


Ed., CRC Press, Boca Raton, 2001.

[7] NIST, Recommended elliptic curves for government use, http://csrc.nist.gov/groups/


ST/toolkit/documents/dss/NISTReCur.pdf.

[8] K. Pommerening, Quadratic Equations in Finite Fields of Characteristic 2, http://www.


staff.uni-mainz.de/pommeren/MathMisc/QuGlChar2.pdf.

[9] C. Ritzenthaler, Elliptic curves and applications to cryptography, notas de clase, Université
d’Aix-Marseille II, Marseille, 2011.

[10] D. Shanks, Class number, a theory of factorization, and genera, 1969 Number Theory
Institute (Proc. Sympos. Pure Math., State Univ. New York, Stony Brook, N.Y., 1969),
vol. 20, (1971), 415–440

[11] V. Shoup, A computational introduction to number theory and algebra, 2a Ed., Cambridge
University Press, Cambridge, 2009.

[12] J. H. Silverman, The Xedni Calculus and the elliptic curve discrete logarithm problem,
Design, Codes and Cryptography, vol. 20, (2000), 5-40.

[13] J. H. Silverman, The arithmetic of elliptic curves, 2a Ed., Springer, New York, 2009.

[14] W. A. Stein et al., Sage Mathematics Software (Version 5.12), The Sage Development
Team, 2013, http://www.sagemath.org.

[15] E. Teske, Speeding up Pollard’s rho method for computing discrete logarithms, en J. Buhler
(ed.), Proceedings of the third international symposium on algorithmic number theory,
Springer-Verlag, London, (1998), 541-554.

[16] L. C. Washington, Elliptic curves: number theory and cryptography, 2a Ed., Chapman &
Hall/CRC, Boca Raton, 2008.

48

You might also like