EdDSA
EdDSA | |
|---|---|
| Geral | |
| Projetistas | Daniel J. Bernstein, Niels Duif, Tanja Lange, Peter Schwabe, Bo-Yin Yang, et al. |
| Primeira publicação | 26 de setembro de 2011 |
| Detalhe | |
| Estrutura | Criptografia de curva elíptica |
Na criptografia de chave pública, o Edwards-curve Digital Signature Algorithm (EdDSA - Algoritmo de Assinatura Digital de Curva de Edwards) é um esquema de assinatura digital que utiliza uma variante da assinatura de Schnorr baseada em curvas de Edwards torcidas.[1]
Foi projetado para ser mais rápido do que os esquemas de assinatura digital existentes sem sacrificar a segurança. Foi desenvolvido por uma equipa que inclui Daniel J. Bernstein, Niels Duif, Tanja Lange, Peter Schwabe e Bo-Yin Yang.[2] A implementação de referência é um software de domínio público.[3]
Resumo
A seguir apresenta-se uma descrição simplificada do EdDSA, ignorando os detalhes da codificação de inteiros e pontos da curva como cadeias de bits; todos os detalhes completos encontram-se nos artigos originais e no RFC.[4][2][1]
Um esquema de assinatura EdDSA baseia-se na escolha:[4][2][1]
- do corpo finito sobre a potência de um número primo ímpar ;
- da curva elíptica sobre cujo grupo de pontos racionais sobre tem ordem , onde é um número primo grande e é chamado de cofator;
- do ponto base com ordem ; e
- da função hash criptográfica com saídas de bits, onde de modo que os elementos de e os pontos da curva em possam ser representados por cadeias de bits.
Estes parâmetros são comuns a todos os utilizadores do esquema de assinatura EdDSA. A segurança do esquema de assinatura EdDSA depende criticamente da escolha dos parâmetros, exceto pela escolha arbitrária do ponto base — por exemplo, espera-se que o algoritmo rho de Pollard para logaritmos exija aproximadamente adições de curva antes de conseguir calcular um logaritmo discreto,[5] de modo que deve ser grande o suficiente para que isso seja inviável, sendo tipicamente escolhido para exceder 2200.[6] A escolha de é limitada pela escolha de , uma vez que, pelo teorema de Hasse, não pode diferir de por mais de . A função hash é normalmente modelada como um oráculo aleatório nas análises formais de segurança do EdDSA.
Dentro de um esquema de assinatura EdDSA:
- Chave pública
- Uma chave pública EdDSA é um ponto da curva , codificado em bits.
- Verificação da assinatura
- Uma assinatura EdDSA para uma mensagem usando a chave pública é o par , codificado em bits, de um ponto da curva e um número inteiro que satisfaz a seguinte equação de verificação, onde denota a concatenação:
- Chave privada
- Uma chave privada EdDSA é uma cadeia de bits que deve ser escolhida uniformemente de forma aleatória. A chave pública correspondente é , onde corresponde aos bits menos significativos de interpretados como um número inteiro em formato little-endian.
- Assinatura
- A assinatura de uma mensagem é computada deterministicamente como onde para , e
Isto satisfaz a equação de verificação:
Ed25519
Ed25519 é o esquema de assinatura EdDSA que usa a função hash SHA-512 e uma curva elíptica relacionada à Curve25519[2] onde:
- e
- é o ponto único em cuja coordenada é e cuja coordenada é positiva. "Positivo" é definido em termos de codificação de bits:
- coordenadas "positivas" são coordenadas pares (o bit menos significativo está zerado)
- coordenadas "negativas" são coordenadas ímpares (o bit menos significativo está ativado)
- é o SHA-512, com .
A curva de Edwards torcida é conhecida como edwards25519,[7][1] e é birracionalmente equivalente à Curva de Montgomery conhecida como Curve25519. A equivalência é:[2][7][8]
Desempenho
A equipa original otimizou o Ed25519 para a família de processadores x86-64 Nehalem/Westmere. A verificação pode ser executada em lotes (batches) de 64 assinaturas para um rendimento ainda maior. O Ed25519 destina-se a fornecer uma resistência a ataques comparável a cifras simétricas de qualidade de 128 bits.[9]
As chaves públicas têm 256 bits de comprimento e as assinaturas têm 512 bits de comprimento.[10]
Codificação segura
O Ed25519 foi projetado para evitar implementações que usem condições de ramificação (branch) ou índices de arrays que dependam de dados secretos,[2][1] a fim de mitigar ataques de canal lateral.
Assim como ocorre em outros esquemas de assinatura baseados em logaritmo discreto, o EdDSA utiliza um valor secreto chamado nonce, que é único para cada assinatura. Nos esquemas de assinatura DSA e ECDSA, este nonce é tradicionalmente gerado de forma aleatória para cada assinatura — e se o gerador de números aleatórios for quebrado ou se tornar previsível ao fazer uma assinatura, a assinatura pode vazar a chave privada, como aconteceu com a chave de assinatura da atualização de firmware do Sony PlayStation 3.[11][12][13][14]
Em contrapartida, o EdDSA escolhe o nonce de forma determinística como o hash de uma parte da chave privada e da mensagem. Assim, uma vez gerada uma chave privada, o EdDSA não necessita mais de um gerador de números aleatórios para criar assinaturas, e não existe o perigo de que um gerador de números aleatórios corrompido revele a chave privada.[2]
Inconsistências de padronização e implementação
De notar que existem dois esforços de padronização para o EdDSA: um da IETF, a RFC 8032 (informativa), e um do NIST como parte do FIPS 186-5.[15] As diferenças entre os padrões foram analisadas,[16][17] e encontram-se disponíveis vetores de teste.[18]
Software
Usos notáveis do Ed25519 incluem o OpenSSH,[19] o GnuPG[20] e várias alternativas, além da ferramenta signify do OpenBSD.[21] O uso do Ed25519 (e Ed448) no protocolo SSH foi padronizado.[22] Em 2023, a versão final do padrão FIPS 186-5 incluiu o Ed25519 determinístico como um esquema de assinatura aprovado.[15]
- Apple Watch e iPhone usam chaves Ed25519 para autenticação mútua IKEv2[23]
- Botan
- Crypto++
- Protocolo da criptomoeda CryptoNote
- Dropbear SSH[24]
- Implementação do EdDSA pelo I2Pd[25]
- Java Development Kit 15
- Libgcrypt
- Minisign[26] e Minisign Miscellanea para o macOS
- NaCl / libsodium[27]
- OpenSSL 1.1.1[28]
- Python - Uma implementação alternativa lenta porém concisa,[29] não inclui proteção contra ataques de canal lateral[30]
- Implementação de referência Supercop[31] (Linguagem C com código assembly em linha)
- Virgil PKI utiliza chaves Ed25519 por padrão[32]
- wolfSSL[33]
Ed448
Ed448 é o esquema de assinatura EdDSA definido na RFC 8032 usando a função hash SHAKE256 e a curva elíptica edwards448, uma curva de Edwards (não torcida) relacionada à Curve448 definida na RFC 7748. O Ed448 também foi aprovado na versão final do padrão FIPS 186-5.[15]
Referências
- 1 2 3 4 5 Josefsson, S.; Liusvaara, I. (janeiro de 2017). «Edwards-Curve Digital Signature Algorithm (EdDSA)». IRTF. Consultado em 11 de julho de 2022
- 1 2 3 4 5 6 7 Bernstein, Daniel J.; Duif, Niels; Lange, Tanja; Schwabe, Peter; Yang, Bo-Yin (2012). «High-speed high-security signatures» (PDF). Journal of Cryptographic Engineering. 2 (2): 77–89. doi:10.1007/s13389-012-0027-1
- ↑ «Software». 11 de junho de 2015. Consultado em 7 de outubro de 2016
- 1 2 Bernstein, Daniel J.; Josefsson, Simon; Lange, Tanja; Schwabe, Peter; Yang, Bo-Yin (4 de julho de 2015). «EdDSA for more curves» (PDF). Consultado em 14 de novembro de 2016
- ↑ Bernstein, Daniel J.; Lange, Tanja; Schwabe, Peter (1 de janeiro de 2011). «On the correct use of the negation map in the Pollard rho method». IACR Cryptology ePrint Archive. Consultado em 14 de novembro de 2016
- ↑ Bernstein, Daniel J.; Lange, Tanja. «ECDLP Security: Rho». SafeCurves: choosing safe curves for elliptic-curve cryptography. Consultado em 16 de novembro de 2016
- 1 2 Langley, A.; Hamburg, M.; Turner, S. (janeiro de 2016). «Elliptic Curves for Security». IETF. Consultado em 12 de novembro de 2024
- ↑ Bernstein, Daniel J.; Lange, Tanja (2007). «Faster addition and doubling on elliptic curves». Advances in cryptology—ASIACRYPT, Springer. Consultado em 1 de março de 2024
- ↑ Bernstein, Daniel J. (22 de janeiro de 2017). «Ed25519: high-speed high-security signatures». Consultado em 27 de setembro de 2019
- ↑ Bernstein, Daniel J. (22 de janeiro de 2017). «Ed25519: high-speed high-security signatures». Consultado em 1 de junho de 2020
- ↑ Johnston, Casey (30 de dezembro de 2010). «PS3 hacked through poor cryptography implementation». Ars Technica. Consultado em 15 de novembro de 2016
- ↑ fail0verflow (29 de dezembro de 2010). «Console Hacking 2010: PS3 Epic Fail» (PDF). Chaos Communication Congress. Consultado em 15 de novembro de 2016. Cópia arquivada (PDF) em 26 de outubro de 2018
- ↑ «27th Chaos Communication Congress: Console Hacking 2010: PS3 Epic Fail» (PDF). Consultado em 4 de agosto de 2019
- ↑ Buchanan, Bill (12 de novembro de 2018). «Not Playing Randomly: The Sony PS3 and Bitcoin Crypto Hacks. Watch those random number generators». Medium. Consultado em 11 de março de 2024
- 1 2 3 Moody, Dustin (3 de fevereiro de 2023). «FIPS 186-5: Digital Signature Standard (DSS)». NIST. Consultado em 4 de março de 2023
- ↑ Chalkias, Konstantinos; Garillot, Francois; Nikolaenko, Valeria (1 de outubro de 2020). «Taming the many EdDSAs». Security Standardisation Research Conference (SSR 2020). Consultado em 15 de fevereiro de 2021
- ↑ Brendel, Jacqueline; Cremers, Cas; Jackson, Dennis; Zhao, Mang (3 de julho de 2020). «The provable security of ed25519: Theory and practice». IEEE Symposium on Security and Privacy (S&P 2021). Consultado em 15 de fevereiro de 2021
- ↑ «ed25519-speccheck». GitHub. Consultado em 15 de fevereiro de 2021
- ↑ «Changes since OpenSSH 6.4». 3 de janeiro de 2014. Consultado em 7 de outubro de 2016
- ↑ «What's new in GnuPG 2.1». 14 de julho de 2016. Consultado em 7 de outubro de 2016
- ↑ «Things that use Ed25519». 6 de outubro de 2016. Consultado em 7 de outubro de 2016
- ↑ Harris, B.; Velvindron, L. (fevereiro de 2020). «Ed25519 and Ed448 Public Key Algorithms for the Secure Shell (SSH) Protocol». IETF. Consultado em 11 de julho de 2022
- ↑ «System security for watchOS». Consultado em 7 de junho de 2021
- ↑ Johnston, Matt (14 de novembro de 2013). «DROPBEAR_2013.61test». Consultado em 5 de agosto de 2019. Cópia arquivada em 5 de agosto de 2019
- ↑ «Heuristic Algorithms and Distributed Computing» (PDF). Èvrističeskie Algoritmy I Raspredelennye Vyčisleniâ. 2015. Consultado em 7 de outubro de 2016. Cópia arquivada (PDF) em 20 de outubro de 2016
- ↑ Denis, Frank. «Minisign: A dead simple tool to sign files and verify signatures.». Consultado em 7 de outubro de 2016
- ↑ Denis, Frank (29 de junho de 2016). «libsodium/ChangeLog». GitHub. Consultado em 7 de outubro de 2016
- ↑ «OpenSSL CHANGES». 31 de julho de 2019. Consultado em 5 de agosto de 2019. Cópia arquivada em 18 de maio de 2018
- ↑ «python/ed25519.py: the main subroutines». 6 de julho de 2011. Consultado em 7 de outubro de 2016
- ↑ «Software: Alternate implementations». 11 de junho de 2015. Consultado em 7 de outubro de 2016
- ↑ «eBACS: ECRYPT Benchmarking of Cryptographic Systems: SUPERCOP». 10 de setembro de 2016. Consultado em 7 de outubro de 2016
- ↑ «Virgil Security Crypto Library for C: Library: Foundation». GitHub. Consultado em 4 de agosto de 2019
- ↑ «wolfSSL Embedded SSL Library (formerly CyaSSL)». Consultado em 7 de outubro de 2016