Siphash est une famille de fonctions pseudo-aléatoires (PRFS) optimisées pour la vitesse sur les messages courts. Il s'agit du code C de référence de Siphash: portable, simple, optimisé pour la clarté et le débogage.
Siphash a été conçu en 2012 par Jean-Philippe Aumasson et Daniel J. Bernstein comme une défense contre les attaques DOS à armant hachage.
Siphash est:
Plus simple et plus rapide sur les messages courts que les algorithmes cryptographiques précédents, tels que les Mac basés sur le hachage universel.
Compétitive en performance avec des algorithmes non cryptographiques non sécurisés, tels que FHHASH.
Cryptographiquement sécurisé , sans signe de faiblesse malgré plusieurs projets de cryptanalyse par les principaux cryptographes.
Testés au combat , avec une intégration réussie dans OSS (noyau Linux, OpenBSD, FreeBSD, Freertos), les langues (Perl, Python, Ruby, etc.), les bibliothèques (OpenSSL Libcrypto, Sodium, etc.) et les applications (Wireguard, Redis, etc.).
En tant que fonction pseudorandom sécurisée (fonction de hachage à clé aka), Siphash peut également être utilisé comme code d'authentification de message sécurisé (MAC). Mais Siphash n'est pas un hachage dans le sens de la fonction de hachage sans clé générale telle que Blake3 ou SHA-3. Le siphash doit donc toujours être utilisé avec une clé secrète pour être sécurisée.
Le siphash par défaut est Siphash-2-4 : il prend une clé 128 bits, fait 2 tours de compression, 4 tours de finalisation et renvoie une balise 64 bits.
Les variantes peuvent utiliser un nombre différent de tours. Par exemple, nous avons proposé Siphash-4-8 en tant que version conservatrice.
Les versions suivantes ne sont pas décrites dans l'article mais ont été conçues et analysées pour répondre aux besoins des applications:
Siphash-128 renvoie une balise 128 bits au lieu de 64 bits. Les versions avec un nombre spécifié de tours sont Siphash-2-4-128, Siphash4-8-128, etc.
Halfsiphash fonctionne avec des mots 32 bits au lieu de 64 bits, prend une clé 64 bits et retourne des balises 32 bits ou 64 bits. Par exemple, Halfsiphash-2-4-32 a 2 tours de compression, 4 tours de finalisation et renvoie une balise 32 bits.
(Moitié) Siphash- C - D avec C ≥ 2 et D ≥ 4 devrait fournir la sécurité PRF maximale pour toute fonction avec la même clé et la même taille de sortie.
L'objectif de sécurité PRF standard permet à l'attaquant d'accéder à la sortie de Siphash sur les messages choisis de manière adaptative par l'attaquant.
La sécurité est limitée par la taille des clés (128 bits pour Siphash), de sorte que les attaquants qui recherchent 2 clés S ont une chance 2 S −128 de trouver la clé Siphash. La sécurité est également limitée par la taille de la sortie. En particulier, lorsque Siphash est utilisé comme un Mac, un attaquant qui essaie aveuglément 2 t tags réussira avec une probabilité de 2 s - t , si t est la taille du bit de cette balise.
En cours d'exécution
makeconstruire des tests pour
./ testvérifie 64 vecteurs de test, et
./ debugFait la même chose et imprime des valeurs intermédiaires.
Le code peut être adapté pour implémenter Siphash- C - D , la version de Siphash avec C compression Counds et D Finalisation Rounds, en définissant cROUNDS ou dROUNDS lors de la compilation. Cela peut être fait avec des arguments de ligne de commande -D à de nombreux compilateurs tels que ci-dessous.
gcc -Wall --std=c99 -DcROUNDS=2 -DdROUNDS=4 siphash.c halfsiphash.c test.c -o test Le makefile prend également les valeurs C et D en tant que paramètres.
make cROUNDS=2 dROUNDS=4De toute évidence, si le nombre de tours est modifié, les vecteurs de test ne vérifieront pas.
Ce code est le droit d'auteur (C) 2014-2023 Jean-Philippe Aumasson, Daniel J. Bernstein. Il est multi-licence sous