Criptografia Numaboa
Funções de mão única
Ter 2 Out 2007 18:33 |
- Detalhes
- Categoria: Chave Pública
- Atualização: Terça, 21 Abril 2009 21:50
- Autor: vovó Vicki
- Acessos: 11720
A noção de funções de mão única é fundamental na criptografia de chave pública. As funções de mão única, apesar de não serem um protocolo, são peças fundamentais na construção dos algoritmos assimétricos, também conhecidos como algoritmos de chave pública.
O que são funções de mão única
Funções de mão única são funções relativamente fáceis de calcular, mas quase impossíveis de reverter ou desfazer. Matematicamente falando, se tivermos o valor de x, é fácil calcular f(x), mas se tivermos o valor f(x), é muito difícil encontrar o valor de x. O "difícil" ou "quase impossível" quer dizer que nem em um milhão de anos todos os computadores do mundo trabalhando juntos seriam capazes de calcular o valor reverso.
É um exagero quando se afirma que funções de mão única são absolutamente irreversíveis. Aliás, nunca chegou a ser provado que tais funções realmente existam, como também não existe nenhuma evidência de que possam ser construídas. Apesar disto, existem muitas funções que têm o jeitão de mão única: podemos calculá-las com eficiência, mas, com os meios atuais, não se conhece um modo fácil de revertê-las. Por exemplo, x2 é fácil de calcular, mas a raiz quadrada de x é muito mais difícil de se obter.
Filosofanças à parte, para dar continuidade a este texto vamos considerar as funções de mão única como sendo impossíveis de serem revertidas.
Para o que servem funções de mão única
Funções de mão única não são apropriadas para encriptar mensagens porque o texto cifrado não pode ser revertido para se obter novamente o texto claro. Se é impossível obter o texto claro de uma mensagem cifrada com uma função de mão única, então para que todo este papo? Bem, é que existem algumas funções deste tipo que possuem uma passagem secreta ou alçapão.
Uma função de mão única com alçapão (trapdoor one-way function) mantém as características da família (fácil de calcular e impossível de reverter), mas, quando se conhece o segredo, os dois cálculos ficam fáceis. A coisa é mais ou menos assim: conhecendo o valor de x, calcular o valor de f(x) é fácil; calcular x conhecendo o valor de f(x) é impossível; calcular x conhecendo f(x) e o segredo y é fácil.
Uma caixa de correio é uma boa comparação que pode ser feita com estas funções especiais: a abertura da caixa é pública, qualquer um pode jogar uma carta dentro da caixa. Abrir a caixa de correio já é outra conversa: é preciso detonar a caixa com uma marreta ou a pessoa autorizada pode abri-la sem muito esforço porque possui a chave. A criptografia de chave pública funciona baseada neste princípio. Você pode ler mais a respeito no artigo Criptografia de chave pública.
Funções hash de mão única
Funções hash de mão única possuem vários nomes: funções de compressão, funções de contração, digesto de mensagem, impressão digital (fingerprint), checksum criptográfico, checagem de integridade de dados (DIC - data integrity check), código de detecção de manipulação (MDC - manipulation detection code), código de autenticação de mensagem (MAC - message authentication code) e código de autenticação de dados (DAC - data authentication code). Este montão de nomes tem uma explicação. As funções hash de mão única fazem parte de um novo filão criptográfico descoberto recentemente. Os autores precisavam dar nomes às suas descobertas para publicá-las e divulgá-las nos meios científicos. À medida em que foram sendo aplicadas na prática, acabaram recebendo mais alguns nomes e apelidos. Isto é uma coisa típica da modernidade.
As funções hash de mão única (as hash manetas :blush: ) são mais nobres que as funções hash simples, já são conhecidas há um bom tempo. Estas primas mais pobres (mas não menos eficientes) recebem uma string e a transformam numa outra string de tamanho fixo geralmente menor. Um exemplo bem simples é uma função hash que recebe como entrada uma string e a transforma em um único byte fazendo XOR com todos os bytes da string de entrada. Qual seria a utilidade desta função hash? A de criar uma impressão digital para a string de entrada. Possuindo esta impressão digital podemos compará-la com impressões digitais produzidas por outras strings de entrada e indicar se cada uma das novas strings de entrada pode, ou não, ser igual à string original. A certeza não é absoluta, mas a probabilidade de acertar é muito grande. A "probabilidade de acertar é muito grande" quer dizer que strings diferentes podem gerar impressões digitais iguais. Toda vez que isto for possível, estamos falando de funções "muitas para uma", ou seja, mais de uma entrada produz a mesma saída. Para um especialista no assunto, se ele "sacar" a função hash, bem... forjar uma string que produza a mesma impressão digital não é um bicho de sete cabeças.
Já com uma função hash de mão única a coisa muda de figura. É fácil gerar uma impressão digital de uma string, mas é muito difícil criar uma string que produza o mesmo resultado. Isto aumenta consideravelmente o grau de confiança na comparação de impressões digitais de strings e nos leva a um novo patamar de segurança. Até que alguém apareça com novidades!