O Siphash é uma família de funções de pseudorandom (PRFs) otimizadas para velocidade em mensagens curtas. Este é o código C de referência de Siphash: portátil, simples, otimizado para maior clareza e depuração.
O Siphash foi projetado em 2012 por Jean-Philippe Aumasson e Daniel J. Bernstein como uma defesa contra ataques de DOS que inundam hash.
Siphash é:
Mais simples e mais rápido em mensagens curtas do que os algoritmos criptográficos anteriores, como Macs com base no hash universal.
Competitivo em desempenho com algoritmos não-cristãos inseguros, como o FHHASH.
Criptograficamente segura , sem sinal de fraqueza, apesar de vários projetos de criptonálise pelos principais criptografistas.
Testado em batalha , com integração bem-sucedida no OSS (Linux Kernel, OpenBSD, FreeBSD, Freertos), Idiomas (Perl, Python, Ruby, etc.), Bibliotecas (OpenSsl LibCrypto, Sodium, etc.) e aplicações (Wireguard, Redis, etc.).
Como uma função de pseudorandom segura (também conhecida como função de hash com chave), o Siphash também pode ser usado como um código de autenticação de mensagem segura (MAC). Mas Siphash não é um hash no sentido da função de hash sem uso geral, como Blake3 ou SHA-3. Portanto, o Siphash deve ser sempre usado com uma chave secreta para ser segura.
O Siphash padrão é Siphash-2-4 : é preciso uma chave de 128 bits, faz 2 rodadas de compressão, 4 rodadas de finalização e retorna uma etiqueta de 64 bits.
As variantes podem usar um número diferente de rodadas. Por exemplo, propusemos o Siphash-4-8 como uma versão conservadora.
As versões a seguir não são descritas no artigo, mas foram projetadas e analisadas para atender às necessidades dos aplicativos:
O Siphash-128 retorna uma etiqueta de 128 bits em vez de 64 bits. As versões com número especificado de rodadas são Siphash-2-4-128, Siphash4-8-128 e assim por diante.
HalfSiphash funciona com palavras de 32 bits em vez de 64 bits, pega uma chave de 64 bits e retorna tags de 32 ou 64 bits. Por exemplo, HalfSiphash-2-4-32 possui 2 rodadas de compressão, 4 rodadas de finalização e retorna uma etiqueta de 32 bits.
(Metade) siphash -c - d com c ≥ 2 e d ≥ 4 deverá fornecer a segurança máxima do PRF para qualquer função com a mesma chave e tamanho de saída.
A meta padrão de segurança do PRF permite o acesso ao invasor à saída do Siphash nas mensagens escolhidas adaptativamente pelo invasor.
A segurança é limitada pelo tamanho da chave (128 bits para Siphash), de modo que os invasores que pesquisam as chaves de 2 s tenham chance 2 s -128 de encontrar a tecla Siphash. A segurança também é limitada pelo tamanho da saída. Em particular, quando o Siphash é usado como um Mac, um invasor que tenta cegamente as tags de 2 s terá sucesso com a probabilidade 2 s - t , se t é o tamanho da bits da etiqueta.
Correndo
makecriará testes para
./ testverifica 64 vetores de teste e
./ debugfaz o mesmo e imprime valores intermediários.
O código pode ser adaptado para implementar o Siphash -C - D , a versão do Siphash com rodadas de compressão C e as rodadas de finalização D , definindo cROUNDS ou dROUNDS ao compilar. Isso pode ser feito com argumentos de linha de comando -D para muitos compiladores, como abaixo.
gcc -Wall --std=c99 -DcROUNDS=2 -DdROUNDS=4 siphash.c halfsiphash.c test.c -o test O makefile também leva os valores de rodadas C e D como parâmetros.
make cROUNDS=2 dROUNDS=4Obviamente, se o número de rodadas for modificado, os vetores de teste não verificarão.
Este código é Copyright (C) 2014-2023 Jean-Philippe Aumasson, Daniel J. Bernstein. É multi-licenciado sob