Articulo de referencia

Multiplicación de puntos de curva elíptica

La multiplicación escalar en curvas elípticas consiste en sumar sucesivamente un punto a sí mismo a lo largo de una curva elíptica . Se utiliza en criptografía de curva elíptica...

La multiplicación escalar en curvas elípticas consiste en sumar sucesivamente un punto a sí mismo a lo largo de una curva elíptica . Se utiliza en criptografía de curva elíptica (ECC). La literatura la presenta como multiplicación escalar , tal como se expresa en la matriz hessiana de una curva elíptica . Otro nombre común para esta operación es multiplicación de puntos en curvas elípticas , pero esto puede dar la impresión errónea de que se trata de una multiplicación entre dos puntos.

Lo esencial

Dada una curva E definida por una ecuación en un campo finito (como E : = + ax + b ), la multiplicación de puntos se define como la suma repetida de un punto a lo largo de esa curva. Denotemos como nP = P₁ + P₂ + P₃ + … + Pₙ para algún escalar (entero) n y un punto P = ( x , y ) que se encuentra sobre la curva E. Este tipo de curva se conoce como curva de Weierstrass .

La seguridad de la criptografía de curva elíptica moderna depende de la dificultad de determinar n a partir de Q = nP, dados los valores conocidos de Q y P, si n es grande (conocido como el problema del logaritmo discreto en curva elíptica, por analogía con otros sistemas criptográficos ). Esto se debe a que la suma de dos puntos en una curva elíptica (o la suma de un punto consigo mismo) produce un tercer punto cuya ubicación no guarda una relación inmediatamente obvia con las ubicaciones de los dos primeros, y al repetir este proceso muchas veces se obtiene un punto nP que puede estar prácticamente en cualquier lugar. Intuitivamente, esto es similar a que, si se tiene un punto P en un círculo, sumar 42,57 grados a su ángulo puede dar como resultado un punto "no muy lejos" de P , pero sumar 1000 o 1001 veces 42,57 grados dará como resultado un punto que requiere un cálculo algo más complejo para hallar el ángulo original. Invertir este proceso, es decir, dado Q=nP y P , y determinar n , solo se puede hacer probando todos los posibles n, un esfuerzo que es computacionalmente intratable si n es grande.

Operaciones puntuales

Operaciones puntuales con curvas elípticas: suma (mostrada en la faceta 1), duplicación (facetas 2 y 4) y negación (faceta 3).

Existen tres operaciones comúnmente definidas para los puntos de una curva elíptica: suma, duplicación y negación.

Apunta al infinito

Apuntar al infinitoO{\displaystyle {\mathcal {O}}}es el elemento neutro de la aritmética de curvas elípticas. Sumarlo a cualquier punto da como resultado ese otro punto, incluyendo sumar el punto en el infinito a sí mismo. Es decir:

O+O=OO+PAG=PAG{\displaystyle {\begin{aligned}{\mathcal {O}}+{\mathcal {O}}={\mathcal {O}}\\{\mathcal {O}}+P=P\end{aligned}}}

El punto en el infinito también se escribe como 0 .

Negación del punto

La negación de un punto consiste en encontrar un punto tal que, al sumarlo a sí mismo, dé como resultado un punto en el infinito ( O{\displaystyle {\mathcal {O}}} ).

PAG+(PAG)=O{\displaystyle {\begin{aligned}P+(-P)={\mathcal {O}}\end{aligned}}}

Para curvas elípticas de la forma E : y 2 = x 3 + ax + b , la negación es un punto con la misma coordenada x pero con la coordenada y negada :

(incógnita,y)+((incógnita,y))=O(incógnita,y)+(incógnita,y)=O(incógnita,y)=(incógnita,y){\displaystyle {\begin{aligned}(x,y)+(-(x,y))&={\mathcal {O}}\\(x,y)+(x,-y)&={\mathcal {O}}\\(x,-y)&=-(x,y)\end{aligned}}}

Suma de puntos

Con dos puntos distintos, P y Q , la suma se define como la negación del punto resultante de la intersección de la curva E y la línea recta definida por los puntos P y Q , dando como resultado el punto R. [ 1 ]

PAG+Q=R(incógnitapag,ypag)+(incógnitaq,yq)=(incógnitar,yr){\displaystyle {\begin{aligned}P+Q&=R\\(x_{p},y_{p})+(x_{q},y_{q})&=(x_{r},y_{r})\end{aligned}}}

Suponiendo que la curva elíptica, E , está dada por = + ax + b , esto se puede calcular como:

λ=yqypagincógnitaqincógnitapagincógnitar=λ2incógnitapagincógnitaqyr=λ(incógnitapagincógnitar)ypag{\displaystyle {\begin{aligned}\lambda &={\frac {y_{q}-y_{p}}{x_{q}-x_{p}}}\\x_{r}&=\lambda ^{2}-x_{p}-x_{q}\\y_{r}&=\lambda (x_{p}-x_{r})-y_{p}\\\end{aligned}}}

Estas ecuaciones son correctas cuando ninguno de los puntos es el punto en el infinito ,O{\displaystyle {\mathcal {O}}}y si los puntos tienen coordenadas x diferentes (no son inversos mutuos). Esto es importante para el algoritmo de verificación ECDSA, donde el valor hash podría ser cero.

Duplicación de puntos

Cuando los puntos P y Q coinciden (en las mismas coordenadas), la suma es similar, excepto que no hay una línea recta bien definida que pase por P , por lo que la operación se cierra utilizando un caso límite, la tangente a la curva, E , en P.

Esto se calcula como se indicó anteriormente, tomando derivadas (dE/dx)/(dE/dy): [ 1 ]

λ=3incógnitapag2+a2ypag{\displaystyle \lambda ={\frac {3x_{p}^{2}+a}{2y_{p}}}}

donde a proviene de la ecuación definitoria de la curva, E , arriba.

Multiplicación de puntos

La forma más sencilla de calcular la multiplicación de puntos es mediante la suma repetida. Sin embargo, existen métodos más eficientes para calcularla.

Duplicar y sumar

El método más sencillo es el método de duplicar y sumar, [ 2 ] similar al de elevar al cuadrado y multiplicar en la exponenciación modular . El algoritmo funciona de la siguiente manera:

Para calcular sP , comenzamos con la representación binaria de s :s=s0+2s1+22s2++2norte1snorte1{\displaystyle s=s_{0}+2s_{1}+2^{2}s_{2}+\cdots +2^{n-1}s_{n-1}}, dondes0 .. snorte1{0,1},norte=registro2s{\displaystyle s_{0}~..~s_{n-1}\in \{0,1\},n=\lceil \log _{2}{s}\rceil }.

  • Algoritmo iterativo, índice creciente:
let bits = bit_representation(s) # el vector de bits (desde LSB hasta MSB) que representa s let res =O{\displaystyle {\begin{aligned}{\mathcal {O}}\end{aligned}}}# apunta al infinito sea temp = P # rastrea el valor P duplicado para bit en bits: si bit == 1: res = res + temp # suma de puntos temp = temp + temp # doble retorno res
  • Algoritmo iterativo, índice decreciente:
let bits = bit_representation(s) # el vector de bits (desde LSB hasta MSB) que representa s let i = length(bits) - 2 let res = P while (i >= 0): # recorriendo desde el segundo MSB hasta LSB res = res + res # doble si bits[i] == 1: res = res + P # sumar i = i - 1 retorno res

Tenga en cuenta que ambos métodos iterativos mencionados anteriormente son vulnerables al análisis de tiempos. Consulte el método de Montgomery Ladder a continuación para ver un enfoque alternativo.

  • Algoritmo recursivo:
El algoritmo f(P, d) es: si d = 0, entonces devuelve 0 (cálculo completado) ; si no, si d = 1 , entonces devuelve P; si no, si d mod 2 = 1 , entonces devuelve point_add(P, f(P, d - 1)) (suma cuando d es impar); si no , devuelve f(point_double(P), d / 2) (duplicación cuando d es par).

donde f es la función de multiplicación, P es la coordenada a multiplicar y d es el número de veces que se suma la coordenada a sí misma. Ejemplo: 100P se puede escribir como 2(2[P + 2(2[2(P + 2P)])]) y, por lo tanto, requiere seis operaciones de doble precisión y dos operaciones de suma. 100P sería igual a f(P, 100) .

Este algoritmo requiere log 2 ( d ) iteraciones de duplicación y suma de puntos para calcular la multiplicación completa de puntos. Existen muchas variaciones de este algoritmo, como el uso de una ventana, una ventana deslizante, NAF, NAF-w, cadenas vectoriales y la escalera de Montgomery.

Método de ventana

En la versión con ventana de este algoritmo, [ 2 ] se selecciona un tamaño de ventana w y se calcula todo2w{\displaystyle 2^{w}}valores dedPAG{\displaystyle dP}parad=0,1,2,,2w1{\displaystyle d=0,1,2,\dots ,2^{w}-1}El algoritmo ahora utiliza la representaciónd=d0+2wd1+22wd2++2metrowdmetro{\displaystyle d=d_{0}+2^{w}d_{1}+2^{2w}d_{2}+\cdots +2^{mw}d_{m}}y se convierte

Q ← 0 para i desde m hasta 0 hacer Q ← punto_doble_repetición(Q, w) Si d i > 0 , entonces Q ← point_add(Q, d i P) # utilizando el valor precalculado de d i P, devolver Q

Este algoritmo tiene la misma complejidad que el método de duplicar y sumar, con la ventaja de utilizar menos sumas de puntos (que en la práctica son más lentas que la duplicación). Normalmente, el valor de w se elige bastante pequeño, lo que hace que la etapa de precomputación sea un componente trivial del algoritmo. Para las curvas recomendadas por el NIST,w=4{\displaystyle w=4}suele ser la mejor opción. La complejidad total para un número de n bits se mide comonorte+1{\displaystyle n+1}dobles de punto y2w2+nortew{\displaystyle 2^{w}-2+{\tfrac {n}{w}}}sumas de puntos.

Método de ventana deslizante

En la versión de ventana deslizante, buscamos intercambiar adiciones de puntos por duplicaciones de puntos. Calculamos una tabla similar a la de la versión de ventana, excepto que solo calculamos los puntos.dPAG{\displaystyle dP}parad=2w1,2w1+1,,2w1{\displaystyle d=2^{w-1},2^{w-1}+1,\dots ,2^{w}-1}En efecto, solo estamos calculando los valores para los que está activado el bit más significativo de la ventana. El algoritmo luego utiliza la representación original de doble suma ded=d0+2d1+22d2++2metrodmetro{\displaystyle d=d_{0}+2d_{1}+2^{2}d_{2}+\cdots +2^{m}d_{m}}.

Q ← 0 para i desde m hasta 0 hacer si d i = 0 entonces Q ← punto_doble(Q) de lo contrario t ← extrae j (hasta w − 1) bits adicionales de d (incluido d i ) i ← i − j si j < w entonces Realizar doble suma usando t Devuelve Q de lo contrario Q ← punto_doble_repetición(Q, w) Q ← punto_añadir(Q, tP) devolver Q

Este algoritmo tiene la ventaja de que la etapa de precomputación es aproximadamente la mitad de compleja que el método de ventana normal, a la vez que intercambia adiciones de puntos más lentas por duplicaciones de puntos. En efecto, hay pocas razones para usar el método de ventana en lugar de este enfoque, excepto que el primero se puede implementar en tiempo constante. El algoritmo requierew1+norte{\displaystyle w-1+n}dobles de puntos y como máximo2w11+nortew{\displaystyle 2^{w-1}-1+{\tfrac {n}{w}}}sumas de puntos.

Método de forma no adyacente w -aria ( w NAF)

En la forma no adyacente, nuestro objetivo es aprovechar el hecho de que la resta de puntos es tan fácil como la suma de puntos para realizar menos operaciones (de cualquiera de las dos) en comparación con un método de ventana deslizante. El NAF del multiplicandod{\displaystyle d}debe calcularse primero con el siguiente algoritmo

i ← 0 mientras (d > 0) hacer si (d mod 2) = 1 entonces d i ← d mod 2 w d ← d − d i sino d i = 0 d ← d/2 i ← i + 1 devolver (d i−1 , d i-2 , ..., d 0 )

Donde la función módulo con signo mods se define como

Si (d mod 2 w ) > = 2 w−1 , devolver (d mod 2 w ) − 2 w; de lo contrario, devolver d mod 2 w.

Esto produce el NAF necesario para realizar ahora la multiplicación. Este algoritmo requiere el cálculo previo de los puntos.{1,3,5,,2w11}PAG{\displaystyle \lbrace 1,3,5,\dots ,2^{w-1}-1\rbrace P}y sus aspectos negativos, dondePAG{\displaystyle P}es el punto que se va a multiplicar. En las curvas típicas de Weierstrass, siPAG={incógnita,y}{\displaystyle P=\lbrace x,y\rbrace }entoncesPAG={incógnita,y}{\displaystyle -P=\lbrace x,-y\rbrace }. Por lo tanto, en esencia, los negativos son baratos de calcular. A continuación, el siguiente algoritmo calcula la multiplicacióndPAG{\displaystyle dP}:

Q ← 0 para j ← i − 1 hasta 0 hacer Q ← punto_doble(Q) si (d j != 0) Q ← point_add(Q, d j P) devuelve Q

El wNAF garantiza que en promedio habrá una densidad de1w+1{\displaystyle {\tfrac {1}{w+1}}}sumas de puntos (ligeramente mejor que la ventana sin signo). Requiere 1 duplicación de punto y2w21{\displaystyle 2^{w-2}-1}sumas de puntos para el preprocesamiento. El algoritmo luego requierenorte{\displaystyle n}duplicaciones de puntos ynortew+1{\displaystyle {\tfrac {n}{w+1}}}suma de puntos para el resto de la multiplicación.

Una propiedad del NAF es que tenemos la garantía de que cada elemento distinto de cerodi{\displaystyle d_{i}}va seguido de al menosw1{\displaystyle w-1}ceros adicionales. Esto se debe a que el algoritmo borra los valores inferiores.w{\displaystyle w}trozos ded{\displaystyle d}con cada resta de la salida de la función mods . Esta observación puede utilizarse para varios propósitos. Después de cada elemento distinto de cero, los ceros adicionales pueden estar implícitos y no es necesario almacenarlos. En segundo lugar, las múltiples divisiones seriales por 2 pueden reemplazarse por una división por2w{\displaystyle 2^{w}}después de cada valor distinto de cerodi{\displaystyle d_{i}}elemento y dividir por 2 después de cada cero.

Se ha demostrado que mediante la aplicación de un ataque de canal lateral FLUSH+RELOAD en OpenSSL , se puede revelar la clave privada completa después de realizar un análisis de temporización de caché contra tan solo 200 firmas realizadas. [ 3 ]

Escalera de Montgomery

El método de la escalera de Montgomery [ 4 ] calcula la multiplicación de puntos en un número fijo de operaciones. Esto puede ser beneficioso cuando la temporización, el consumo de energía o las mediciones de bifurcación están expuestas a un atacante que realiza un ataque de canal lateral . El algoritmo utiliza la misma representación que la de la operación de doble suma.

R 0 ← 0 R 1 ← P para i desde m hasta 0 hacer si d i = 0 entonces R 1 ← point_add(R 0 , R 1 ) R 0 ← punto_doble(R 0 ) de lo contrario R 0 ← punto_añadido(R 0 , R 1 ) R 1 ← punto_doble(R 1 ) // propiedad invariante para mantener la corrección assert R 1 == point_add(R 0 , P) return R 0

Este algoritmo tiene, en efecto, la misma velocidad que el método de duplicar y sumar, con la diferencia de que calcula el mismo número de sumas y duplicaciones de puntos, independientemente del valor del multiplicando d . Esto significa que, a este nivel, el algoritmo no pierde información a través de bifurcaciones ni consume energía.

Sin embargo, se ha demostrado que mediante la aplicación de un ataque de canal lateral FLUSH+RELOAD en OpenSSL, se puede revelar la clave privada completa después de realizar una comprobación de temporización de caché contra una sola firma a un costo muy bajo. [ 5 ]

Cadenas más largas

El uso de cadenas de Lucas proporciona una secuencia optimizada de duplicación y suma en comparación con la escalera de Montgomery, que es más rápida en múltiplos mayores (cadenas más largas). Este método se denomina "PRAC". Montgomery también publica PRAC, siendo GMP-ECM la " implementación de referencia ". [ 6 ] DJ Bernstein menciona varios esquemas de este tipo en 2017. [ 7 ] : § 4.8.2

Escalera de Montgomery de tiempo constante

La seguridad de una implementación criptográfica puede verse amenazada por los llamados ataques de temporización , que explotan las características de temporización dependientes de los datos de la implementación. Las máquinas que ejecutan implementaciones criptográficas consumen cantidades variables de tiempo para procesar diferentes entradas, por lo que los tiempos varían según la clave de cifrado. Para resolver este problema, los algoritmos criptográficos se implementan de forma que se elimina la característica de temporización variable dependiente de los datos de la implementación, lo que da lugar a las llamadas implementaciones de tiempo constante. Las implementaciones de software se consideran de tiempo constante en el siguiente sentido, como se indica en: [ 8 ]evita todas las bifurcaciones dependientes de la entrada, todos los índices de matriz dependientes de la entrada y otras instrucciones con tiempos dependientes de la entrada ”. La página de GitHub [ 9 ] enumera las reglas de codificación para las implementaciones de operaciones criptográficas y, más generalmente, para las operaciones que involucran valores secretos o sensibles.

La escalera de Montgomery es unaincógnita{\displaystyle x}-algoritmo de coordenadas solamente para la multiplicación de puntos de curvas elípticas y se basa en las reglas de doble y suma sobre un conjunto específico de curvas conocido como curva de Montgomery . El algoritmo tiene una ramificación condicional tal que la condición depende de un bit secreto. Por lo tanto, una implementación directa de la escalera no será de tiempo constante y tiene el potencial de filtrar el bit secreto. Este problema se ha abordado en la literatura [ 10 ] [ 11 ] y se conocen varias implementaciones de tiempo constante. El algoritmo de escalera de Montgomery de tiempo constante es el que se da a continuación que utiliza dos funciones CSwap y Ladder-Step. En el valor de retorno del algoritmo Z 2 p-2 es el valor de Z 2 −1 calculado usando el pequeño teorema de Fermat .

El algoritmo Montgomery-Ladder(x P , n) tiene como entrada : Unl{\displaystyle l}escalar de bitsnorte{\displaystyle n}y elincógnita{\displaystyle x}-coordinarincógnitaPAG{\displaystyle x_{P}}de un puntoPAG{\displaystyle P}. producción :incógnita{\displaystyle x}-coordenada denortePAG{\displaystyle nP}, elnorte{\displaystyle n}-veces múltiplo escalar dePAG{\displaystyle P}. X 1 ← x P ; X 2 ← 1; Z 2 ← 0; X 3 ← x P ; Z 3 ← 1 prevbit ← 0 parai{\displaystyle i}del1{\displaystyle l-1}downto 0 hacer bit ← valor de bit en el índicei{\displaystyle i}denorte{\displaystyle n} b ← bit{\displaystyle \oplus }prefijo bit anterior ← bit ({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle }) ← CSwap({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle },b) ({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle }) ← Escalera-escalón({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle },X 1 ) devolver X 2 Z 2 p-2

La función Ladder-Step (que se muestra a continuación) utilizada dentro de la escalera es el núcleo del algoritmo y es una forma combinada de las operaciones de suma diferencial y duplicación. La constante de campo a 24 se define como a 24 =(A+2)/4{\displaystyle (A+2)/4}, dóndeA{\displaystyle A}es un parámetro de la curva de Montgomery subyacente .

Función Escalera-Paso({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle },X 1 ) T 1 ← X 2 + Z 2 T 2 ← X 2 - Z 2 T 3 ← X 3 + Z 3 T 4 ← X 3 - Z 3 T 5 ← T 1 2 T 6 ← T 2 2 T 2 ← T 2 · T 3 T 1 ← T 1 · T 4 T 1 ← T 1 + T 2 T 2 ← T 1 - T 2 X 3 ← T 1 2 T 2 ← T 2 2 Z 3 ← T 2 · X 1 X 2 ← T 5 · T 6 T 5 ← T 5 - T 6 T 1 ← a 24 · T 5 T 6 ← T 6 + T 1 Z 2 ← T 5 · T 6 regreso ({\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle },{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle })

La función CSwap gestiona la ramificación condicional y ayuda a que la escalera se ejecute siguiendo los requisitos de una implementación de tiempo constante. La función intercambia el par de elementos del campo.{\displaystyle \langle }X 2 ,Z 2{\displaystyle \rangle }y{\displaystyle \langle }X 3 ,Z 3{\displaystyle \rangle }solo sib{\displaystyle b}= 1 y esto se hace sin filtrar ninguna información sobre el bit secreto. Se han propuesto varios métodos de implementación de CSwap en la literatura. [ 10 ] [ 11 ] Una opción menos costosa para gestionar el requisito de tiempo constante de la escalera de Montgomery es la selección condicional que se formaliza a través de una función CSelect. Esta función se ha utilizado en varias optimizaciones y se ha discutido formalmente en [ 12 ]

Desde la creación de la curva Montgomery estándar Curve25519 con un nivel de seguridad de 128 bits, se han desarrollado diversas implementaciones de software para calcular el ECDH en diferentes arquitecturas. Para lograr el mejor rendimiento posible, los desarrolladores criptográficos han recurrido a escribir las implementaciones utilizando el lenguaje ensamblador de la arquitectura subyacente. El trabajo [ 13 ] proporcionó un par de implementaciones en ensamblador de 64 bits dirigidas a la arquitectura AMD64. Estas implementaciones se desarrollaron utilizando una herramienta conocida como qhasm [ 14 ] , que puede generar programas criptográficos en lenguaje ensamblador de alta velocidad. La función CSwap se utilizó en las implementaciones de estas escaleras. Posteriormente, se realizaron varios intentos para optimizar la implementación de la escalera mediante programas en ensamblador escritos a mano, entre los cuales la noción de CSelect se utilizó por primera vez en [ 15 ] y luego en [ 16 ] . Además de utilizar instrucciones secuenciales, también se han utilizado instrucciones vectoriales para optimizar el cálculo de la escalera en diversos trabajos. [ 17 ] [ 18 ] [ 19 ] [ 20 ] Junto con AMD64, también se han realizado intentos para lograr implementaciones eficientes en otras arquitecturas como ARM. Los trabajos [ 21 ] y [ 22 ] proporcionan implementaciones eficientes dirigidas a la arquitectura ARM. Las bibliotecas lib25519 [ 23 ] y [ 24 ] son ​​dos bibliotecas de vanguardia que contienen implementaciones eficientes de la escalera de Montgomery para Curve25519 . No obstante, las bibliotecas también tienen implementaciones de otras primitivas criptográficas.

Aparte de Curve25519 , se han realizado varios intentos de calcular la escalera sobre otras curvas en diversos niveles de seguridad. También se han estudiado en la literatura implementaciones eficientes de la escalera sobre la curva estándar Curve448 en un nivel de seguridad de 224 bits. [ 15 ] [ 18 ] [ 20 ] Se propuso una curva llamada Curve41417 que proporciona una seguridad de poco más de 200 bits [ 25 ] en la que se utilizó una variante de la estrategia Karatsuba para implementar la multiplicación de campo necesaria para el software ECC relacionado. En la búsqueda de curvas de Montgomery que sean competitivas con Curve25519 y Curve448, se ha llevado a cabo una investigación y se propusieron un par de curvas junto con implementaciones secuenciales eficientes [ 16 ] y vectorizadas [ 20 ] de las escaleras correspondientes. En un nivel de seguridad de 256 bits, también se han abordado implementaciones eficientes de la escalera a través de tres curvas de Montgomery diferentes. [ 26 ]

Referencias

  1. 1 2 "Curvas elípticas - Fórmulas de suma explícitas" .
  2. 1 2 Hankerson, Darrel; Vanstone, Scott; Menezes, Alfred (2004). Guía de criptografía de curva elíptica . Springer Professional Computing. Nueva York: Springer-Verlag. doi : 10.1007/b97644 . ISBN 0-387-95273-X. S2CID 720546 . 
  3. Benger, Naomi; van de Pol, Joop; Smart, Nigel P.; Yarom, Yuval (2014). Batina, Lejla; Robshaw, Matthew (eds.). "Ooh Aah... Just a Little Bit" : Una pequeña cantidad de canal lateral puede ser muy útil (PDF) . Hardware criptográfico y sistemas embebidos – CHES 2014. Notas de clase en informática. Vol. 8731. Springer. págs. 72–95 . doi : 10.1007/978-3-662-44709-3_5 . ISBN    978-3-662-44708-6.
  4. Montgomery, Peter L. (1987). "Acelerando los métodos de factorización de Pollard y de curvas elípticas" . Math . Comp. 48 (177): 243–264 . doi : 10.2307/2007888 . JSTOR 2007888. MR 0866113 .  
  5. Yarom, Yuval; Benger, Naomi (2014). "Recuperación de nonces ECDSA de OpenSSL mediante el ataque de canal lateral de caché FLUSH+RELOAD" . Archivo de preimpresiones de criptología de IACR .
  6. Zimmermann, Paul; Dodson, Bruce (2006). "20 años de ECM" (PDF) . Teoría algorítmica de números . Lecture Notes in Computer Science. Vol. 4076. pp. 525–542 . doi : 10.1007/11792086_37 . ISBN   978-3-540-36075-9.HAL
  7. Bernstein, Daniel J.; Lange, Tanja (2017), Curvas de Montgomery y la escalera de Montgomery , consultado el 6 de noviembre de 2025.
  8. Bernstein, Daniel J. (2006). "Curve25519: Nuevos récords de velocidad Diffie-Hellman". Criptografía de clave pública - PKC 2006. Notas de clase en ciencias de la computación. Vol. 3958. págs. 207–228 . doi : 10.1007/11745853_14 . ISBN   978-3-540-33851-2.
  9. Aumasson, Jean-Philippe. "Directrices para software de criptografía de bajo nivel" . GitHub . Consultado el 26 de marzo de 2024 .
  10. 1 2 Bernstein, Daniel J.; Lange, Tanja (2017). "Curvas de Montgomery y la escalera de Montgomery" . En Joppe W. Bos; Arjen K. Lenstra (eds.). Temas de teoría computacional de números inspirados en Peter L. Montgomery . Cambridge University Press. pp. 82–115 . 
  11. 1 2 Costello, Craig; Smith, Benjamin (septiembre de 2018). "Curvas de Montgomery y su aritmética: el caso de campos característicos grandes" . Journal of Cryptographic Engineering . 8 (3): 227– 240. arXiv : 1703.01863 . doi : 10.1007/s13389-017-0157-6 .
  12. ^ Nath, Kaushik; Sarkar, Palash (2020). "Escalera de Montgomery de tiempo constante" . Archivo ePrint de criptología, artículo 2020/956.
  13. ^ Bernstein, Daniel J.; Duif, Niels; Lange, Tanja; Schwabe, Peter; Yang, Bo-Yin (2012). "Firmas de alta velocidad y alta seguridad" . Revista de ingeniería criptográfica . 2 (2): 77– 89. doi : 10.1007/s13389-012-0027-1 .
  14. Bernstein, Daniel J. "qhasm: herramientas para ayudar a escribir software de alta velocidad" .
  15. 1 2 Oliveira, Thomaz; López, Julio; Hisil, Hüseyin; Faz-Hernández, Armando; Rodríguez-Henríquez, Francisco (2018). "Cómo (pre)calcular una escalera: Mejorando el rendimiento de X25519 y X448" . En Carlisle Adams; Jan Camenisch (eds.). Áreas selectas en criptografía – SAC 2017. Lecture Notes in Computer Science. Vol. 10719. Springer. pp. 172–191 . doi : 10.1007/978-3-319-72565-9_9 . ISBN   978-3-319-72565-9., Código disponible en https://github.com/armfazh/rfc7748_precomputed .
  16. 1 2 Nath, Kaushik; Sarkar, Palash (2022). "Compromisos de seguridad y eficiencia para Diffie-Hellman de curva elíptica en los niveles de seguridad de 128 y 224 bits" . Journal of Cryptographic Engineering . 12 : 107–121 . doi : 10.1007/s13389-021-00261-y .El código está disponible en https://github.com/kn-cs/x25519
  17. Chou, Tung (2016). "Sandy2x: Nuevos récords de velocidad Curve25519" . En Orr Dunkelman; Liam Keliher (eds.). Áreas selectas en criptografía – SAC 2015. Lecture Notes in Computer Science. Vol. 9566. pp. 145–160 . doi : 10.1007/978-3-319-31301-6_8 . ISBN   978-3-319-31300-9.El código está disponible en https://tungchou.github.io/sandy2x/
  18. 1 2 Faz-Hernández, Armando; López, Julio; Dahab, Ricardo (2019). "Implementación de alto rendimiento de criptografía de curva elíptica mediante instrucciones vectoriales" . ACM Transactions on Mathematical Software . 45 (3): 1– 35. doi : 10.1145/3309759 .Coce está disponible en https://github.com/armfazh/fld-ecc-vec
  19. Hisil, Hüseyin; Egrice, Berkan; Yassi, Mert. "Escalera vectorizada rápida de 4 vías para el conjunto completo de curvas de Montgomery" . Revista internacional de ciencia de la seguridad de la información . 11 (2): 12– 24.El código está disponible en https://github.com/crypto-ninjaturtles/montgomery4x
  20. 1 2 3 Nath, Kaushik; Sarkar, Palash (2022). "Vectorizaciones eficientes de 4 vías de la escalera de Montgomery". IEEE Transactions on Computers . 71 (3): 712– 723. doi : 10.1109/TC.2021.3060505 .El código está disponible en https://github.com/kn-cs/vec-ladder
  21. Bernstein, Daniel J.; Schwabe, Peter (2012). "NEON crypto" . En Emmanuel Prouff; Patrick Schaumont (eds.). Hardware criptográfico y sistemas embebidos – CHES 2012. Lecture Notes in Computer Science. Vol. 7428. pp. 320–339 . doi : 10.1007/978-3-642-33027-8_19 . ISBN   978-3-642-33026-1.
  22. ^ Lenngren, Emil. "Implementación optimizada de AArch64 para X25519" (PDF) . GitHub.
  23. Nath, Kaushik; Bernstein, Daniel J. "lib25519" .
  24. Harrison, John R. "s2n-bignum" . GitHub .
  25. Bernstein, Daniel J.; Chitchanok, Chuengsatiansup; Tanja, Lange (2014). "Curve41417: Karatsuba Revisited" . En Batina, L.; Robshaw, M. (eds.). Advanced Information Systems Engineering . Lecture Notes in Computer Science. Vol. 7908. pp. 316–334 . doi : 10.1007/978-3-662-44709-3_18 . ISBN   978-3-642-38708-1.
  26. Nath, Kaushik; Sarkar, Palash (2020). "Cálculo eficiente de Diffie-Hellman de curva elíptica en el nivel de seguridad de 256 bits" . IET Information Security . 14 (6): 633– 640. doi : 10.1049/iet-ifs.2019.0620 .El código está disponible en https://github.com/kn-cs/mont256-dh y https://github.com/kn-cs/mont256-vec