cryptography - tag - ¿Qué implementaciones de Ed25519 existen?
tag de las 20 preguntas (4)
El nuevo esquema de autenticación SQRL se basa en el cifrado Curve Ed25519 desarrollado por Daniel Bernstein. Sin embargo, para comenzar a implementar este esquema, primero debe haber una implementación madura de Curve Ed25519.
¿Alguien sabe de alguna implementación madura? ¿Para Java, .NET o cualquier otra plataforma popular?
Implementaciones integradas
- http://www.dlbeer.co.nz/oss/c25519.html
- μNaCl , y un μNaCl describe su desempeño
Curve25519 vs. Ed25519
En primer lugar, Curve25519 y Ed25519 no son exactamente lo mismo. Se basan en la misma curva subyacente, pero utilizan diferentes representaciones. La mayoría de las implementaciones son para Curve25519 o Ed25519, pero es posible reutilizar algún código entre ellas.
Es posible convertir claves públicas Ed25519 a Curve25519, pero al revés pierde un bit de signo. es decir, dos claves públicas Ed25519 corresponden a una sola clave pública Curve25519. Las claves privadas son muy similares también.
Con respecto a las implementaciones, es importante distinguir entre la implementación real y las bibliotecas que las empaquetan en una forma utilizable.
Implementaciones reales
Implementaciones de djb en SUPERCOP
-
Ref
Escrito en c, muy lento - Ref10 de
Ref10
escrito en c, rendimiento decente - amd64-64-24k y
amd64-51-30k
, escritos en ensamblaje, aproximadamente el doble de rápido queRef10
También escribió un prototipo anterior, incompatible, en NaCl, no uses ese
Implementación de la donna de Floodyberry.
Contiene varias variantes, tanto de montaje como de c. Algunos optimizados para 64 bits, otros optimizados para 32 bits.
Bibliotecas
Biblioteca C, actualmente usa la implementación
Ref10
Tiene enlaces para muchos lenguajes de programación . Es probablemente la versión más popular y lo que recomiendo a la mayoría de las personas.
Contiene un montón de otras funciones criptográficas de NaCl, como el cifrado autenticado (XSalsa20Poly1305), hashes, Curve25519 intercambio de claves.
Ref10
C, utiliza la implementaciónRef10
.La característica más interesante de esta biblioteca es que admite el intercambio de claves utilizando las claves públicas Ed25519. Pero no contiene la clave compartida, por lo que no produce el mismo secreto compartido que Curve25519.
Contiene binarios pre-construidos para Win32 y Win64.
Mi puerto C #
Código administrado puro y funciona sin cambios en plataformas de 32 y 64 bits. Basado en Ref10. Un poco más lento que las implementaciones de c, pero la diferencia es sorprendentemente pequeña.
Admite el intercambio de claves compatible con NaCl usando las teclas Curve25519 y Ed25519 y contiene un montón de otras funciones criptográficas de NaCl. Estoy apuntando a un conjunto de características similar a LibSodium.
Las funciones de firma Ed25519 funcionan y han visto una cantidad razonable de pruebas, pero otras partes de la biblioteca son un poco rudas.
Utilizando directamente una implementación de SUPERCOP o el código de Floodyberry.
Probablemente requiera un poco más de trabajo para la construcción, pero obtendrá un mayor rendimiento (~ 2x) y no necesitará llevar el código que no necesita.
Recomiendo ir con LibSodium por ahora. Es relativamente popular y bien mantenido. El rendimiento es decente, solo debería causar problemas de rendimiento en aplicaciones realmente pesadas.
Añadiendo a la respuesta de CodesInChaos:
Bibliotecas
Mi puerto java
Basado en la Ref. 10, y proporciona las API JCA estándar para que pueda agregarse a un proveedor de criptografía.
Por mucho, el más maduro e interpretativo es el que escribió el mismo Daniel Bernstein. Se puede encontrar dentro de SUPERCOP .
Sin embargo, la API es bastante incómoda, y se necesita bastante excavación / extracción para obtener lo que deseas. Para salvar el trabajo de otras personas, lo hice yo mismo y puse mi código en Github .
Sin embargo, tenga cuidado con sus términos exactos, Ed25519 y Curve25519 están relacionados, pero son cosas diferentes. Lo que debe saber es que Ed25519 es un sistema de firma de clave pública / privada y Curve25519 es un intercambio de claves. Los pares de llaves Ed25519 se pueden convertir en pares de llaves Curve25519, al revés, no estoy tan seguro. Lo que hace mi biblioteca en Github es mantener todo en los par de llaves Ed25519 y convertir a Curve25519 para el intercambio de claves.