Troca de chaves de Diffie–Hellman: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
m Tradução de imagem troca de chave Diffie-Hellman
Linha 15: Linha 15:


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 a seguir ilustra a ideia geral de troca de chaves usando cores ao invés de um número muito grande.
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 a seguir ilustra a ideia geral de troca de chaves usando cores ao invés de um número muito grande.
# 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.
# Inicialmente, uma cor em comum é compartilhada entre Alice e João, 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.
# O passo seguinte é a escolha de Alice e João, 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.
# 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.
# O passo chave do processo é que Alice e João 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 João 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 João 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 João, sem que um terceiro que esteja observando a comunicação consiga produzir esta mistura secundária.


Alice e Bob usam sua chave comum encriptar e desencriptar de modo secreto suas mensagens. Note que a cor amarela já foi previamente acordada por Alice e Bob.
Alice e João usam sua chave comum encriptar e desencriptar de modo secreto suas mensagens. Note que a cor amarela já foi previamente acordada por Alice e João.
[[Ficheiro:Diffie-Hellman.jpg|centro|miniaturadaimagem|468x468px|Esquema de troca de chaves de Diffie-Hellman]]
[[Ficheiro:Diffie-Hellman.jpg|centro|miniaturadaimagem|468x468px|Esquema de troca de chaves de Diffie-Hellman]]
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 <span style="color:blue">azul</span> e os valores secretos estão em <span style="color:red"> '''vermelho e destacados''' </span>:
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 <span style="color:blue">azul</span> e os valores secretos estão em <span style="color:red"> '''vermelho e destacados''' </span>:
Linha 29: Linha 29:
! colspan="3" | Alice
! colspan="3" | Alice
| <br>
| <br>
| align="center" colspan="3" | '''Bob'''<br>
| align="center" colspan="3" | '''João'''<br>
|-
|-
| bgcolor="#d0d0d0" align="center" style="font-size: 90%;" | Secreto
| bgcolor="#d0d0d0" align="center" style="font-size: 90%;" | Secreto
Linha 72: Linha 72:
|}
|}


# [[Alice e Bob]] entram em acordo para usar um número primo ''<span style="color:blue">p</span>''=<span style="color:blue">23</span> e como base ''<span style="color:blue">g</span>''=<span style="color:blue">5</span>.
# [[Alice e João]] entram em acordo para usar um número primo ''<span style="color:blue">p</span>''=<span style="color:blue">23</span> e como base ''<span style="color:blue">g</span>''=<span style="color:blue">5</span>.
# Alice escolhe um inteiro secreto '''''<span style="color:red">a</span>'''''='''<span style="color:red">6</span>''', e então envia a Bob <span style="color:blue">A</span> = ''<span style="color:blue">g</span><sup>'''<span style="color:red">a</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
# Alice escolhe um inteiro secreto '''''<span style="color:red">a</span>'''''='''<span style="color:red">6</span>''', e então envia a João <span style="color:blue">A</span> = ''<span style="color:blue">g</span><sup>'''<span style="color:red">a</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
#* <span style="color:blue">A</span> = <span style="color:blue">5</span><sup>'''<span style="color:red">6</span>'''</sup> mod <span style="color:blue">23</span>
#* <span style="color:blue">A</span> = <span style="color:blue">5</span><sup>'''<span style="color:red">6</span>'''</sup> mod <span style="color:blue">23</span>
#* <span style="color:blue">A</span> = '''<span style="color:red">15.625</span>''' mod <span style="color:blue">23</span>
#* <span style="color:blue">A</span> = '''<span style="color:red">15.625</span>''' mod <span style="color:blue">23</span>
#* <span style="color:blue">A</span> = <span style="color:blue">8</span>
#* <span style="color:blue">A</span> = <span style="color:blue">8</span>
# Bob escolhe um inteiro secreto '''''<span style="color:red">b</span>'''''='''<span style="color:red">15</span>''', e então envia a Alice <span style="color:blue">B</span> = ''<span style="color:blue">g</span><sup>'''<span style="color:red">b</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
# João escolhe um inteiro secreto '''''<span style="color:red">b</span>'''''='''<span style="color:red">15</span>''', e então envia a Alice <span style="color:blue">B</span> = ''<span style="color:blue">g</span><sup>'''<span style="color:red">b</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
#* <span style="color:blue">B</span> = <span style="color:blue">5</span><sup>'''<span style="color:red">15</span>'''</sup> mod <span style="color:blue">23</span>
#* <span style="color:blue">B</span> = <span style="color:blue">5</span><sup>'''<span style="color:red">15</span>'''</sup> mod <span style="color:blue">23</span>
#* <span style="color:blue">B</span> = '''<span style="color:red">30.517.578.125</span>''' mod <span style="color:blue">23</span>
#* <span style="color:blue">B</span> = '''<span style="color:red">30.517.578.125</span>''' mod <span style="color:blue">23</span>
Linha 85: Linha 85:
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">47.045.881</span>''' mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">47.045.881</span>''' mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''
# Bob calcula '''<span style="color:red">s</span>''' = ''<span style="color:blue">A</span>'' ''<sup>'''<span style="color:red">b</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
# João calcula '''<span style="color:red">s</span>''' = ''<span style="color:blue">A</span>'' ''<sup>'''<span style="color:red">b</span>'''</sup>'' mod ''<span style="color:blue">p</span>''
#* '''<span style="color:red">s</span>''' = <span style="color:blue">8</span><sup>'''<span style="color:red">15</span>'''</sup> mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = <span style="color:blue">8</span><sup>'''<span style="color:red">15</span>'''</sup> mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">35.184.372.088.832</span>''' mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">35.184.372.088.832</span>''' mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''
# Alice e Bob compartilham agora uma chave secreta: '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''. Isto é possível porque <span style="color:red">6</span>*<span style="color:red">15</span> é o mesmo que <span style="color:red">15</span>*<span style="color:red">6</span>. Alguém que tenha descoberto estes dois inteiros privados também será capaz de calcular <span style="color:red">s</span> da seguinte maneira:
# Alice e João compartilham agora uma chave secreta: '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''. Isto é possível porque <span style="color:red">6</span>*<span style="color:red">15</span> é o mesmo que <span style="color:red">15</span>*<span style="color:red">6</span>. Alguém que tenha descoberto estes dois inteiros privados também será capaz de calcular <span style="color:red">s</span> da seguinte maneira:
#* '''<span style="color:red">s</span>''' = <span style="color:blue">5</span><sup>'''<span style="color:red">6*15</span>'''</sup> mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = <span style="color:blue">5</span><sup>'''<span style="color:red">6*15</span>'''</sup> mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = <span style="color:blue">5</span><sup>'''<span style="color:red">15*6</span>'''</sup> mod <span style="color:blue">23</span>
#* '''<span style="color:red">s</span>''' = <span style="color:blue">5</span><sup>'''<span style="color:red">15*6</span>'''</sup> mod <span style="color:blue">23</span>
Linha 96: Linha 96:
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''
#* '''<span style="color:red">s</span>''' = '''<span style="color:red">2</span>'''


Tanto Alice quanto Bob chegaram no mesmo valor pois (''g<sup>a</sup>'')''<sup>b</sup>'' e (''g<sup>b</sup>'')''<sup>a</sup>'' são iguais mod ''p''. Note que apenas ''a'', ''b'' e ''g<sup>ab</sup> = g<sup>ba</sup>'' mod ''p'' são mantidos em segredo. Todos os demais valores – ''p'', ''g'', ''g<sup>a</sup> mod p'', e ''g<sup>b</sup> 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.
Tanto Alice quanto João chegaram no mesmo valor pois (''g<sup>a</sup>'')''<sup>b</sup>'' e (''g<sup>b</sup>'')''<sup>a</sup>'' são iguais mod ''p''. Note que apenas ''a'', ''b'' e ''g<sup>ab</sup> = g<sup>ba</sup>'' mod ''p'' são mantidos em segredo. Todos os demais valores – ''p'', ''g'', ''g<sup>a</sup> mod p'', e ''g<sup>b</sup> mod p'' – são enviados limpos no canal público. Uma vez que Alice e João 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<sup>ab</sup>'' 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<sup>b</sup>'' mod ''p'' e ''g<sup>a</sup>'' 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.
É 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<sup>ab</sup>'' 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<sup>b</sup>'' mod ''p'' e ''g<sup>a</sup>'' 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.


Linha 103: Linha 103:
Aqui está uma descrição mais genérica do protocolo:
Aqui está uma descrição mais genérica do protocolo:


# Alice e Bob acordam em um [[grupo cíclico]] finito ''G'' e um elemento [[Generating set of a group|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 e João acordam em um [[grupo cíclico]] finito ''G'' e um elemento [[Generating set of a group|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<sup>a</sup>'' para Bob.
# Alice escolhe um [[número natural]] aleatório ''a'' e envia ''g<sup>a</sup>'' para João.
# Bob também escolhe um número natural aleatório ''b'' e envia ''g<sup>b</sup>'' para Alice.
# João também escolhe um número natural aleatório ''b'' e envia ''g<sup>b</sup>'' para Alice.
# Alice calcula (''g<sup>b</sup>'')''<sup>a</sup>''.
# Alice calcula (''g<sup>b</sup>'')''<sup>a</sup>''.
# Bob calcula(''g<sup>a</sup>'')''<sup>b</sup>''.
# João calcula(''g<sup>a</sup>'')''<sup>b</sup>''.


Tanto Alice quanto Bob estão agora de posse de elemento de grupo ''g<sup>ab</sup>'', que pode servir como a chave secreta compartilhada. Os valores de (''g<sup>b</sup>'')''<sup>a</sup>'' e (''g<sup>a</sup>'')''<sup>b</sup>'' são os mesmos porque os grupos são [[Power-associativity|associativos a potência]]. (Veja também [[exponenciação]].)
Tanto Alice quanto João estão agora de posse de elemento de grupo ''g<sup>ab</sup>'', que pode servir como a chave secreta compartilhada. Os valores de (''g<sup>b</sup>'')''<sup>a</sup>'' e (''g<sup>a</sup>'')''<sup>b</sup>'' são os mesmos porque os grupos são [[Power-associativity|associativos a potência]]. (Veja também [[exponenciação]].)


Com o objetivo de decifrar uma mensagem ''m'', enviada como ''mg<sup>ab</sup>'', Bob (ou Alice) deve primeiro calcular ''(g<sup>ab</sup>)<sup>-1</sup>'', da seguinte maneira:
Com o objetivo de decifrar uma mensagem ''m'', enviada como ''mg<sup>ab</sup>'', João (ou Alice) deve primeiro calcular ''(g<sup>ab</sup>)<sup>-1</sup>'', da seguinte maneira:


Bob sabe ''|G|, b,'' e ''g<sup>a</sup>''. Um resultado da teoria de grupos estabelece que a partir da construção de G, ''x<sup>|G|</sup> = 1'' para todo ''x'' em ''G''.
João sabe ''|G|, b,'' e ''g<sup>a</sup>''. Um resultado da teoria de grupos estabelece que a partir da construção de G, ''x<sup>|G|</sup> = 1'' para todo ''x'' em ''G''.


Bob então calcula ''(g<sup>a</sup>)<sup>|G|-b</sup> = g<sup>a(|G|-b)</sup> = g<sup>a|G|-ab</sup> = g<sup>a|G|</sup>g<sup>-ab</sup> = (g<sup>|G|</sup>)<sup>a</sup>g<sup>-ab</sup>=1<sup>a</sup>g<sup>-ab</sup>=g<sup>-ab</sup>=(g<sup>ab</sup>)<sup>-1</sup>.''
João então calcula ''(g<sup>a</sup>)<sup>|G|-b</sup> = g<sup>a(|G|-b)</sup> = g<sup>a|G|-ab</sup> = g<sup>a|G|</sup>g<sup>-ab</sup> = (g<sup>|G|</sup>)<sup>a</sup>g<sup>-ab</sup>=1<sup>a</sup>g<sup>-ab</sup>=g<sup>-ab</sup>=(g<sup>ab</sup>)<sup>-1</sup>.''


Quando Alice envia a Bob a mensagem encriptada, ''mg<sup>ab</sup>'', Bob aplica ''(g<sup>ab</sup>)<sup>-1</sup>'' e recupera ''mg<sup>ab</sup>(g<sup>ab</sup>)<sup>-1</sup> = m(1) = m.''
Quando Alice envia a João a mensagem encriptada, ''mg<sup>ab</sup>'', João aplica ''(g<sup>ab</sup>)<sup>-1</sup>'' e recupera ''mg<sup>ab</sup>(g<sup>ab</sup>)<sup>-1</sup> = m(1) = m.''


=== Gráfico ===
=== Gráfico ===


== Operação com mais de duas partes ==
== 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 <math>p</math>:
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, João 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 <math>p</math>:
# Os participantes selecionam os parâmetros iniciais do algoritmo <math>p</math> e <math>g</math>;
# Os participantes selecionam os parâmetros iniciais do algoritmo <math>p</math> e <math>g</math>;
# Os participantes geram suas respectivas chaves privadas, que chamaremos <math>a</math>, <math>b</math> e <math>c</math>.
# Os participantes geram suas respectivas chaves privadas, que chamaremos <math>a</math>, <math>b</math> e <math>c</math>.
# Alice calcula <math>g^a</math> e envia o resultado para Bob.
# Alice calcula <math>g^a</math> e envia o resultado para João.
# Bob calcula <math>(g^a)^b = g^{ab}</math> e envia o resultado para Carol.
# João calcula <math>(g^a)^b = g^{ab}</math> e envia o resultado para Carol.
# Carol calcula <math>(g^{ab})^c = g^{abc}</math> e utiliza esse valor como sua chave secreta compartilhada.
# Carol calcula <math>(g^{ab})^c = g^{abc}</math> e utiliza esse valor como sua chave secreta compartilhada.
# Bob calcula <math>g^b</math> e envia para Carol
# João calcula <math>g^b</math> e envia para Carol
# Carol calcula <math>(g^b)^c = g^{bc}</math> e envia o resultado para Alice.
# Carol calcula <math>(g^b)^c = g^{bc}</math> e envia o resultado para Alice.
# Alice calcula <math>(g^{bc})^a = g^{bca} = g^{abc}</math> e utiliza o resultado como chave secreta compartilhada.
# Alice calcula <math>(g^{bc})^a = g^{bca} = g^{abc}</math> e utiliza o resultado como chave secreta compartilhada.
# Carol calcula <math>g^c</math> e envia para Alice.
# Carol calcula <math>g^c</math> e envia para Alice.
# Alice calcula <math>(g^c)^a = g^{ca}</math> e envia o resultado para Bob.
# Alice calcula <math>(g^c)^a = g^{ca}</math> e envia o resultado para João.
# Bob calcula <math>(g^{ca})^b = g^{cab} = g^{abc}</math> e utiliza o resultado como chave secreta compartilhada.
# João calcula <math>(g^{ca})^b = g^{cab} = g^{abc}</math> 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 <math>g^a</math>, <math>g^b</math>, <math>g^c</math>, <math>g^{ab}</math>, <math>g^{ac}</math>, e <math>g^{bc}</math>, mas não pode usar qualquer combinação desses valores para reproduzir <math>g^{abc}</math>.
Um intruso com acesso ao canal onde essas mensagens foram trocadas foi capaz de observar os valores <math>g^a</math>, <math>g^b</math>, <math>g^c</math>, <math>g^{ab}</math>, <math>g^{ac}</math>, e <math>g^{bc}</math>, mas não pode usar qualquer combinação desses valores para reproduzir <math>g^{abc}</math>.

Revisão das 11h30min de 7 de maio de 2022

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.

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.[1] 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 sistema é conhecido desde então como troca de chave de Diffie-Hellman. Enquanto tal sistema foi descrito em um artigo por mim e Diffie, ele é um sistema de distribuição de chave pública, um conceito desenvolvido por Merkle, e desta forma deveria ser chamado de "troca de chave de Diffie-Hellman-Merkle". Eu espero que esta pequena contribuição ajude na jornada para reconhecer as contribuições de Merkle na invenção da criptografia de chave pública.

O método foi seguido pelo RSA, uma outra implementação de criptografia de chave pública usando algoritmos assimétricos.

Descrição

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 a seguir ilustra a ideia geral de troca de chaves usando cores ao invés de um número muito grande.

  1. Inicialmente, uma cor em comum é compartilhada entre Alice e João, cor esta que pode ser observada por um terceiro interessado na comunicação entre os dois.
  2. O passo seguinte é a escolha de Alice e João, cada um, de uma cor secreta própria, que não é compartilhada com ninguém.
  3. Cada um faz uma mistura primária com a cor comum e com suas cores secretas.
  4. O passo chave do processo é que Alice e João 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 João utilizaram, caso um terceiro esteja escutando a comunicação.
  5. Alice e João 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 João, sem que um terceiro que esteja observando a comunicação consiga produzir esta mistura secundária.

Alice e João usam sua chave comum encriptar e desencriptar de modo secreto suas mensagens. Note que a cor amarela já foi previamente acordada por Alice e João.

Esquema de troca de chaves de Diffie-Hellman

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
João
Secreto Público Calcula Envia
Calcula
Público
Secreto
a
p, g
p,g

b
a
p, g, A
ga mod p = A A
p, g
b
a
p, g, A

B
gb mod p = B
p, g, A, B
b
a, s p, g, A, B
Ba mod p = s

Ab mod p = s
p, g, A, B
b, s
  1. Alice e João entram em acordo para usar um número primo p=23 e como base g=5.
  2. Alice escolhe um inteiro secreto a=6, e então envia a João A = ga mod p
    • A = 56 mod 23
    • A = 15.625 mod 23
    • A = 8
  3. João escolhe um inteiro secreto b=15, e então envia a Alice B = gb mod p
    • B = 515 mod 23
    • B = 30.517.578.125 mod 23
    • B = 19
  4. Alice calcula s = B a mod p
    • s = 196 mod 23
    • s = 47.045.881 mod 23
    • s = 2
  5. João calcula s = A b mod p
    • s = 815 mod 23
    • s = 35.184.372.088.832 mod 23
    • s = 2
  6. Alice e João 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 = 56*15 mod 23
    • s = 515*6 mod 23
    • s = 590 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 João chegaram no mesmo valor pois (ga)b e (gb)a são iguais mod p. Note que apenas a, b e gab = gba mod p são mantidos em segredo. Todos os demais valores – p, g, ga mod p, e gb mod p – são enviados limpos no canal público. Uma vez que Alice e João 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 gab 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, gb mod p e ga 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.

Exemplo matemático do esquema de Diffie-Hellman

Aqui está uma descrição mais genérica do protocolo:

  1. Alice e João 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.
  2. Alice escolhe um número natural aleatório a e envia ga para João.
  3. João também escolhe um número natural aleatório b e envia gb para Alice.
  4. Alice calcula (gb)a.
  5. João calcula(ga)b.

Tanto Alice quanto João estão agora de posse de elemento de grupo gab, que pode servir como a chave secreta compartilhada. Os valores de (gb)a e (ga)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 mgab, João (ou Alice) deve primeiro calcular (gab)-1, da seguinte maneira:

João sabe |G|, b, e ga. Um resultado da teoria de grupos estabelece que a partir da construção de G, x|G| = 1 para todo x em G.

João então calcula (ga)|G|-b = ga(|G|-b) = ga|G|-ab = ga|G|g-ab = (g|G|)ag-ab=1ag-ab=g-ab=(gab)-1.

Quando Alice envia a João a mensagem encriptada, mgab, João aplica (gab)-1 e recupera mgab(gab)-1 = m(1) = m.

Gráfico

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, João 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 :

  1. Os participantes selecionam os parâmetros iniciais do algoritmo e ;
  2. Os participantes geram suas respectivas chaves privadas, que chamaremos , e .
  3. Alice calcula e envia o resultado para João.
  4. João calcula e envia o resultado para Carol.
  5. Carol calcula e utiliza esse valor como sua chave secreta compartilhada.
  6. João calcula e envia para Carol
  7. Carol calcula e envia o resultado para Alice.
  8. Alice calcula e utiliza o resultado como chave secreta compartilhada.
  9. Carol calcula e envia para Alice.
  10. Alice calcula e envia o resultado para João.
  11. João calcula 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 , , , , , e , mas não pode usar qualquer combinação desses valores para reproduzir .

Demais usos

Acordo de chaves para autenticação de senhas

Chave pública

É utilizada em 128 bits.

Veja também

Notas

Ligações Externas

Referências

  1. «Public Key Cryptography (PKC), RSA, PKI». www.livinginternet.com. Consultado em 8 de abril de 2010 

Ver também

Ícone de esboço Este artigo sobre informática é um esboço. Você pode ajudar a Wikipédia expandindo-o.