Função hash criptográfica rápida para entradas curtas
Estou procurando uma função de hash criptográfica otimizada para velocidade em entradas curtas, a fim de implementar um gerador pseudo-aleatório com fator de expansão 2 (por exemplo, leva 16 bytes de entrada e produz 32 bytes pseudo-aleatórios).
Aqui estão alguns candidatos naturais que experimentei:
- SHA256: boa linha de base
- Blake2: projetado para velocidade em grandes entradas, não funciona tão bem em entradas curtas
- AES-CTR: mais rápido que SHA256 quando o hardware suporta AES-NI . A entrada é usada como uma chave para o AES criptografar uma matriz de bytes predefinida do comprimento de saída desejado. No entanto, reinicializar a cifra para cada chamada à função hash é caro.
Eu também achei esta construção interessante: STHash . É uma função hash criptográfica com chave otimizada para velocidade em grandes entradas. Não me importo de ter uma função hash com chave em vez de uma de uso geral.
Existe alguma construção análoga para entradas curtas ou uma maneira mais eficiente de alavancar AES-NI do que AES-CTR?
Alguns benchmarks informais
Para cada função hash, faço o hash de uma matriz de 16 bytes em uma matriz de 32 bytes e repito 10 milhões de vezes. Para cifras de fluxo como AES e ChaCha, eu crio uma nova cifra em cada iteração com a entrada como chave em um texto simples público fixo e nonce. Se a cifra precisar de uma chave de 32 bits, eu apenas preencho a entrada com 0. Se a função hash não produz bits suficientes (por exemplo, SipHash gera apenas 128 bits), eu a executo várias vezes.
Estou executando o Rust Nightly em uma CPU Intel® Core ™ i7-1065G7 @ 1,30 GHz × 8, os experimentos são executados em um único thread.
- SipHash 1-3: 476,9ms
- Chacha8: 590,4ms
- SipHash: 670,3ms
- AES-128: 665,3ms
- SHA256: 780,4ms
- Blake2s: 1413,9ms
Para obter informações, alguns resultados sobre Haraka (usando uma implementação otimizada não muito conhecida):
- Haraka-v2 256-5: 55,2ms
- Haraka-v2 256-6: 69,9ms
Respostas
Você experimentou o SipHash, especialmente a versão reduzida SipHash-1-3?
Ele foi projetado explicitamente para entrada curta, não requer expansão de chave, é rápido em praticamente todos os tipos de arquiteturas e pode produzir 64 ou 128 bits.
O nome pode ser confuso: uma chave é necessária, mas como você mencionou que não era um problema para o seu caso de uso, experimente.
Você pode usar HighwayHash . É uma função de hash com chave baseada em SIMD rápida (5x mais rápida do que SipHash ) com declarações de segurança e adequada para hash de entradas curtas.