Ataque do aniversário

Fonte: testwiki
Revisão em 17h17min de 25 de fevereiro de 2025 por imported>Cosmo Skerry (A Wikipédia não serve como fonte para si mesma WP:WIKIPÉDIA)
(dif) ← Revisão anterior | Revisão atual (dif) | Revisão seguinte → (dif)
Saltar para a navegação Saltar para a pesquisa

Predefinição:Mais notas O ataque do aniversário é um tipo de ataque criptográfico que explora a matemática por trás do paradoxo do aniversário na teoria da probabilidade. Este ataque pode ser usado para abusar de comunicação entre duas ou mais partes. O ataque depende da maior probabilidade de colisão encontrada entre as tentativas de ataque aleatório e um grau fixo de permutações (pigeonholes).

Entendendo o problema

Como um exemplo, considere o cenário no qual um professor com uma classe de 30 estudantes pergunta pelo aniversário de todo mundo, para determinar se quaisquer dois estudantes tem o mesmo dia de aniversário [correspondendo a uma colisão hash como descrito mais adiante (por simplicidade, ignore 29 de fevereiro)]. Intuitivamente, essa chance pode parecer pequena. Se o professor escolheu um dia específico (digamos 16 de setembro), então a chance de pelo menos um aluno ter nascido naquele dia especifico é 1(364/365)30, cerca de 7.9%. No entanto, a probabilidade de pelo menos um estudante ter a mesma data de aniversário de ''qualquer'' outro estudante é por volta de 70% para n = 30, a partir da fórmula1365!/((365n)!365n).[1]

Matemática

Dada uma função f, o objetivo do ataque é encontrar duas diferentes entradas, x1 e x2 tais que f(x1)=f(x2). Tal par x1,x2 é chamado colisão. O método usado para encontrar uma colisão é simplesmente calcular a função f para diferentes valores de entrada que podem ser escolhidos aleatoriamente ou pseudo-aleatoriamente até que o mesmo resultado seja encontrado mais de uma vez. Devido ao problema do aniversário, esse método pode ser bastante eficiente. Especificamente, se uma função f(x) fornece qualquer dos H diferentes saídas com igual probabilidade e H é suficientemente grande, então esperamos obter um par de diferentes argumentos x1 e x2 com f(x1)=f(x2) após calcular a função para cerca de 1.25H argumentos diferentes em média.

Consideremos o seguinte experimento. A partir de um conjunto de H valores escolhemos n valores uniformemente aleatórios permitindo, assim, repetições. Seja p(nH) a probabilidade que durante esse experimento, pelo menos um valor seja escolhido mais de uma vez. Essa probabilidade pode ser escolhida comop(n;H)1en(n1)/(2H)1en2/(2H),

Seja n(pH) o menor número de valores que temos para escolher, tal que a probabilidade de encontrar uma colisão seja, pelo menos, p. Pela inversão desta expressão acima, encontramos a seguinte aproximação

n(p;H)2Hln11p,

e atribuindo uma probabilidade de colisão 0,5, chegamos em

n(0.5;H)1.1774H.

Seja Q(H) o número esperado de valores que temos para escolher antes de encontrar a primeira colisão. Esse número pode ser aproximado por

Q(H)π2H.

Como um exemplo, se um hash de 64-bit é usado, então há aproximadamente 1.8 × 1019 diferentes saídas (18.446.744.073.709.551.616). Se todos estes são igualmente prováveis (o melhor caso), deveria-se considerar 'apenas' 5 bilhões de tentativas (5.1 × 109) para gerar uma colisão usando força bruta. Esse valor é chamado limitante do aniversário e para códigos de n bits poderia ser computados como 2n/2.[2] Outros exemplos são os seguintes:

Bits Possíveis saídas

(2 s.f.) (H)

Probabilidade desejada de colisão aleatória

(2 s.f.) (p)

10−18 10−15 10−12 10−9 10−6 0.1% 1% 25% 50% 75%
16 65,536 <2 <2 <2 <2 <2 11 36 190 300 430
32 4.3 × 109 <2 <2 <2 3 93 2900 9300 50,000 77,000 110,000
64 1.8 × 1019 6 190 6100 190,000 6,100,000 1.9 × 108 6.1 × 108 3.3 × 109 5.1 × 109 7.2 × 109
128 3.4 × 1038 2.6 × 1010 8.2 × 1011 2.6 × 1013 8.2 × 1014 2.6 × 1016 8.3 × 1017 2.6 × 1018 1.4 × 1019 2.2 × 1019 3.1 × 1019
256 1.2 × 1077 4.8 × 1029 1.5 × 1031 4.8 × 1032 1.5 × 1034 4.8 × 1035 1.5 × 1037 4.8 × 1037 2.6 × 1038 4.0 × 1038 5.7 × 1038
384 3.9 × 10115 8.9 × 1048 2.8 × 1050 8.9 × 1051 2.8 × 1053 8.9 × 1054 2.8 × 1056 8.9 × 1056 4.8 × 1057 7.4 × 1057 1.0 × 1058
512 1.3 × 10154 1.6 × 1068 5.2 × 1069 1.6 × 1071 5.2 × 1072 1.6 × 1074 5.2 × 1075 1.6 × 1076 8.8 × 1076 1.4 × 1077 1.9 × 1077
A tabela mostra o número de hashes n(p) necessário para alcançar necessário para alcançar a probabilidade de sucesso dada. Para comparação, de 10−18 a 10−15 representa a taxa de erro de bits incorrigíveis de um típico disco rígido . Na teoria, hashes MD5 ou UUIDs, sendo 128 bits, deveria ficar dentro deste intervalo até cerca de 820 bilhões de documentos, mesmo se suas possíveis saídas são muitos mais que isso.

É fácil ver que se as saídas da função são distribuídas desigualmente, então a colisão poderia ser encontrada ainda mais rapidamente. A noção de 'equilíbrio' de uma função de hash quantifica a resistência de uma função para o ataque do aniversário (explorando chave de distribuição desigual) e permite que a vulnerabilidade dos hashes populares tais como MD e SHA seja estimada (Bellare and Kohno, 2004).

A subexpressão ln11p na equação para n(p;H) não é precisamente computada para p pequeno quando diretamente traduzido para linguagens de programação comuns como log(1/(1-p)) devido a perda de significância. Quando log1p é disponível (como é em C99) por exemplo, a expressão equivalente -log1p(-p) deveria então ser usada.[3] Se isso não for feito, a primeira coluna da tabela acima é computada como zero, e vários itens na segunda coluna não tem dígito significativo correto.

Exemplo de código fonte

Há uma função em Python que pode precisamente gerar a tabela acima:

def birthday(probability_exponent, bits):
    from math import log1p, sqrt
    probability = 10. ** probability_exponent
    outputs     =  2. ** bits
    return sqrt(2. * outputs * -log1p(-probability))

Se o código é salvo em um arquivo chamado birthday.py, ele pode ser rodado ele pode ser executado de forma interactiva como no exemplo a seguir:

$ python -i birthday.py
>>> birthday(-15, 128)
824963474247.1193
>>> birthday(-6, 32)
92.68192319417072

Aproximação simples

Uma boa regra de ouro que pode ser usada para cálculo mental é a relação

p(n)n22m

que também pode ser escrita como

n2m×p(n).

Isso funciona bem para probabilidades menores ou iguais a 0,5.

Esse esquema de aproximação é especialmente fácil para usar quando trabalhar com expoentes. Por exemplo, suponha que você esteja construindo hashes de (m=232) e quer que a chance de uma colisão seja, no máximo, uma em um milhão (p220), quantos documentos poderíamos ter no máximo?

n2×232×220=21+3220=213=26.590.5

que é próximo da resposta correta, que é 93.

Suscetibilidade da assinatura digital

Assinaturas digitais podem ser suscetíveis a um ataque do aniversário. Uma mensagem m é tipicamente assinada computando, primeiro, f(m), onde f é uma função hash criptográfica, e em seguida usando alguma chave secreta para assinar f(m). Suponha que Mallory quer enganar Bob assinando um contrato fraudulento. Mallory prepara um contrato honesto m e um fraudulento m. Ela então encontra um número de posições onde m pode ser modificado sem alterar o significado, de modo que inserindo vírgulas, linhas vazias, um versus dois espaços após uma sentença, substituindo sinônimos, etc. Pela combinação dessas mudanças, ela pode criar um número enorme de variações sobre m que são todos os contratos justos.

De um modo semelhante, Mallory também cria um enorme número de variações sobre o contrato fraudulento m. Ela, então, aplica a função de hash para todas essas variações até que ela encontra uma versão do contrato justo e uma versão do contrato fraudulento que têm o mesmo valor de hash, f(m)=f(m).Ela apresenta a versão honesta a Bob para assinar. Depois de Bob assinou, Mallory leva a assinatura e a anexa ao contrato fraudulento. Essa assinatura 'comprova' então que Bob assinou o contrato fraudulento.

As probabilidades diferem ligeiramente do problema do aniversário original, embora Mallory nada ganhe por encontrar dois contratos honestos ou dois contratos fraudulentos com o mesmo hash. A estratégia da Mallory é gerar pares de contratos, sendo um justo e um fraudulento. As equações do problema do aniversário se aplicam onde n é o número de pares. O número de hashes que Mallory realmente gera é 2n.

Para evitar este ataque, o comprimento da função de hash utilizado para um esquema de assinatura de saída pode ser escolhido suficientemente grande de modo que o ataque de aniversário se torna computacionalmente inviável,ou seja, cerca de duas vezes quantos bits são necessários para evitar um ataque de ataque de força bruta comum.

O algoritmo rho de Pollard para logaritmos é um exemplo para um algoritmo usando um ataque do aniversário para o cálculo de logaritmos discretos.

Ver também

Predefinição:Referências

Ligações externas