Porównanie prędkości kryptograficznych funkcji skrótu

Kryptograficznych funkcji skrótu używa praktycznie każdy programista. Zwykle kryterium wyboru nie jest ich prędkość a odporność na różnego rodzaju ataki. Jest parę własności które taka funkcja skrótu powinna spełniać (preimage resistance, second preimage resistance, collision resistance). Zwykle dobrze jest się kierować zaleceniami Amerykańskiego Narodowego Instytutu Standardów będącego wyznacznikiem dla standardów publicznej kryptografii.  Publikuje on zalecenia dotyczące stosowania kryptograficznych funkcji skrótu. Zaleca między innymi aby nie stosować już funkcji MD5, zaś funkcja SHA-1 powinna być stosowana co najwyżej do 2010 roku. Niemniej jednak istnieją zastosowania w których priorytetem wcale nie jest ogólne bezpieczeństwo lecz któraś ze szczególnych własności i jej jakość dostarczana przez każdą z funkcji jest więcej niż wystarczająca. W jednej z moich implementacji interesowała mnie jedynie własność jednokierunkowości (preimage reistance) na którą ataki są najtrudniejsze a bezpieczeństwo większości standardowych funkcji pod tym względem było dla mnie więcej niż wystarczające. Ważna była prędkość obliczania skrótów dla małych bloków danych.

Przeprowadzone przez innych testy prędkości nie dotyczyły zwykle implementacji we współczesnej Javie (optymalizacja runtime ma tu duże znaczenie). Stanąłem więc przed koniecznością samodzielnego przeprowadzenia testu. Sprawdziłem prędkość funkcji dostarczanych przez domyślny provider firmy Sun oraz dodatkowe z dostawcy Bouncy Castle. Parametry testu:

  • 3GB RAM
  • procesor Intel Core2 Duo 2GHz
  • wersja Javy 1.6.0_10
  • parametry JVM -Xms1024m -Xmx1024m
  • 3 zestawy danych:
    • 4 mln bloków po 128B
    • 2 mln bloków po 265B
    • 1 mln bloków po 512B

Został obliczony skrót każdego bloku danych osobno. Dane w każdym z testów były takie same (wygenerowane przez wbudowany generator pseudolosowy z ziarnem 7). Udostępniam źródła testu oraz skrypt pod Windows do jego uruchomienia (będę wdzięczny za umieszczenie własnych wyników w komentarzu do tego postu). Najszybsza i w tym przypadku najlepsza do mojego zastosowania okazała się MD5. Poniżej wyniki – czas wykonania w milisekundach.

Algorytm 128 B * 4 mln 256 B * 2 mln 512 B * 1 mln
MD5 5531 5640 4141
MD4 7094 7578 6687
RIPEMD128 11109 12406 10828
SHA1 12860 13235 11875
RIPEMD160 14312 15234 13562
RIPEMD256 15234 9719 10718
RIPEMD320 18969 15609 13609
SHA224 22266 22156 19578
Tiger 23438 19000 16921
SHA256 27890 21766 19109
SHA384 59344 44766 37562
SHA512 60203 45578 37641
MD2 145078 170593 158031
Whirlpool 277703 235187 214812
GOST3411 742360 651938 593656

UPDATE: Rozszerzyłem test o możliwość wyboru providera kryptograficznego. Daje to możliwość porównania prędkości różnych implementacji (także sprzętowych).

Zacheusz Siedlecki

Komentarze

Chcesz coś napisać?





*