# Criptografia de curva elíptica

A Criptografía de Curvas Elípticas, é uma aproximação para a criptografia de chave pública com base na estrutura algébrica de curvas elípticas sobre corpos finitos . A utilização de curvas elípticas em criptografia foi sugerida por Neal Koblitz e Victor S.Miller em 1985. Curvas Elípticas são também utilizadas em várias fatorações de algoritmos inteiros, que têm aplicações em criptografia.
Criptografia de chave pública é baseada na criação de enigmas matemáticos que são difíceis de resolver sem determinado conhecimento sobre como foram criados. O criador guarda aquele conhecimento secreto (a chave confidencial) e publicam o enigma (a chave pública). O enigma pode então ser usado para confundir uma mensagem de um jeito que somente o criador possa desconfundi-la. Antes, os sistemas de chaves públicas, tais como os algoritmos de RSA, usavam produtos de dois números primos como enigma: o usuário escolhe dois número primos como sua chave confidencial, e publica seu produto como sua chave pública. A dificuldade de fatoração assegura que ninguém mais possa desvendar a chave confidencial (isto é, os dois número primos) da chave pública. Entretanto, devido ao progresso recente em fatorar, chaves públicas de RSA devem agora ter milhares de bits de comprimento para fornecer a segurança adequada.
Uma outra classe do enigma envolve resolver a equação ab = c em b, quando sabemos quem são a e c. Tais equações que envolvem números reais ou complexos são resolvidas facilmente usando logaritmos. Entretanto, em um grande grupo finito, encontrar soluções a tais equações é completamente difícil e é conhecido como o problema de Logaritmo discreto. Uma curva elíptica é uma curva plana definida pela equação: $y^{2}=x^{3}+ax+b$. Pode ser mostrado que o conjunto de pontos em uma curva forma um grupo abeliano (com o ponto infinito como a identidade do elemento).
Se as coordenadas x e y forem escolhidas de um grande campo finito, as soluções darão forma a um Grupo Abeliano finito. O problema com Logaritmo discreto é que em tais grupos de curvas elípticas ele é visto como mais difícil do que o problema correspondente no campo finito subjacente. Assim as chaves na criptografia de curvas elípticas podem ser escolhidas para serem muito mais curtas para um nível comparável da segurança.
Quanto a outros Sistemas Criptográficos de chaves públicas populares, nenhuma prova matemática de dificuldade foi publicada para a Criptografia de Curva Elíptica até à data de 2006. Entretanto, a agência da segurança nacional de Estados Unidos NSA endossou a tecnologia de Criptografia de Curva Elíptica incluindo em seu conjunto de Suite B os algoritmos recomendados. Embora a patente de RSA tenha expirado, há patentes que cobrem alguns aspectos de Criptografia de Curva Elíptica.

## Introdução Matemática

As curvas elípticas usadas em Criptografia são definidas tipicamente em dois tipos de campos finitos: campos de característica impar p ($\mathbb {F} _{p}$,, onde p > 3 é um número principal grande) e campos da característica par ($\mathbb {F} _{2^{m}}$).Quando a distinção não é importante nós denotamos ambos eles como $\mathbb {F} _{q}$,onde q = p ou q = 2m. Em $\mathbb {F} _{p}$ os elementos são inteiros ($0\leq x<p$)que são combinados usando a aritmética modular. No caso $\mathbb {F} _{2^{m}}$ é um pouco mais complicado: um obtém representações diferentes dos elementos do campo como bitstrings para cada escolha do polinômio binário irretível f (x) do grau m.O conjunto de todos os pares das coordenadas (x, y) para $(x,y)$ para $x,y\in \mathbb {F} _{q}$ que forma o plano $\mathbb {F} _{q}\times \mathbb {F} _{q}$. Uma curva elíptica é o locus dos pontos do plano cujas coordenadas satisfazem a uma determinada equação cúbica junto com um ponto na infinidade O. No caso p>3 a equação definida de $E(\mathbb {F} _{p})$ pode ser escrita $y^{2}=x^{3}+ax+b$, onde $a\in \mathbb {F} _{p}$ e $b\in \mathbb {F} _{p}$ são constantes tanto que $4a^{3}+27b^{2}\neq 0$. No outro caso a equação definida de $E(\mathbb {F} _{2^{m}})$ pode ser escrita: $y^{2}+xy=x^{3}+ax^{2}+b$ onde $a\in \mathbb {F} _{2^{m}}$ e $b\in \mathbb {F} _{2^{m}}$ são constantes e $b\neq 0$. Embora o ponto na infinidade O não tenha coordenadas, é conveniente representá-las , usando um par das coordenadas que não satisfazem à equação definida, por exemplo $O=(0,0)$ se $b\neq 0$ e $O=(0,1)$. De acordo com o teorema de Hasse em curvas elípticas o número dos pontos em uma curva é quase o do tamanho do campo subjacente; mais precisamente: $({\sqrt {q}}-1)^{2}\leq |E(\mathbb {F} _{q})|\leq ({\sqrt {q}}+1)^{2}$. Os pontos em uma curva elíptica dão forma a um grupo abeliano $(E(\mathbb {F} ),+)$ com $O$ o ponto distinto na infinidade. Ou seja dado dois pontos $P,Q\in E(\mathbb {F} _{q})$, , há um terceiro ponto, denotado por $P+Q$ on $E(\mathbb {F} _{q})$, e as seguintes relações servem para todos $P,Q,R\in E(\mathbb {F} _{q})$ :
* $P+Q=Q+P$ (comutativo)
* $(P+Q)+R=P+(Q+R)$ (associativo)
* $P+O=O+P=P$ (existência de um elemento identidade)
* $(-P)$ $-P+P=P+(-P)=O$ (existência dos inversos)
Nós já especificamos como O é definido. Se nós definirmos o negativo de um ponto $P=(x,y)$ para ser $-P=(x,-y)$ para $P\in E(\mathbb {F} _{p})$ e $-P=(x,x+y)$ para $P\in E(\mathbb {F} _{2^{m}})$, nós podemos definir a operação da adição da seguinte forma:
* se $Q=O$ então $P+Q=P$
* se $Q=-P$ então $P+Q=O$
* se $Q\neq P$ então $P+Q=R$, onde
** No primeiro caso: $x_{R}=\lambda ^{2}-x_{P}-x_{Q}$, $y_{R}=\lambda (x_{P}-x_{R})-y_{P}$, e $\lambda ={\frac {y_{Q}-y_{P}}{x_{Q}-x_{P}}}$, ou
** No segundo caso: $x_{R}=\lambda ^{2}+\lambda +x_{P}+x_{Q}+a$, $y_{R}=\lambda (x_{P}+x_{R})+x_{R}+y_{P}$, e $\lambda ={\frac {y_{P}+y_{Q}}{x_{P}+x_{Q}}}$
* se $Q=P$ então $P+Q=R$, onde
** no primeiro caso $x_{R}=\lambda ^{2}-2x_{P}$, $y_{R}=\lambda (x_{P}-x_{R})-y_{P}$, e $\lambda ={\frac {3x_{P}^{2}+a}{2y_{P}}}$, ou
** no segundo caso $x_{R}=\lambda ^{2}+\lambda +a$, $y_{R}=x_{P}^{2}+(\lambda +1)x_{R}$, e $\lambda =x_{P}+{\frac {y_{P}}{x_{P}}}$

## Esquemas Criptográficos

Desde que o grupo cíclico (aditivo) descrito acima pode ser considerado similar ao grupo (multiplicativo) de potências de um inteiro g de módulo primo p: $(g^{0},g,g^{2},g^{3},g^{4},\ldots )$, o problema de encontrar k dados os pontos kG e G é chamado o Problema Discreto do Logaritmo da Curva Elíptica (em Inglês - Elliptic Curve Discrete Logarithm Problem - ECDLP). A dificuldade suposta de diversos problemas relacionados ao logaritmo discreto no subgrupo de $E(\mathbb {F} _{q})$ permite o uso da Criptografia de Curva Elíptica (CCE). A maioria dos esquemas de curva elíptica criptográficos são relacionados aos esquemas discretos dos logarítmos que foram formulados originalmente para a aritmética modular usual: O esquema chave do acordo de Diffie-Hellman da curva elíptica é baseado no esquema de Diffie-Hellman.
* O algoritmo da assinatura digital da curva elíptica é baseado no algoritmo da assinatura de digital.
* O esquema chave do acordo de ECMQV é baseado no esquema chave do acordo de MQV.
Nem todos os esquemas do DLP devem ser movidos ao domínio curva elíptica. Por exemplo, o poço - o esquema conhecido como Criptografia de ElGamal nunca foi estandardizado por corpos oficiais e não deve diretamente ser usado sobre uma curva elíptica (o esquema padrão de criptografia para ECC é chamado esquema integrado de Curva de Criptografia Elíptica). A razão principal é que embora seja simples converter uma mensagem arbitrária (de comprimento limitado) a um modulo inteiro p, não é simples converter bitstring a um ponto de curva. Na conferência 2005 de RSA ,a agência da segurança nacional (NSA) anunciou o Suite B que usa exclusivamente ECC para a geração digital da assinatura e a troca da chave. O suite é pretende proteger sistemas classificados e não-classificados e informação da segurança nacional. Uma outra fonte principal de aplicações criptográficas de curvas elípticas é o operador bilinear (baseado em se Weil pairing ou Tate pairing) que permite fazer, por exemplo, eficiente criptografia de identidade-baseada.

## Considerações de Execução

Mesmo que os detalhes de cada curva elíptica em particular sejam descritos em seus próprios artigos, aqui você encontrará algumas implementações sobre alguns assuntos.

### Parâmetros do Domínio

Para usar ECC, todos os partidos devem concordar com todos os elementos que definem a curva elíptica, que é parâmetro do domínio do esquema. A curva elíptica é definida pelas constantes a e b usadas em sua equação definida. Finalmente, o subgrupo cíclico é definido por seu gerador (aka. ponto base) $G$. Para a aplicação criptográfica a ordem de G, aquele é o número não-negativo o menor n tais que o $nG=O$, devem ser os primeiros. Desde que n é o tamanho de um subgrupo de $E(\mathbb {F} _{q})$ segue do teorema de Lagrange que o número $h={\frac {|E|}{n}}$ é inteiro. Em aplicações criptográficas este número h, chamado cofator, pelo menos deve ser pequeno ($h\leq 4$) e, preferivelmente, $h=1$. No caso principal os parâmetros do domínio são $(p,a,b,G,n,h)$ e no segundo caso eles são $(m,f,a,b,G,n,h)$. A menos que haja a garantia que os parâmetros do domínio foram gerados por um partido confiável com respeito a seu uso, os parâmetros do domínio devem ser validados antes de usar. A geração de parâmetros do domínio não é feita geralmente por cada participante desde que esta envolva contar o número dos pontos em uma curva que seja cansativa e incômoda para executar.
Se alguém (apesar do dito acima) quiser construir seus próprios parâmetros de domínio deve selecionar o campo subjacente e então usar uma das seguintes estratégias para encontrar uma curva com número apropriado dos pontos usando um dos seguintes métodos:
* selecionar uma curva aleatória e usar um algoritmo decontagem geral;
* selecionar uma curva aleatória de uma família que permita o cálculo fácil do número dos pontos ou;
* selecionar o número dos pontos e gerar uma curva com este número dos pontos usando a técnica complexa da multiplicação.

### Tamanhos Chaves

Desde que os os algoritmos mais rápidos que permite solucionar o ECDLP, precisa $O({\sqrt {n}})$ etapas, isso indica que o tamanho do campo subjacente será aproximadamente duas vezes o parâmetro da segurança. Por exemplo, para segurança de 128 bits necessita de uma curva maior que $\mathbb {F} _{q}$, onde $q\approx 2^{256}$. Isto pode ser contrastado com a criptografia de campo-finito (por exemplo, DSA) que requer [10] 3072 bits de chaves públicas e 256 bits chaves confidenciais , e criptografia de fatoração de inteiros (por exemplo, RSA) que requer o 3072 bits de chave-pública de 3072 bits e chaves-confidenciais. O esquema o mais difícil de ECC (publicamente) teve 109 bits de chave (que é aproximadamente 55 bits de segurança).Como primeiro exemplo do campo, foi quebrado no começo de 2003 usando-se mais que 10.000 PCs da classe Pentium que funcionam continuamente por mais que 540 dias. Como segundo exemplo do campo, foi quebrado em abril 2004 usando 2600 computadores por 17 meses.

### Coordenadas Projetáveis

Uma examinação mais próxima das réguas de adição mostra que a fim adicionar dois pontos necessita-se não somente de diversas adições e multiplicações em $\mathbb {F} _{q}$ mas também uma operação inversa.
A inversão (dado $x\in \mathbb {F} _{q}$ encontrar $y\in \mathbb {F} _{q}$ tanto que $xy=1$) é uma das duas ordens de valor mais lentas do que a multiplicação. Felizmente, os pontos em uma curva podem ser representados em sistemas coordenados diferentes que não requerem uma operação inversa para adicionar dois pontos. Diversos sistemas foram propostos:
* no sistema projetável cada ponto é representado por três coordenadas (X, Y, Z) usando a seguinte relação: $x={\frac {X}{Z}}$, $y={\frac {Y}{Z}}$;
* no sistema de Jacobian um o ponto é representado também com as três coordenadas (X, Y, Z), mas uma relação diferente é usada: $x={\frac {X}{Z^{2}}}$, $y={\frac {Y}{Z^{3}}}$;
* no sistema modificado de Jacobian as mesmas relações são usadas mas quatro coordenadas são armazenadas e usadas para cálculos $(X,Y,Z,aZ^{4})$.

## Implementações de Fonte Aberta

* OpenSSL: Open source library written in C with ECC library
* NSS: Open source crypto libraries with ECC
* Crypto++: Open source Crypto Package written in C++ with ECC library
* MIRACL: Multiprecision Integer and Rational Arithmetic C/C++ Library
* LibTomCrypt: Public domain crypto library with ECC
* seccure: minimal footprint GPLed ECC tool with public key encryption and digital signatures
* SKS: very small open source tool for ECC (like a simplified PGP)
* eccGnuPG: An experimental patch to GnuPG
* Curve25519: A state-of-the-art Diffie-Hellman function by Dan Bernstein
* TinyECC: a software package providing ECC operations on TinyOS
* libecc: Open source ECC library
* Bouncy Castle: Open source crypto package for Java and C# that includes ECC