Técnica de busca automatizada de funções hash inteiras
(github.com/skeeto)Hash Function Prospector
Esta ferramenta é uma ferramenta pequena para a busca automatizada de funções hash inteiras. Ela seleciona aleatoriamente entre 9 operações reversíveis e gera bilhões de funções hash inteiras. As funções geradas são compiladas com JIT e o comportamento de Avalanche é avaliado. A melhor função encontrada atualmente é exibida em sintaxe C.
- Pontuação de Avalanche: o número de bits de saída que, em média, permanecem inalterados quando um único bit de entrada é invertido. Quanto menor a pontuação, melhor. O ideal é que a pontuação seja 0. Ou seja, ao inverter um único bit de entrada, todos os bits de saída são invertidos com probabilidade de 50%.
- O Prospector pode gerar funções hash inteiras de 32 e 64 bits. Consulte o uso (
-h) para ver todas as opções. Por causa do compilador JIT, apenas x86-64 é suportado, mas as funções descobertas podem ser usadas em qualquer ambiente.
Funções hash descobertas
Há duas classes úteis de funções hash descobertas pelo Prospector e por outras utilidades auxiliares incluídas aqui. Ambas usam a estrutura xorshift-multiply-xorshift, mas o número de rodadas é diferente.
Função de 2 rodadas
TheIronBorn usou otimização combinatória para encontrar os melhores parâmetros conhecidos para essa estrutura.
- Esta permutação de 2 rodadas de 32 bits possui especialmente baixo viés e até vence, por uma pequena margem, o finalizador de 32 bits do MurmurHash3.
- A estrutura da função hash foi descoberta pelo Prospector, e os parâmetros foram ajustados com hill climbing e algoritmo genético.
Há mais constantes de 2 rodadas com viés baixo, e algumas delas são melhores que lowbias32.
Função de 3 rodadas
Adicionar mais uma rodada de multiply-xorshift a essa estrutura permite atingir o limite teórico de viés com parâmetros cuidadosamente escolhidos. Por exemplo, esta função hash pode se tornar indistinguível de uma PRF perfeita.
triple32resolve o problemahash(0) = 0e também reduz ainda mais o viés.- Há mais constantes de 3 rodadas com viés mais baixo.
Medição de viés precisa
O modo -E avalia o viés da função hash fornecida (-p ou -l). Por padrão, o Prospector usa uma estimativa para avaliar rapidamente o viés da função, mas ela é não determinística e com muito ruído nos resultados. Use a opção -e para medir o viés de forma exaustiva e precisa.
- Você pode definir a função a ser testada com
-pusando um padrão, ou com uma biblioteca compartilhada que contenha uma funçãohash()e a opção-l. - Para funções hash de 64 bits, não há teste exaustivo e preciso, pois é demorado demais.
Seleção de operações reversíveis
São usadas as seguintes operações reversíveis:
x = ~x;x ^= constant;x *= constant | 1;(somente constantes ímpares)x += constant;x ^= x >> constant;x ^= x << constant;x += x << constant;x -= x << constant;x <<<= constant;(rotação à esquerda)x = bswap(x)(troca os bytes alto e baixo)
Tecnicamente, x = ~x já é coberto por x ^= constant; no entanto, ~x é singularmente especial e, em particular, muito útil.
Hash de 16 bits
Como as restrições de hash de 16 bits são diferentes, há uma ferramenta separada (hp16) para gerar esse tipo de hash.
- Ao contrário do Prospector de 32/64 bits, esta implementação é totalmente portátil e pode ser executada em quase todos os sistemas.
- Também é possível gerar e avaliar S-boxes de 128 KiB.
- Como o hash de 16 bits pode ser mais necessário em máquinas sem instrução de multiplicação rápida, pode-se omitir certas operações durante a busca (
-m,-r).
Alguns resultados interessantes:
- hash xorshift-multiply de 2 rodadas
- hash xorshift-multiply de 3 rodadas
- hash sem multiplicação (apenas xorshift-add)
Um bom hash xorshift de 3 rodadas (busca curta via hp16 -Xn3) se aproxima de uma boa S-box (hp16 -S).
Ao trabalhar com operações de 16 bits, é preciso ter cuidado com as regras de promoção de inteiros em C. O programa C emitido por esta ferramenta cuida para promover operações de 16 bits para unsigned int quando necessário.
Opinião do GN⁺
-
A segurança de funções hash é muito importante em criptografia e segurança computacional, então uma ferramenta de busca como essa parece poder ajudar bastante na pesquisa. Em especial, é interessante encontrar funções hash de baixo viés por meio de busca aleatória.
-
No entanto, a segurança de uma função hash não é garantida apenas por propriedades estatísticas. Funções hash criptográficas também precisam ser resistentes a ataques de PreImage Resistance, Second PreImage Resistance e Collision Resistance, então essas análises também parecem necessárias.
-
Hashes de 16 bits devem ser úteis em ambientes restritos, como sistemas IoT e embarcados. O fato de ser possível criar funções hash usando apenas ADD/XOR/SHIFT, para serem usadas também em CPUs sem instrução de multiplicação, é bastante impressionante.
-
A aplicação de técnicas de busca heurística como Hill Climbing e algoritmo genético no projeto de funções hash é uma ideia interessante. O esforço de integrar IA no design de algoritmos criptográficos está ficando cada vez mais forte, e essas técnicas de otimização parecem ter papel crescente no futuro.
-
Como há limites intrínsecos de função hash, mesmo com ótima propriedade Avalanche não dá para afirmar com segurança que ela é segura criptograficamente; isso parece ser a limitação do projeto. Ainda assim, ferramentas como essa podem ajudar a analisar falhas e a melhorar funções hash existentes.
1 comentários
Comentário no Hacker News
multiply-shift-xorter se mantido bem por tanto tempo