Siphash es una familia de funciones pseudorandom (PRF) optimizadas para la velocidad en mensajes cortos. Este es el código de referencia c de Siphash: portátil, simple, optimizado para mayor claridad y depuración.
Siphash fue diseñado en 2012 por Jean-Philippe Aumasson y Daniel J. Bernstein como una defensa contra los ataques de DOS de basura del hash.
Siphash es:
Más simple y más rápido en mensajes cortos que los algoritmos criptográficos anteriores, como las Mac basadas en el hash universal.
Competitivo en rendimiento con algoritmos inseguros no critografía, como FHHASH.
Criptográficamente seguro , sin signos de debilidad a pesar de múltiples proyectos de criptoanálisis de los principales criptógrafos.
Probado en batalla , con integración exitosa en OSS (Linux Kernel, OpenBSD, FreeBSD, Freertos), Idiomas (Perl, Python, Ruby, etc.), Bibliotecas (OpenSSL LibCrypto, Sodium, etc.) y aplicaciones (WireGuard, Redis, etc.).
Como una función pseudorandom segura (también conocida como función de hash clave), Siphash también se puede utilizar como un código de autenticación de mensajes seguro (Mac). Pero Siphash no es un hash en el sentido de la función de hash sin clave de uso general como Blake3 o SHA-3. Por lo tanto, Siphash siempre debe usarse con una clave secreta para estar segura.
El Siphash predeterminado es Siphash-2-4 : toma una clave de 128 bits, hace 2 rondas de compresión, 4 rondas de finalización y devuelve una etiqueta de 64 bits.
Las variantes pueden usar un número diferente de rondas. Por ejemplo, propusimos Siphash-4-8 como una versión conservadora.
Las siguientes versiones no se describen en el documento, sino que se diseñaron y analizaron para satisfacer las necesidades de las aplicaciones:
Siphash-128 devuelve una etiqueta de 128 bits en lugar de 64 bits. Las versiones con número especificado de rondas son Siphash-2-4-128, SIPHASH4-8-128, etc.
Halfsiphash funciona con palabras de 32 bits en lugar de 64 bits, toma una clave de 64 bits y devuelve etiquetas de 32 o 64 bits. Por ejemplo, HalfSiphash-2-4-32 tiene 2 rondas de compresión, 4 rondas de finalización y devuelve una etiqueta de 32 bits.
(La mitad) se espera que Siphash -C - D con C ≥ 2 y D ≥ 4 proporcione la máxima seguridad PRF para cualquier función con la misma clave y tamaño de salida.
El objetivo de seguridad de PRF estándar permite al atacante acceder a la salida de Siphash en los mensajes elegidos adaptivamente por el atacante.
La seguridad está limitada por el tamaño de la clave (128 bits para Siphash), de modo que los atacantes que buscan 2 l teclas tienen oportunidad 2 s −128 de encontrar la tecla Siphash. La seguridad también está limitada por el tamaño de salida. En particular, cuando Siphash se usa como Mac, un atacante que intenta ciegamente 2 etiquetas S tendrá éxito con la probabilidad 2 s - t , si t es el tamaño de bit de esa etiqueta.
Correr
makeconstruirá pruebas para
./ testVerifica 64 vectores de prueba y
./ debughace lo mismo e imprime valores intermedios.
El código se puede adaptar para implementar Siphash -C - D , la versión de Siphash con rondas de compresión C y rondas de finalización D , definiendo cROUNDS o dROUNDS al compilar. Esto se puede hacer con -D argumentos de línea de comandos a muchos compiladores como a continuación.
gcc -Wall --std=c99 -DcROUNDS=2 -DdROUNDS=4 siphash.c halfsiphash.c test.c -o test makefile también toma los valores de Ronda C y D como parámetros.
make cROUNDS=2 dROUNDS=4Obviamente, si el número de rondas se modifica, los vectores de prueba no verificarán.
Este código es Copyright (c) 2014-2023 Jean-Philippe Aumasson, Daniel J. Bernstein. Es múltiple bajo