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 |
Komentarze
Chcesz coś napisać?