# Troca de chaves de Diffie–Hellman

A troca de chaves de Diffie-Hellman é um método de criptografia para trocas de chaves de maneira segura em canal público. Desenvolvido por Whitfield Diffie e Martin Hellman, foi um dos primeiros exemplos práticos de métodos de troca de chaves implementado dentro do campo da criptografia, tendo sido publicado em 1976.
Tradicionalmente, uma comunicação criptografada segura entre duas partes exigia que trocassem as chaves a priori por algum meio físico seguro, como uma lista de chaves em papel transportada por um mensageiro confiável. O método da troca de chaves de Diffie-Hellman permite que duas partes que não possuem conhecimento prévio uma da outra, compartilhem uma chave secreta sob um canal de comunicação inseguro. Tal chave pode ser usada para encriptar mensagens posteriores usando um esquema de cifra de chave simétrica.
O método Diffie-Hellman é usado para proteger uma variedade de serviços de Internet. No entanto, uma pesquisa publicada em outubro de 2015 sugere que os parâmetros em uso para muitas aplicações de Internet com DH à época não eram tão fortes o suficiente para impedir o comprometimento por invasores muito bem financiados, como os serviços de segurança de alguns países.
Tal conceito foi originalmente inventado por Malcolm Williamson, um funcionário do Government Communications Headquarters (GCHQ) no Reino Unido, alguns anos antes de Whitfield Diffie e Martin Hellman, porém o GCHQ decidiu não tornar pública a descoberta pois tratava-se de assunto de segurança nacional. Somente em 1997 foi revelado o trabalho mas não teve muita repercussão na pesquisa em universidades. O trabalho de Malcolm Williamson não incluía o conceito de assinatura digital. Em 2002, Hellman sugeriu que o algoritmo fosse chamado de troca de chave de Diffie-Hellman-Merkle, em reconhecimento às contribuições de Ralph Merkle para a invenção da criptografia de chave pública. Martin Hellman escreveu:
O método foi seguido pelo RSA, uma outra implementação de criptografia de chave pública usando algoritmos assimétricos.

## Descrição
### Visão Geral

Antes de 1975 se alguém falasse que seria possível a troca de informações criptografadas entre duas partes sem que houvesse uma troca de chaves secretas entre ambas as partes, provavelmente muitos matemáticos diriam ser impossível. Mas em 1976 o algoritmo Diffie-Hellman foi inventado. O maior problema para que isso acontecesse foi a dificuldade de cálculos de logaritmos discretos em um campo infinito.
Diffie-Hellman estabelece um compartilhamento de chaves secreto que pode ser usado para troca de mensagens secretas dentro de um canal de comunicação público. O diagrama ao lado ilustra a ideia geral de troca de chaves usando cores ao invés de um número muito grande.
A seguir, uma descrição geral do protocolo:
* Inicialmente, uma cor em comum é compartilhada entre Alice e Bob, cor esta que pode ser observada por um terceiro interessado na comunicação entre os dois.
* O passo seguinte é a escolha de Alice e Bob, cada um, de uma cor secreta própria, que não é compartilhada com ninguém.
* Cada um faz uma mistura primária com a cor comum e com suas cores secretas.
* O passo chave do processo é que Alice e Bob trocam apenas suas misturas primárias. Estas misturas primárias, resultado das combinações da cor comum e das cores secretas, muito dificilmente conseguem reverter e determinar quais as cores secretas Alice e Bob utilizaram, caso um terceiro esteja escutando a comunicação.
* Alice e Bob então usam suas cores secretas sobre as misturas primárias que receberam, gerando misturas secundárias (chave comum) que serão iguais tanto para Alice quanto para Bob, sem que um terceiro que esteja observando a comunicação consiga produzir esta mistura secundária.
Alice e Bob usam sua chave comum para encriptar e desencriptar de modo secreto suas mensagens. Note que a cor amarela já foi previamente acordada por Alice e Bob.

### Explicação criptográfica

A mais simples e original implementação do protocolo utiliza grupos multiplicativos de inteiros módulo "p", onde "p" é um número primo e "g" é uma raiz primitiva de módulo "p". Aqui está um exemplo do protocolo, onde os valores públicos estão em azul e os valores secretos estão em vermelho e destacados :
| Alice | Alice | Alice | | Bob | Bob | Bob |
| Secreto | Público | Calcula | Envia | Calcula | Público | Secreto |
| a | p, g | | p,g$\rightarrow$ | | | b |
| a | p, g, A | g$^a$ mod p = A | A$\rightarrow$ | | p, g | b |
| a | p, g, A | | $\leftarrow$ B | g$^b$ mod p = B | p, g, A, B | b |
| a, s | p, g, A, B | B$^a$ mod p = s | | A$^b$ mod p = s | p, g, A, B | b, s |
* Alice e Bob entram em acordo para usar um número primo p=23 e como base g=5.
* Alice escolhe um inteiro secreto a=6, e então envia a Bob A = g$^a$ mod p
** A = 5$^6$ mod 23 = 15.625 mod 23 = 8
* Bob escolhe um inteiro secreto b=15, e então envia a Alice B = g$^b$ mod p
** B = 5$^{15}$ mod 23 = 30.517.578.125 mod 23 = 19
* Alice calcula s = B $^a$ mod p
** s = 19$^6$ mod 23 = 47.045.881 mod 23 = 2
* Bob calcula s = A $^b$ mod p
** s = 8$^{15}$ mod 23 = 35.184.372.088.832 mod 23 = 2
* Alice e Bob compartilham agora uma chave secreta: s = 2.
Isto é possível porque 6*15 é o mesmo que 15*6. Alguém que tenha descoberto estes dois inteiros privados também será capaz de calcular s da seguinte maneira:
* s = 5$^{6*15}$ mod 23
* s = 5$^{15*6}$ mod 23
* s = 5$^{90}$ mod 23
* s = 807.793.566.946.316.088.741.610.050.849.573.099.185.363.389.551.639.556.884.765.625 mod 23
* s = 2
Tanto Alice quanto Bob chegaram no mesmo valor pois (g$^a$)$^b$ e (g$^b$)$^a$ são iguais mod p. Note que apenas a, b e g$^{ab}$ = g$^{ba}$ mod p são mantidos em segredo. Todos os demais valores – p, g, g$^a$ mod p, e g$^b$ mod p – são enviados limpos no canal público. Uma vez que Alice e Bob calculam a chave secreta, eles podem então usá-la como chave de encriptação, conhecida apenas por eles, para enviar e receber mensagens ao longo do mesmo canal de comunicação.
É claro que valores bem maiores de a, b, e p seriam necessários para tornar este exemplo seguro, uma vez que é fácil tentar todos os possíveis valores de g$^{ab}$ mod 23. Existem apenas 23 possíveis inteiros que possuem os resultados observados para mod 23. Por outro lado, se p for um primo de ao menos 300 dígitos e a e b tenham ao menos 100 dígitos, então até os melhores algoritmos conhecidos atualmente não poderiam encontrar a dado apenas g, p, g$^b$ mod p e g$^a$ mod p, mesmo usando todo o poder computacional existente na humanidade. Tal problema é conhecido como problema do logaritmo discreto. Note que g não precisa ser necessariamente grande, e na prática seus valores são usualmente 2 ou 5.

### Generalização para grupos cíclicos finitos

Aqui está uma descrição mais genérica do protocolo:
* Alice e Bob acordam em um grupo cíclico finito G e um elemento gerador g em G.( Isto é usualmente feito muito antes do resto do protocolo; assume que g é conhecido por todos os atacantes.) Nós vamos escrever o grupo G de modo multiplicativo.
* Alice escolhe um número natural aleatório a e envia g$^a$ para Bob.
* Bob também escolhe um número natural aleatório b e envia g$^b$ para Alice.
* Alice calcula (g$^b$)$^a$.
* Bob calcula(g$^a$)$^b$.
Tanto Alice quanto Bob estão agora de posse de elemento de grupo g$^{ab}$, que pode servir como a chave secreta compartilhada. Os valores de (g$^b$)$^a$ e (g$^a$)$^b$ são os mesmos porque os grupos são associativos a potência. (Veja também exponenciação.)
Com o objetivo de decifrar uma mensagem m, enviada como mg$^{ab}$, Bob (ou Alice) deve primeiro calcular (g$^{ab}$)$^{-1}$, da seguinte maneira:
Bob sabe |G|, b, e g$^a$. Um resultado da teoria de grupos estabelece que a partir da construção de G, x$^{|G|}$ = 1 para todo x em G.
Bob então calcula (g$^a$)$^{|G|-b}$ = g$^{a(|G|-b)}$ = g$^{a|G|-ab}$ = g$^{a|G|}$g$^{-ab}$ = (g$^{|G|}$)$^a$g$^{-ab}$=1$^a$g$^{-ab}$=g$^{-ab}$=(g$^{ab}$)$^{-1}$.
Quando Alice envia a Bob a mensagem encriptada, mg$^{ab}$, Bob aplica (g$^{ab}$)$^{-1}$ e recupera mg$^{ab}$(g$^{ab}$)$^{-1}$ = m(1) = m.

## Operação com mais de duas partes

O esquema de acordo de chaves Diffie-Helman não está limitado à interação entre apenas dois participantes. Qualquer número de usuários pode participar no acordo, executando as interações do protocolo e trocando os dados intermediários entre si. Por exemplo, Alice, Bob e Carol poderiam participar em um acordo do tipo Diffie-Hellman de acordo com o exemplo a seguir, onde todas as operações tomadas com módulo $p$:
* Os participantes selecionam os parâmetros iniciais do algoritmo $p$ e $g$;
* Os participantes geram suas respectivas chaves privadas, que chamaremos $a$, $b$ e $c$.
* Alice calcula $g^{a}$ e envia o resultado para Bob.
* Bob calcula $(g^{a})^{b}=g^{ab}$ e envia o resultado para Carol.
* Carol calcula $(g^{ab})^{c}=g^{abc}$ e utiliza esse valor como sua chave secreta compartilhada.
* Bob calcula $g^{b}$ e envia para Carol
* Carol calcula $(g^{b})^{c}=g^{bc}$ e envia o resultado para Alice.
* Alice calcula $(g^{bc})^{a}=g^{bca}=g^{abc}$ e utiliza o resultado como chave secreta compartilhada.
* Carol calcula $g^{c}$ e envia para Alice.
* Alice calcula $(g^{c})^{a}=g^{ca}$ e envia o resultado para Bob.
* Bob calcula $(g^{ca})^{b}=g^{cab}=g^{abc}$ e utiliza o resultado como chave secreta compartilhada.
Um intruso com acesso ao canal onde essas mensagens foram trocadas foi capaz de observar os valores $g^{a}$, $g^{b}$, $g^{c}$, $g^{ab}$, $g^{ac}$, e $g^{bc}$, mas não pode usar qualquer combinação desses valores para reproduzir $g^{abc}$.