Matemáticas de Bolsillo: una Breve Introducción a tu Teléfono Móvil

De pequeños, o puede que incluso más de mayores, todos hemos querido ser dios alguna vez. En mi caso, la última vez que tuve este deseo fue hace unos meses, cuando un famoso cantante español declaró en televisión pública que “las matemáticas no sirven para nada”. Acorde a él, existiendo las calculadoras, estudiar matemáticas no supone sino una pérdida de tiempo. A cambio, argumentaba que sus canciones podrían ser objeto de estudio más útil. Esto, de la boca de alguien cuya frase más memorable es “Te camelo”. Como era de esperar, en mi condición de estudiante de matemáticas me invadió una ira implacable, y diseñé mi castigo divino para dicho individuo: darle una calculadora y mandarle a vivir en un mundo en el que no existiera ninguno de los avances que las matemáticas nos han permitido alcanzar. Y sobre todo, un mundo sin su querido “autotune”. Extremadamente cruel, lo sé.

De este panorama tragicómico podemos sin embargo extraer alguna conclusión más importante, y es que entender qué papel juegan las matemáticas en nuestra vida no es tarea fácil. En pos de dar una de miles posibles respuestas a esta pregunta, intentemos entender por ejemplo por qué este genio musical del siglo XXI puede tener su fortuna en una cuenta bancaria virtual, y por qué este dinero digital no puede ser robado alegremente por cualquier cazador de tesoros. Para ello, deberemos entrar en una rama de las matemáticas conocida como criptografía.

¿Qué es la criptografía? Ésta es la disciplina que se encarga de la codificación de mensajes entre dos partes de tal manera que el mensaje codificado resulte indescifrable a toda tercera parte ajena al proceso. No obstante, el cifrado y descifrado de mensajes secretos se puede dar en muchos ámbitos y camuflarse de muchas formas distintas, no todas ellas ligadas necesariamente a las matemáticas. Si inventáramos una colección de símbolos y lo pusiéramos en correspondencia con el alfabeto castellano, pasando a codificar nuestros mensajes como textos mediante estos símbolos (sabiendo que el receptor también dispone de nuestros símbolos y su correspondencia con el alfabeto), la única matemática latente en este proceso sería la biyección entre los conjuntos alfabeto castellano y estos símbolos inventados.

Sin embargo, podemos tomar otro ejemplo que por el contrario, esconderá un argumento puramente matemático bajo su funcionamiento. Bautizado en honor al inmortal Julio César, el cifrado César se usaba entre oficiales de su ejército para ocultar transmisiones de carácter bélico. El funcionamiento era el siguiente: a la hora de codificar, cada letra se debía sustituir por aquella que, avanzando en el alfabeto, estuviera a tres posiciones de ella. Es decir, la AA se codificaría como la DD, la BB como la EE, etc. Veamos cómo traducir este proceso al lenguaje matemático. Tomando el alfabeto castellano,

A={A,B,C,,X,Y,Z},\mathcal{A} = \{A, B, C, \dots, X, Y, Z\},
que cuenta con un total de veintisiete letras, debemos realizar tres pasos. A continuación, por motivos de claridad, y denotará un número y xx una letra cualquiera a codificar. El primero paso será asignar a cada letra del abecedario el número que indica su posición dentro del mismo (identificamos el 27 con el 0 debido a que en breve entraremos en aritmética modular):
α:A{1,,270}Z.\alpha: \mathcal{A} \rightarrow \{1, \dots, 27 \equiv 0\} \subset \mathbb{Z}.

En segundo lugar, aplicar a cada letra xx del mensaje, ya transformada mediante α\alpha, la función

τ(y)=y+3mod27.                (1)\tau(y) = y + 3\, mod27. \;\;\;\;\;\;\;\; (1)

Finalmente, desharíamos la correspondencia entre números y letras mediante α1\alpha^{-1}. Compactando el lenguaje, para codificar cada unidad del mensaje (es decir, en este caso, una letra), le aplicamos la función:

f(x)=α1(τ(α(x))).f(x) = \alpha^{-1}(\tau(\alpha(x))).

Por construcción, ff es biyectiva, y es esto lo que garantiza que para cada mensaje, su cifrado será único y su descifrado también. Por tanto, siempre que no cometamos errores operando, al aplicar f1f^{-1} obtendremos el mensaje original. La correspondencia única será indispensable para el funcionamiento de un buen cifrado, y garantizarla requerirá sutilezas en las que tendremos que fijarnos a la hora de enrevesar este método u otros cualesquiera. Buscando este fin, una opción sería cambiar la correspondencia que da α\alpha. O si ahora cada unidad del mensaje cifrado, en vez de ser letras fueran pares de letras, podríamos tomar una matriz y un vector

MM2(Z\27Z),(m1,m2)M2(Z\27Z)2M \in \mathbb{M}_{2}(\mathbb{Z} \backslash 27 \mathbb{Z}), (m_{1}, m_{2}) \in \mathbb{M}_{2}(\mathbb{Z} \backslash 27 \mathbb{Z})^{2}
y diseñar un algoritmo de funcionamiento similar al anterior. Denotando
A(x1,x2)=(x1,x2)A(x_{1}, x_{2}) = (x_{1}, x_{2})
podemos cifrar pares estos pares de letras mediante la operación F:(Z/27Z)2(Z/27Z)2:F: (\mathbb{Z} / 27 \mathbb{Z})^{2} \rightarrow (\mathbb{Z} / 27 \mathbb{Z})^{2}:
F((x1,x2))=A1(A((x1,x2))M+(m1,m2)).                (2)F((x_{1}, x_{2})) = A^{-1}(A((x_{1}, x_{2}))M + (m_{1}, m_{2})). \;\;\;\;\;\;\;\; (2)

De esta manera, tendríamos una manera unívoca de codificar mensajes cuyas unidades de cifrado son pares de letras. ¿O no? Fijándonos un poco, nos percatamos de que para que esta correspondencia sea única, FF deberá ser biyectiva, y esto solo ocurrirá si la matriz MM es invertible. Pero al contrario que en matrices de entradas racionales, en Z/27Z\mathbb{Z} / 27 \mathbb{Z} esto no significa que det(M)0\det(M) \neq 0, sino más bien, que det(M)\det(M) sea una unidad del anillo, excluyendo de este conjunto los divisores de cero del mismo. Resulta que estas dos nociones de matrices invertibles sí coinciden cuando las entradas de la matriz están en un cuerpo, pero a no ser que el tamaño del alfabeto sea un número primo, esta construcción no lo garantiza. Y si por otro lado, tuviéramos un abecedario de cardinal primo pero quisiéramos añadir (con el fin perfectamente legítimo de evitar confusiones en la lectura) signos de puntuación a los mensajes, el alfabeto resultante podría no tener cardinal primo, lo cual nos brinda de nuevo esta situación.

La moraleja de toda esta fábula es la siguiente: dependiendo de cuál sea el algoritmo para codificar del criptosistema (manera en la que nos referiremos a estos procesos de ahora en adelante), los conjuntos de elementos que podremos usar para asegurarnos de su correcto funcionamiento serán unos particulares. Estos conjuntos, ya mencionados pero no debidamente presentados, son:

  1. El alfabeto A\mathcal{A}, el conjunto de símbolos que estarán presentes en nuestros mensajes, ya sean letras, signos de puntuación, números…
  2. Los mensajes de entrada posibles M\mathcal{M} y los de llegada, N\mathcal{N}.
  3. Las posibles claves C\mathcal{C} con las que codificar los mensajes en M\mathcal{M}. En el caso (1), podríamos generalizar de tal manera que las claves sean los elementos de Z/27Z\mathbb{Z} / 27 \mathbb{Z}; y en cambio, en (2), C=GL(2,Z/27Z)×(Z/27Z)2\mathcal{C} = GL(2, \mathbb{Z} / 27 \mathbb{Z}) \times (\mathbb{Z} / 27 \mathbb{Z})^{2}. Aquí, GL(2,Z/27Z)GL(2, \mathbb{Z} / 27 \mathbb{Z}) denota las matrices 2×22 \times 2 invertibles con coeficientes en Z/27Z\mathbb{Z} / 27 \mathbb{Z}.
  4. Finalmente, para una clave fijada kk, se construye una función eke_{k} para cifrar el mensaje (en nuestros ejemplos, ff y FF), y una función para descifrar el mensaje dkd_{k} (de manera similar, las que serían f1f^{-1} y F1F^{-1}). Podríamos decir que existe una clave de descifrado kk', que en ambos casos (1) y (2), serían los inversos de la clave de cifrado. Por tanto, los últimos conjuntos los constituyen estas funciones de cifrado y descifrado asociadas a cada clave.

Es esencial entender que cuando hablemos de un criptosistema, este no será únicamente su función de cifrado o descifrado, sino todos estos conjuntos que instrínsecamente van ligados a ella. Si A\mathcal{A} cambiara de tamaño, pueden cambiar las posibles claves, y por tanto, las funciones asociadas. Si cambian los cimientos, cambia la casa que queremos construir.

Hasta ahora, todo se ha esgrimido desde el punto de vista de las partes que codifican. Pero solo por un momento, cambiemos de perspectiva: somos la tercera parte, la indeseada, nos hemos autoinvitado a esta fiesta de mensajes, y buscamos desmontar el algoritmo a partir de correspondencia que hemos interceptado. Para ello, observamos que la seguridad de los criptosistemas descritos se sustenta en dos pilares: cuál es la clave con la que hemos cifrado, y cuál es la función de cifrado para una clave cualquiera, ya que obtener la inversa a partir de ella es sencillo. Cuando son pocas las personas que poseen este conocimiento (como pueden ser los altos cargos de un ejército romano), la seguridad se basa en la confianza, en la idea de que estas variables serán inaccesibles para el enemigo. Pero, ¿qué ocurre cuando se desvela la función de cifrado, y el conjunto C\mathcal{C} es de tamaño pequeño? A base de probar las posibles claves acabaríamos dando con la correcta, la seguridad del criptosistema caería, y nuestra sería toda la información relatada en el mensaje. ¿Cómo podemos evitar este desenlace? O incluso más macabro, ¿podría existir un criptosistema multitudinario, global, en el que cada uno tenga su propia clave de cifrado, y aun sabiendo esta y cómo se cifra a partir de ella, no pudiera encontrarse la función de descifrado?

1. Clave pública y el Problema del Logaritmo Discreto

Pisamos el acelerador del tiempo y aterrizamos en el presente. Encontrar respuesta a este macabro escenario no es opción, sino necesidad. Ya no se trata únicamente de altos mandos militares o espías, sino de cada uno de nosotros. A diario, recibimos y mandamos mensajes, realizamos pagos, reservas y planes a través de Internet. Compartimos datos personales, muchos de los cuales, en manos ajenas, podrían suponer resultados indeseables en nuestra vida. Si no encontramos una manera virtualmente segura de introducir nuestros datos bancarios a la hora de hacer una compra en Amazon, podríamos perfectamente despertarnos al día siguiente para encontrarnos sin un duro. De la misma manera se presenta la idea de la mensajería segura: queremos que chatear sea tan privado como una conversación cara a cara, no que se asemeje a gritar entre dos balcones como dos vecinos que se entretienen tendiendo la colada. Y más allá, no solo queremos poder establecer conversaciones con gente de confianza de manera segura. Véase, ¿en qué quedaría el flirteo con desconocidos a través de aplicaciones de mensajería si fuéramos conscientes de que cualquier tercero puede leer nuestros traviesos mensajes? En resumidas cuentas, queremos poder establecer comunicación y transacción de datos segura con gente no necesariamente conocida. Y el modelo matemático que describe un sistema bajo el cual podemos operar así se conoce como criptografía de clave pública. La criptografía de clave pública también se denomina criptografía asimétrica, en contraste con la simétrica, que es la que se usa en ambos ejemplos de la sección anterior. En estos ejemplos, si se conocía la clave kk de cifrado, era un proceso bastante simple encontrar la función de descifrado (o la clave de descifrado) a partir de kk. Por lo tanto, para tener un sistema seguro, cada par de usuarios debía tener una clave diferente y solo podría haber intercambiado claves con otros usuarios mediante un canal seguro (ya que sin intercambio, no podría haber comunicación cifrada). En cambio, la criptografía de clave pública plantea un sistema alternativo:

  • Cada usuario AA tiene dos claves asociadas: una clave pública ee y una clave privada dd. Mientras que ee se compartiría con todos los usuarios de la red a través de un canal no necesariamente seguro, la privada se mantendría en secreto.
  • De manera similar al modelo simétrico, se construyen funciones de cifrado y descifrado fdf_{d} y fef_{e} a partir de las claves pública y privada (todos los usuarios saben como construir estas funciones a partir de sus claves).
  • Sin embargo, no se puede encontrar dd, y por tanto construir fdf_{d}, a partir de ee y fef_{e}.

De esta manera, usando la clave pública de AA, cualquier usuario de la red puede enviarle mensajes codificados mediante fef_{e}, pero solamente el propio AA dispondrá de su clave dd y podrá aplicar la función de descifrado correspondiente. Aparentemente, estamos ante una idea sólida, pero tras establecerla debiera surgir natural la pregunta:

¿Acaso existe un ejemplo de algoritmo que nos permite llevar el modelo a la realidad?

La pregunta es más que pertinente. No obstante, implícitamente en la descripción del modelo surge otra segunda pregunta que será la que convendrá responder antes:

¿Qué significa que no se pueda encontrar la clave privada dd?

Al ser el conjunto de claves el mismo para todos los usuarios, mientras este sea un conjunto finito, a base de probar todas las posibles claves, antes o después un atacante daría con la correcta y podría descifrar el mensaje. Es decir, de manera teórica siempre podríamos dar con la clave privada. Pero el diablo está en los detalles, y el detalle está en el adjetivo teórica. Si en la práctica el algoritmo computacional más eficiente para dar con esta clave tardara años en proveer de respuesta, a nivel realista la recompensa sería nimia. Descifrar el mensaje de manera tan tardía carece de importancia. Esta idea se conoce como la complejidad temporal de un algoritmo, y mide, dependiendo del tamaño de las variables entrada (es decir, su número de dígitos), lo que puede llegar a tardar un ordenador en realizar el algoritmo. Si la variable entrada es nn, pasándola a ceros y unos en binario, tendrá un número de dígitos de orden logn\log n, distinguimos:

  1. Algoritmos de tiempo polinomial O((logn)k)O((\log n)^{k}) fáciles de resolver.
  2. Algoritmos de tiempo exponencial O(eklogn)=O(nk)O(e^{k \log n}) = O(n^{k}), complejos de resolver.
  3. Algoritmos de tiempo subexponencial O(o(nk))O(o(n^{k})), menos complejos de resolver.

La diferencia no podría ser más notable. Mientras que para un dato de longitud 500, un algoritmo de tiempo polinomial 2logn2 \log n se resuelve en un cuarto de segundo, para un dato de longitud 50, un algoritmo de tiempo exponencial tardaría en resolverse más de 30 años. Hemos encontrado respuesta para nuestra segunda pregunta. Y ahora, podemos dársela a la primera. Si el algoritmo más eficiente para resolver un problema es de tiempo exponencial o subexponencial, hay seguridad. Así pues, debemos establecer un criptosistema en el cual obtener la clave privada sea equivalente a resolver un problema de esta índole. La factorización en primos de un entero y el criptosistema RSA constituyen un ejemplo de esto.

Pero nosotros trataremos otra manera de abordar la cuestión: mediante el problema del logaritmo discreto (PLD).
Para una primera formulación, deberemos establecer un primo pp, cuyo cuerpo asociado será Z/pZ\mathbb{Z} / p \mathbb{Z}. El grupo de unidades de este cuerpo es el grupo abeliano multiplicativo

Fp=Z/pZ\{0}F_{p}^{*} = \mathbb{Z} / p \mathbb{Z} \backslash \{0\}
y este, que se sabe cíclico, tendrá un generador al que llamaremos gg. Ahora bien, todo kFpk \in F_{p}^{*}, será de la forma k=gmk = g^{m} para un mZ/(p1)Zm \in \mathbb{Z} / (p-1) \mathbb{Z}. El problema del logaritmo discreto consiste en dado un kFpk \in F_{p}^{*}, encontrar el mm que cumple esta ecuación.

Un problema con una formulación tan simple aparenta tener una solución igualmente sencilla. Más aún cuando el recíproco, dado un mZ/(p1)Zm \in \mathbb{Z} / (p-1) \mathbb{Z}, encontrar gmmodpg^{m} mod p, es efectivamente fácil de resolver computacionalmente. Nada más lejos de la realidad, pues a medida que aumenta el primo que hemos fijado, encontrar la solución se vuelve (esperamos que exponencialmente) más difícil. Esta operación no sigue ningún patrón discernible y el comportamiento que presentan estas potencias pueden llegar a resultar erráticas. Para ilustrarlo, pongámonos en el caso p=1907p = 1907, con generador del grupo de unidades g=2g = 2.

Gráfica de la función $f(x) = 2^{x} mod 1907$.

Gráfica de la función f(x)=2xmod1907f(x) = 2^{x} mod 1907.

Tal y como queríamos, probar los valores uno a uno hasta encontrar el deseado es un problema de tiempo exponencial. Es a raíz de ello que comienza la búsqueda de alternativas menos burdas para resolver el PLD. Entran en juego el algoritmo Baby Step - Giant Step atribuido a Daniel Shanks en 1971, y a partir de éste, el algoritmo de Pohlig y Hellman, publicado en 1978, ambos resolviendo el problema en tiempo subexponencial. Y efectivamente, en 1997 Victor Shoup finalmente demostraría que una cota inferior para resolver el PLD en un grupo arbitrario era de tiempo subexponencial, lo que garantiza su seguridad computacional. A modo de conclusión, lo que resta ahora encontrar es un algoritmo cuya resolución implique resolver el PLD, y el ejemplo base de esto es el intercambio de claves Diffie-Hellman, descrito por primera vez en 1971. Este es un algoritmo a través del cual dos usuarios AA y BB establecen una clave secreta común kk para comunicarse:

  • Tenemos fijado un primo pp, FpF_{p}^{*} y un generador gg.
  • Tanto AA como BB tienen claves privadas dAd_{A} y dBd_{B} y claves públicas eA=gdAe_{A} = g^{d_{A}} y eB=gdBe_{B} = g^{d_{B}}.
  • Usando dAd_{A} y dBd_{B} , ambos calculan k=gdAdB=(eA)dB=(eB)dAk = g^{d_{A}d_{B}} = (e_{A})^{d_{B}} = (e_{B})^{d_{A}}, que será la clave común.

Los parámetros públicos o al alcance de un atacante son eAe_{A} y eBe_{B}, pero calcular kk a partir de estos dos supone esencialmente (no está probado, pero se cree que ambos problemas son equivalentes) resolver el PLD en FpF_{p}^{*}, y por tanto, ambos usuarios pueden respirar tranquilos: su comunicación será computacionalmente segura.

2. Optimizando criptografía: las curvas elípticas

Podemos habernos percatado, al describir el PLD, de que hemos recurrido en particular al grupo multiplicativo FpF_{p}^{*}. No obstante, el planteamiento del problema es igual de válido si se formula para cualquier otro grupo cíclico G=<g>G = <g> de orden n=p1n = p - 1. Sin ir más lejos, un grupo con estas características es Z/nZ=<1>\mathbb{Z} / n\mathbb{Z} = <1> con la suma como operación interna. ¿Por qué no cifrar con este grupo como base del problema? Porque en este grupo, resolver el PLD es trivial. Si la clave pública Diffie-Hellman fuera mm, la clave privada sería el propio mm. Pero como todos los grupos cíclicos de un mismo orden son isomorfos, podríamos resolver el problema para un FpF_{p}^{*} cualquiera explicitando un isomorfismo

(Fp,)(Z/nZ,+)                (3)(F_{p}^{*}, \cdot) \Rightarrow (\mathbb{Z} / n \mathbb{Z}, +) \;\;\;\;\;\;\;\; (3)
y viendo cuál es la imagen de la clave pública. Por lo tanto, la seguridad de nuestros criptosistemas también residirá en cuán fácil o difícil sea encontrar este isomorfismo. ¿Y en qué podremos notar este aumento o disminución de seguridad en la práctica? Por ejemplo, en el tamaño de las claves que debamos usar, ya que recordando lo previamente expuesto, la complejidad temporal es función del tamaño de las variables entrada. Es decir, si encontramos grupos de orden nn para los cuales establecer el isomorfismo al anillo cociente sea más complicado que para FpF_{p}^{*}, habremos conseguido un aumento de seguridad en el proceso. Y un grupo candidato a cumplir estas cualidades es el formado por los puntos de una curva elíptica. Bajo este pretexto, nace la criptografía en curva elípticas.

Las curvas elípticas son pintorescos objetos de geometría algebraica con un gran interés. Formalmente, son pares (E,O)(E, O) donde EE es una variedad algebraica proyectiva suave de género uno sobre un cuerpo KK y OEO \in E un punto de la misma. Estos objetos tienen la característica de que admiten un modelo plano EE dado por cúbicas de Weierstrass, lo que permite pintar EE en un plano.

Gráficamente, OO lo entendemos como un punto estará arbitrariamente distante en el eje vertical, por lo que para unir cualquier punto PP de la curva con OO, habrá que trazar la recta vertical desde PP, y esta intersecará con OO en el infinito. Sin embargo, en caso de que la mayoría de estos conceptos sean ajenos al lector, no hay que preocuparse. Lo crucial es que podemos expresar este par de elementos de la forma mucho más directa:

E:y2=x3+Ax+BdondeA,BK,O=[0,1,0].E: y^{2} = x^{3} + Ax + B \\ donde A, B \in K, O = [0, 1, 0].

La curva elíptica sobre $\mathbb{Q}$, $y^{2} = x^{3} - x$.

La curva elíptica sobre Q\mathbb{Q}, y2=x3xy^{2} = x^{3} - x.

Estas expresiones parecen entrañar una incongruencia. El mismo lector de antes podría preguntarse por qué la ecuación EE tiene dos variables y OO tres coordenadas. La respuesta es que el punto del infinito se expresa en sus coordenadas proyectivas, antes de deshomogeneizar la expresión de la cúbica. Esto es, hacer un cambio de variables para reducirlas en número a partir de una expresión del estilo:

E:Y2Z=X3+AXZ2+BZ3.                (4)E: Y^{2}Z = X^{3} + AXZ^{2} + BZ^{3}. \;\;\;\;\;\;\;\; (4)

En este punto de la narrativa, procede presentar la gran peculiaridad de las curvas elípticas: que admiten una operación entre sus puntos que los dota de estructura de grupo abeliano. Para sumar dos puntos PP y QQ de la curva, los unimos mediante una recta, que intersecará a la curva en un tercer punto. Uniendo este punto con OO mediante una recta vertical, obtenemos un tercer punto una vez más en la curva, y este será P+QP + Q. Los terceros puntos que se mencionan no tienen por qué ser diferentes, y pueden ser ellos mismos. Esto es fruto del teorema de multiplicidad de Bezóut para curvas. Y como todo en matemáticas, si quisiéramos evitar todo el camino algebraico y bastarnos con esta interpretación, deberíamos demostrar de cero que esta operación efectivamente constituye un grupo abeliano con OO como elemento neutro. Sin embargo, el proceso para demostrar que la construcción cumple todas las propiedades de grupo abeliano geométricamente hablando no es sencillo, pero haber sido capaces de dar otro punto de vista a esta operación de puntos nos permite avanzar teniendo como apoyo nuestra intuición. Aunque sí mencionaremos que ver que OO es efectivamente elemento neutro es una construcción entretenida para la cual solo requerimos de sumar cualquier punto a OO y ver el resultado.

Suma de los puntos $P = (0, 0)$ y $Q = (−1, −1)$ en la curva elíptica sobre $\mathbb{Q}$, $E : y^{2} = x^{3} − 2x$.

Suma de los puntos P=(0,0)P = (0, 0) y Q=(1,1)Q = (−1, −1) en la curva elíptica sobre Q\mathbb{Q}, E:y2=x32xE : y^{2} = x^{3} − 2x.

Tomémonos un respiro llegados aquí, para volver a nuestro cometido criptográfico. Recordemos que el propósito con el que introducimos las curvas elípticas es que puedan sustituir a los grupos FpF_{p}^{*} en algoritmos como el intercambio Diffie-Hellman. Como en principio los puntos de una curva elíptica pueden ser infinitos, debemos buscar reducir esta cantidad. Para ello, comenzamos tomando K=Z/pZ\mathbb{K} = \mathbb{Z} / p \mathbb{Z}. Así obtendremos curvas elípticas con un máximo de 2p+12p + 1 puntos con coordenadas en Z/pZ\mathbb{Z} / p \mathbb{Z} (ya que puede haber puntos en el cierre algebraico que no pertenezcan al cuerpo base en sí, conjunto que denotamos por E(Z/pZ)E(\mathbb{Z} / p \mathbb{Z}). El caso en el que 2p+1=E(Z/pZ)2p + 1 = |E(\mathbb{Z} / p \mathbb{Z})| es el caso en el que al sustituir todos los posibles valores de x,y2x, y^{2} tiene dos raíces, añadiendo después a estos 2p2p candidatos el punto OO. En la realidad, por cómo es la densidad de cuadrados en los cuerpos finitos, este número de puntos será de orden pp y no 2p2p. Esto nos podría llevar a pensar que mediante estos puntos, sería posible equiparar los mensajes que podríamos codificar en FpF_{p}^{*} y en una curva elíptica (E,O)(E, O) sobre Z/pZ\mathbb{Z} / p \mathbb{Z}. Y será así, pero debemos obrar con cautela, prestando atención a los detalles.

Para establecer un análogo al PLD en curvas elípticas, necesitamos un grupo abeliano cíclico y finito. Una idea sería partir de un punto de la curva elíptica con coordenadas (x,y)(Z/pZ)(x, y) \in (\mathbb{Z} / p \mathbb{Z}) y sumarlo consigo mismo hasta obtenerlo de nuevo (como hay alrededor de pp puntos en E(Z/pZ)E(\mathbb{Z} / p \mathbb{Z}), este proceso debiera acabar). Por construcción, el grupo sería cíclico con generador (x,y)(x, y), y toda su órbita serían los elementos del mismo. Aquí, sin embargo, hay latentes dos comprobaciones:

  • En primer lugar, queremos codificar usando los puntos de la curva con coordenadas en Z/pZ\mathbb{Z} / p \mathbb{Z}, de los cuales sí sabemos que hay un número finito. En cambio, desconocemos si al sumar un punto consigo mismo un número entero de veces, el resultado también tendrá ambas coordenadas en este mismo cuerpo.
  • Por esto mismo, puede haber una cantidad de puntos en el subgrupo mucho mayor a pp, y perderíamos el orden buscado.

No es difícil comprobar el primer punto, ya que se trata de operar con rectas y sustituir en la cúbica asociada a la curva, estando todas estas operaciones definidas sobre Z/pZ\mathbb{Z} / p \mathbb{Z}. Y esto también garantiza el segundo, por los argumentos de orden mencionados anteriormente. Sin embargo, notar que precisamos de estas condiciones es un buen recordatorio de que las cosas no son tan evidentes como pudieran parecer. Procede entonces dar un análogo del PLD en curvas elípticas:

Problema del logaritmo discreto en curvas elípticas (PLDCE). Fijamos una curva elíptica EE sobre Z/pZ\mathbb{Z} / p \mathbb{Z} y un punto PE(Z/pZ)P \in E(\mathbb{Z} / p \mathbb{Z}) tal que <P>=G<P> = G sea de orden similar a pp. Dado QGQ \in G, encontrar dZd \in \mathbb{Z} tal que dP=QdP = Q.

Con este enunciado, para emular el intercambio Diffie-Hellman, tanto AA como BB procederían exactamente igual al caso FpF_{p}^{*}, con la única diferencia de que la operación que realizan ahora es la que se define en la curva elíptica.

Después de tal proceso de construcción, sería una decepción no pequeña que resultara más fácil resolver el PLDCE que el PLD, y afortunadamente es una decepción a la que no nos tenemos que enfrentar. Un trabajo laborioso, que aquí no expondremos, permite comprobar que las curvas elípticas son más seguras computacionalmente para criptografía que los cuerpos finitos, y podremos operar en ellas con las ventajas que se han mencionado a lo largo del artículo. Aun así, digno de mención es que no toda curva elíptica resulta igual de segura, y que existen maneras de construirlas asegurándonos de que no son vulnerables a ataques conocidos contra el PLDCE. Como sería de esperar, estos ataques suelen consistir en reducir el problema del logaritmo en la curva elíptica a otras estructuras más sencillas, como los cuerpos finitos en sí. Pero en una de estas curvas bien elegidas, no se conoce ningún algoritmo en tiempo subexponencial que pueda resolver el problema.

De todo este asunto, la gran ironía es que la teoría de curvas elípticas existía mucho antes de que se planteara su uso como herramienta criptográfica. Quién iba a pensar que años después, irían como anillo (no algebraico) al dedo.

3. Conclusión

Hoy en día, organismos como el Ministerio de Comercio de los Estados Unidos usan y recomiendan el uso de la criptografía en curvas elípticas. Así mismo, Bitcoin establece la curva sep256k1 para asegurarse, mediante algoritmos de clave pública, de la procedencia legítima de transacciones. Este tipo de criptografía se hace hueco el mundo virtual y va ganando terreno frente a métodos más tradicionales. Pero va más allá. La computación cuántica es un futuro incierto pero no inimaginablemente lejano, y con ella, la factorización en primos o el PLD dejan de ser problemas seguros. La criptografía debe evolucionar junto a la computación, y de entre los posibles métodos que ya se han propuesto para poder codificar bajo un paradigma cuántico, las curvas elípticas nos brindan una posible respuesta. No obstante, caemos al final en lo que evidenciamos en la introducción. Todo esto parece orquestado y pensado para una cúpula, un pequeño conjunto de élites informáticas y económicas. Después de todo, ¿cuándo hemos tenido que realizar una operación matemática antes de mandar un mensaje? ¿Acaso no tenía razón nuestro famoso cantante y en el día a día, las matemáticas son inútiles?

Y aquí, a estas alturas del partido, entra a este juego tu teléfono móvil. Te presento a Curve25519:

y2=x3+486662x2+x,y^{2} = x^{3} + 486662x^{2}+ x,
que pertenece al tipo de curvas elípticas conocidas como Curvas de Montgomery. Esta en particular está definida sobre el cuerpo primo de 2255192^{255} - 19 elementos, y sin que lo sepas, es de tus mejores amigas. Es esta curva la que Whatsapp decidió que usaría para establecer los intercambios de clave mediante el PLCDE entre sus usuarios. Revisitemos por última vez el principio, y recordemos que aunque el recorrido puede ser un entramado de matemática e informática, el primer tornillo y la última tuerca del proceso son operaciones que manejan letras y símbolos que cualquiera de nosotros puede entender, independientemente de nuestros estudios. Y es que somos todos nosotros los que día sí y día también realizamos estas operaciones al probar que no somos robots pasando una imagen a texto, introduciendo un código de cuatro letras y números para realizar un Bizum, cuando ciertos caracteres no son aceptados a la hora de establecer una contraseña…

Las matemáticas se esconden en nuestro entorno, y para localizarlas hay que saber hablar su mismo idioma. Un idioma con mucho vocabulario, enrevesado y difícil de entender muchas veces incluso para aquellos que las estudiamos. En nuestro juego divino, debemos ser justos también, y comprender que es algo natural dudar de la vigencia de las matemáticas más allá de hacer operaciones. Por ello, sobre aquellos que las entienden mucho más que gente como yo, cae una responsabilidad inmensa: hacer un uso justo y ético de ellas, a pesar de que gran parte de la población no seremos capaces ni de vislumbrar la relevancia que pueden llegar a tener sus pensamientos, y por tanto, tampoco seremos capaces de apreciarlos. Y aunque discurrir sobre ética matemática es tan interesante como la criptografía, señoras y señores, esa historia es para otro día.