ECDSA

Em criptografia, o Elliptic Curve Digital Signature Algorithm (ECDSA, em português Algoritmo de Assinatura Digital de Curvas Elípticas) oferece uma variante do Digital Signature Algorithm (DSA), que usa criptografia de curva elíptica.

Comparação do tamanho de chave e assinatura com o DSA

Tal como ocorre com a criptografia de curva elíptica em geral, o tamanho em bits da chave pública que se acredita ser necessário para o ECDSA é cerca de duas vezes o tamanho do nível de segurança, em bits. Por exemplo, em um nível de segurança de 80 bits (o que significa que um invasor precisaria de no máximo cerca de 2 80 {\displaystyle 2^{80}} operações para encontrar a chave privada) o tamanho da chave pública de um algoritmo ECDSA deverá ser de 160 bits, enquanto que o tamanho de uma chave pública para o DSA é de pelo menos 1024 bits. Por outro lado, o tamanho da assinatura é o mesmo para o DSA e o ECDSA: aproximadamente 4 t {\displaystyle 4t} bits, onde t {\displaystyle t} é o nível de segurança medido em bits, isto é, cerca de 320 bits para um nível de segurança de 80 bits.

Algoritmo de geração de assinaturas

Suponha que Alice deseje enviar uma mensagem assinada para o Bob. Inicialmente, eles devem concordar com os parâmetros ( CURVE , G , n ) {\displaystyle ({\textrm {CURVE}},G,n)} da curva. Além do corpo e da equação da curva, é preciso G {\displaystyle G} , um ponto de base de primeira ordem sobre a curva; n {\displaystyle n} é a ordem multiplicativa do ponto G {\displaystyle G} .

Parâmetro
CURVA o corpo e a equação usados na curva elíptica
G ponto base da curva elíptica, tal como um ponto ( x 0 , y 0 ) {\displaystyle (x_{0},y_{0})} sobre y 2 = x 3 + 7 {\displaystyle y^{2}=x^{3}+7} , um gerador da curva elíptica com grande ordem prima n
n ordem inteira de G, significa que n × G = O {\displaystyle n\times G=O} , em que O {\displaystyle O} é o elemento identidade.

A ordem n {\displaystyle n} do ponto base G {\displaystyle G} deve ser prima. De fato, supõe-se que cada elemento diferente de zero do anel Z / n Z {\displaystyle \mathbb {Z} /n\mathbb {Z} } são invertíveis, de modo que Z / n Z {\displaystyle \mathbb {Z} /n\mathbb {Z} } deve ser um corpo. Isso implica que n {\displaystyle n} deve ser primo (ver identidade de Bézout).

Alice cria um par de chaves, consistindo de uma chave privada d A {\displaystyle d_{A}} , que é um inteiro selecionado aleatoriamente no intervalo [ 1 , n 1 ] {\displaystyle [1,n-1]} ; e uma chave pública, um ponto da curva Q A = d A × G {\displaystyle Q_{A}=d_{A}\times G} . Utiliza-se × {\displaystyle \times } para denotar a multiplicação de um ponto da curva elíptica por um escalar.

Para Alice assinar uma mensagem m {\displaystyle m} , ela deve seguir os seguintes passos:

  1. Calcular e = HASH ( m ) {\displaystyle e={\textrm {HASH}}(m)} . (Aqui HASH é uma função de hash criptográfica, como SHA-2, com a saída convertida para um inteiro.)
  2. Considerar z {\displaystyle z} como sendo os L n {\displaystyle L_{n}} bits mais à esquerda de e {\displaystyle e} , em que L n {\displaystyle L_{n}} é o comprimento de bit da ordem do grupo n {\displaystyle n} . (Note que z {\displaystyle z} pode ser maior do que n {\displaystyle n} mas não mais longo.[1])
  3. Escolher um inteiro aleatório criptograficamente seguro k {\displaystyle k} em [ 1 , n 1 ] {\displaystyle [1,n-1]} .
  4. Calcular o ponto da curva ( x 1 , y 1 ) = k × G {\displaystyle (x_{1},y_{1})=k\times G} .
  5. Calcular r = x 1 mod n {\displaystyle r=x_{1}\,{\bmod {\,}}n} . Se r = 0 {\displaystyle r=0} , voltar para o passo 3.
  6. Calcular s = k 1 ( z + r d A ) mod n {\displaystyle s=k^{-1}(z+rd_{A})\,{\bmod {\,}}n} . Se s = 0 {\displaystyle s=0} , voltar para o passo 3.
  7. A assinatura é o par ( r , s ) {\displaystyle (r,s)} . (E ( r , s mod n ) {\displaystyle (r,-s\,{\bmod {\,}}n)} também é uma assinatura válida.)

Como é observado no padrão, é preciso não apenas que k {\displaystyle k} seja secreto, mas também que sejam escolhidos valores de k {\displaystyle k} diferentes para assinaturas diferentes, caso contrário, a equação da etapa 6 pode ser resolvido para d A {\displaystyle d_{A}} , a chave privada: Dadas duas assinaturas ( r , s ) {\displaystyle (r,s)} e ( r , s ) {\displaystyle (r,s')} empregando a mesmo mesmo k {\displaystyle k} desconhecido para diferentes mensagens conhecidas m {\displaystyle m} e m {\displaystyle m'} , um invasor pode calcular z {\displaystyle z} e z {\displaystyle z'} , e como s s = k 1 ( z z ) {\displaystyle s-s'=k^{-1}(z-z')} (todas as operações neste parágrafo são feitas módulo n {\displaystyle n} ) o atacante pode encontrar k = z z s s {\displaystyle k={\frac {z-z'}{s-s'}}} . Como s = k 1 ( z + r d A ) {\displaystyle s=k^{-1}(z+rd_{A})} , o invasor pode agora calcular a chave privada d A = s k z r {\displaystyle d_{A}={\frac {sk-z}{r}}} . Esta falha na implementação foi utilizada, por exemplo, para extrair a chave de assinatura utilizada para o console de jogos PlayStation 3.[2] Outra forma como a assinatura ECDSA pode vazar as chaves privadas é quando k {\displaystyle k} é gerado por um gerador de números aleatórios defeituoso. Uma falha como esta na geração de um número aleatório fez com que usuários de carteiras de Bitcoin para Android perdessem seus fundos em agosto de 2013.[3] Para garantir que k {\displaystyle k} é único para cada mensagem, pode-se ignorar completamente a geração de números aleatórios e gerar assinaturas deterministicas derivando k {\displaystyle k} tanto da mensagem quanto da chave privada.[4]

Algoritmo de verificação de assinatura

Para Bob autenticar a assinatura de Alice, ele deve ter uma cópia de sua chave pública de ponto da curva Q A {\displaystyle Q_{A}} . Bob pode verificar que Q A {\displaystyle Q_{A}} é um ponto válido da curva da seguinte forma:

  1. Verificar que Q A {\displaystyle Q_{A}} não é igual ao elemento identidade O {\displaystyle O} , e suas coordenadas são, de outra forma válida
  2. Verificar que Q A {\displaystyle Q_{A}} está sobre a curva
  3. Verificar que n × Q A = O {\displaystyle n\times Q_{A}=O}

Depois, Bob segue estes passos:

  1. Verificar que r {\displaystyle r} e s {\displaystyle s} são números inteiros em [ 1 , n 1 ] {\displaystyle [1,n-1]} . Se não, a assinatura é inválida.
  2. Calcular e = HASH ( m ) {\displaystyle e={\textrm {HASH}}(m)} , em que HASH é a mesma função utilizada na geração da assinatura.
  3. Considerar z {\displaystyle z} como os L n {\displaystyle L_{n}} bits mais à esquerda de e {\displaystyle e} .
  4. Calcular w = s 1 mod n {\displaystyle w=s^{-1}\,{\bmod {\,}}n} .
  5. Calcular u 1 = z w mod n {\displaystyle u_{1}=zw\,{\bmod {\,}}n} e u 2 = r w mod n {\displaystyle u_{2}=rw\,{\bmod {\,}}n} .
  6. Calcular o ponto da curva ( x 1 , y 1 ) = u 1 × G + u 2 × Q A {\displaystyle (x_{1},y_{1})=u_{1}\times G+u_{2}\times Q_{A}} . Se ( x 1 , y 1 ) = O {\displaystyle (x_{1},y_{1})=O} então, a assinatura é inválida.
  7. A assinatura é válida se r x 1 ( mod n ) {\displaystyle r\equiv x_{1}{\pmod {n}}} , e inválida caso contrário.

Note que utilizando o truque de Shamir, uma soma de duas multiplicações escalares u 1 × G + u 2 × Q A {\displaystyle u_{1}\times G+u_{2}\times Q_{A}} pode ser calculada mais rapidamente do que duas multiplicações escalares feitas de forma independente.[5]

Corretude do algoritmo

Não é imediatamente óbvio o porquê de a verificação sequer funcionar corretamente. Para ver porquê, indique por C {\displaystyle C} o ponto da curva calculado no passo 6 da verificação,

C = u 1 × G + u 2 × Q A {\displaystyle C=u_{1}\times G+u_{2}\times Q_{A}}

A partir da definição da chave pública como Q A = d A × G {\displaystyle Q_{A}=d_{A}\times G} ,

C = u 1 × G + u 2 d A × G {\displaystyle C=u_{1}\times G+u_{2}d_{A}\times G}

Como a multiplicação por escalar em curva elíptica é distributiva em relação à adição,

C = ( u 1 + u 2 d A ) × G {\displaystyle C=(u_{1}+u_{2}d_{A})\times G}

Expandindo as definições de u 1 {\displaystyle u_{1}} e u 2 {\displaystyle u_{2}} a partir da etapa de verificação 5,

C = ( z s 1 + r d A s 1 ) × G {\displaystyle C=(zs^{-1}+rd_{A}s^{-1})\times G}

Colocando o termo comum s 1 {\displaystyle s^{-1}} em evidência,

C = ( z + r d A ) s 1 × G {\displaystyle C=(z+rd_{A})s^{-1}\times G}

Expandindo a definição de s {\displaystyle s} a partir do passo 6 da assinatura,

C = ( z + r d A ) ( z + r d A ) 1 ( k 1 ) 1 × G {\displaystyle C=(z+rd_{A})(z+rd_{A})^{-1}(k^{-1})^{-1}\times G}

Como o inverso de um inverso é o elemento original e o produto de um elemento inverso e o elemento é a identidade, resulta que

C = k × G {\displaystyle C=k\times G}

A partir da definição de r {\displaystyle r} , este é o passo de verificação 7.

Isso só mostra que uma mensagem assinada corretamente será verificad corretamente; muitas outras propriedades [quais?] são necessárias para um algoritmo de assinatura seguro.

Segurança

Em dezembro de 2010, um grupo autodenominado fail0verflow anunciou a recuperação da chave privada do ECDSA usada pela Sony para assinar software para o console de jogos PlayStation 3. No entanto, esse ataque só funcionou porque a Sony não implementou corretamente o algoritmo, porque k {\displaystyle k} era estático em vez de aleatório. Como apontado anteriormente, na seção sobre o algoritmo de geração de assinatura, isso torna d A {\displaystyle d_{A}} solucionável, e o algoritmo completamente inútil.[6]

Em 29 de Março de 2011, dois pesquisadores publicaram um artigo IACR,[7] demonstrando que é possível obter uma chave privada TLS de um servidor utilizando OpenSSL que autentica com DSA de Curvas Elípticas sobre um corpo binário através de um ataque de temporização.[8] A vulnerabilidade foi corrigida no OpenSSL 1.0.0e.[9]

Em agosto de 2013, foi revelado que os erros em algumas implementações da classe Java SecureRandom, por vezes, gerava colisões entre os valores de k {\displaystyle k} . Isso permitiu que hackers recuperassem chaves privadas, dando-lhes o mesmo controle sobre transações de bitcoin que os proprietários legítimos das chaves tinham, usando a mesma falha que foi usada para revelar a chave de assinatura do PS3 em algumas implementações em aplicativos para Android, que usam Java e dependem de ECDSA para autenticar transações.[10]

Este problema pode ser evitado por meio da geração determinística de k {\displaystyle k} , como descrito pela RFC 6979.

Preocupações

Existem dois tipos de preocupações com ECDSA:

  1. Preocupações políticas: a confiabilidade das curvas produzidas pelo NIST sendo questionada após serem feitas revelações de que a NSA voluntariamente insere backdoors em software, componentes de hardware e padrões publicados; criptógrafos bem conhecidos[11] expressaram[12][13] dúvidas sobre como as curvas do NIST foram concebidas, e o estrago voluntário já foi provado no passado.[14][15]
  2. Preocupações de ordem técnica: a dificuldade de implementar corretamente o padrão,[16] sua lentidão e falhas de projeto reduzem a segurança em implementações insuficientemente defensivas do gerador de número aleatório Dual EC DRBG .[17]

Ambas as preocupações são resumidas na introdução do libssh curve25519.[18]

Implementações

Abaixo, está uma lista de bibliotecas de criptografia que fornecem suporte para o algoritmo ECDSA:

Referências

  1. NIST FIPS 186-4, de julho de 2013, pp. 19 e 26
  2. Console de Hacking 2010 - PS3 Epic Fail, página 123-128
  3. «Android Security Vulnerability» 
  4. «RFC 6979 - Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA)» 
  5. «The Double-Base Number System in Elliptic Curve Cryptography» (PDF) 
  6. «Hackers Describe PS3 Security As Epic Fail, Gain Unrestricted Access» 
  7. «Cryptology ePrint Archive: Report 2011/232» 
  8. «Vulnerability Note VU#536044 - OpenSSL leaks ECDSA private key through a remote timing attack». www.kb.cert.org 
  9. «ChangeLog» 
  10. «Android bug batters Bitcoin wallets» 
  11. «The NSA Is Breaking Most Encryption on the Internet». Schneier on Security 
  12. «SafeCurves: choosing safe curves for elliptic-curve cryptography» 
  13. «Security dangers of the NIST curves» (PDF) 
  14. «The Strange Story of Dual_EC_DRBG». Schneier on Security 
  15. «NSA Efforts to Evade Encryption Technology Damaged U.S. Cryptography Standard» 
  16. «How to design an elliptic-curve signature system». The cr.yp.to blog 
  17. «New key type (ed25519) and private key format» 
  18. «[email protected]\doc - projects/libssh.git». libssh shared repository 

Leitura complementar

  • Accredited Standards Committee X9, American National Standard X9.62-2005, Criptografia de Chave Pública para a Indústria de Serviços Financeiros, O Elliptic Curve Digital Signature Algorithm (algoritmo ECDSA), 16 de novembro de 2005.
  • Certicom de Pesquisa, Padrões eficientes de criptografia, SEC 1: Criptografia de Curva Elíptica, Versão 2.0, de 21 de Maio de 2009.
  • López, J. e Dahab, R. Uma Visão geral da Criptografia de Curva Elíptica, Relatório Técnico IC-00-10 Universidade Estadual de Campinas, Campinas, 2000.
  • Daniel J. Bernstein, Pippenger do algoritmo de exponenciação, 2002.
  • Daniel R. L. Brown, Grupos Genéricos, Colisão de Resistência, e ECDSA, Designs, Códigos e Criptografia, 35, 119-152, 2005. ePrint versão
  • Ian F. Blake, Gadiel Seroussi, e Nigel Inteligente, os editores, os Avanços na Criptografia de Curva Elíptica, London Mathematical Society Palestra de Série Nota 317, Cambridge University Press, 2005.
  • Hankerson, D.; Vanstone, S.; Menezes, A. Guide to Elliptic Curve Cryptography. Col: Springer Professional Computing. [S.l.: s.n.] ISBN 0-387-95273-X. doi:10.1007/b97644 

Ligações externas

  • Padrão de Assinatura Digital; inclui informações sobre ECDSA
  • Elliptic Curve Digital Signature Algorithm (algoritmo ECDSA); fornece um guia detalhado no algoritmo ECDSA. Wayback link
  • Portal da ciência