SIPHASH ist eine Familie von Pseudorandom -Funktionen (PRFs), die für die Geschwindigkeit bei Kurznachrichten optimiert ist. Dies ist der Referenz -C -Code von Siphash: tragbar, einfach, für Klarheit und Debuggen optimiert.
SIPHASH wurde 2012 von Jean-Philippe Aumasson und Daniel J. Bernstein als Verteidigung gegen Hash-Flooding-DOS-Angriffe entworfen.
Siphash ist:
Einfacher und schneller bei Kurznachrichten als frühere kryptografische Algorithmen wie Macs, die auf universellem Hashing basieren.
Wettbewerbsfähige Leistung mit unsicheren nicht kryptografischen Algorithmen wie FHHASH.
Kryptografisch sicher , ohne Anzeichen von Schwäche trotz mehrerer Kryptanalyseprojekte führender Kryptografen.
Schlacht getestet , mit erfolgreicher Integration in OSS (Linux-Kernel, OpenBSD, FreeBSD, Freertos), Sprachen (Perl, Python, Ruby usw.), Bibliotheken (OpenSSL Libcrypto, Natrium usw.) und Anwendungen (Wireguard, Redis usw.).
Als sichere Pseudorandom -Funktion (auch bekannt als KEY -Funktion von Keyed Hash) kann Siphash auch als sichere Nachrichtenauthentifizierungscode (MAC) verwendet werden. Aber Siphash ist kein Hash im Sinne der allgemeinen Schlüsselfunktion ohne purpose ohne Hash wie Blake3 oder SHA-3. SIPHASH sollte daher immer mit einem geheimen Schlüssel verwendet werden, um sicher zu sein.
Der Standard-Siphash ist SIPHASH-2-4 : Es benötigt einen 128-Bit-Schlüssel, macht 2 Komprimierungsrunden, 4 Abschlussrunden und gibt ein 64-Bit-Tag zurück.
Varianten können eine andere Anzahl von Runden verwenden. Zum Beispiel haben wir Siphash-4-8 als konservative Version vorgeschlagen.
Die folgenden Versionen werden in der Arbeit nicht beschrieben, sondern wurden entworfen und analysiert, um die Anforderungen der Anwendungen zu erfüllen:
SIPHASH-128 gibt ein 128-Bit-Tag anstelle von 64-Bit zurück. Versionen mit festgelegter Anzahl von Runden sind SIPHASH-2-4-128, SIPHASH4-8-128 usw.
Halfsiphash funktioniert mit 32-Bit-Wörtern anstelle von 64-Bit, nimmt einen 64-Bit-Schlüssel und gibt 32-Bit- oder 64-Bit-Tags zurück. Beispielsweise hat Halfsiphash-2-4-32 2 Kompressionsrunden, 4 Abschlussrunden und gibt ein 32-Bit-Tag zurück.
(Halb) SIPHASH -C - D mit c ≥ 2 und d ≥ 4 wird voraussichtlich die maximale PRF -Sicherheit für jede Funktion mit derselben Schlüssel- und Ausgangsgröße liefern.
Das Standard -PRF -Sicherheitsziel ermöglicht dem Angreifer auf die Ausgabe von Siphash auf Nachrichten, die vom Angreifer adaptiv ausgewählt wurden.
Die Sicherheit ist durch die Schlüsselgröße (128 Bit für Siphash) begrenzt, so dass Angreifer, die 2 s Tasten suchen, eine Chance haben 2 S –128, den Siphash -Schlüssel zu finden. Die Sicherheit ist auch durch die Ausgangsgröße begrenzt. Insbesondere wenn Siphash als Mac verwendet wird, ist ein Angreifer, der blind 2 S -Tags versucht, mit der Wahrscheinlichkeit 2 s - t erfolgreich, wenn t die Bitgröße dieses Tags ist.
Läuft
makewird Tests für bauen für
./ testüberprüft 64 Testvektoren und
./ debugtut dasselbe und druckt Zwischenwerte.
Der Code kann angepasst werden, um SIPHASH -C - D , die Version von Siphash mit C -Komprimierungsrunden und D -Finalization -Runden, durch Definieren cROUNDS oder dROUNDS beim Kompilieren implementieren zu können. Dies kann mit -D -Befehlszeilenargumenten an viele Compiler wie unten erfolgen.
gcc -Wall --std=c99 -DcROUNDS=2 -DdROUNDS=4 siphash.c halfsiphash.c test.c -o test Das makefile nimmt auch C- und D -Rundwerte als Parameter.
make cROUNDS=2 dROUNDS=4Wenn die Anzahl der Runden geändert wird, werden die Testvektoren natürlich nicht überprüft.
Dieser Code ist Copyright (C) 2014-2023 Jean-Philippe Aumasson, Daniel J. Bernstein. Es ist mehrfach unterlizenziert unter