|
|
Message-ID: <20150502220242.GA17153@openwall.com>
Date: Sun, 3 May 2015 01:02:42 +0300
From: Aleksey Cherepanov <lyosha@...nwall.com>
To: john-dev@...ts.openwall.com
Subject: optimization idea for salted hashes
It is possible to lift some computations from the loop for some salted
hashes.
As the base, I consider a loop over all pairs salt + candidate. So if
a part of code is computed only for salt not depending on candidate
then it is possible to precompute it once for each salt. Similarly if
a part of code is computed only for candidate not depending on salt
then it may be computed once per candidate (it may be easy to
implement if we have "for each candidate { for each salt { ... }}"
structure of the loop).
For instance in
dynamic_156 RIPEMD320($s.RIPEMD320($p))
it is possible to pull out RIPEMD320($p) and compute like
$pp = RIPEMD320($p1)
RIPEMD320($s1.$pp)
RIPEMD320($s2.$pp)
...
$pp = RIPEMD320($p2)
RIPEMD320($s1.$pp)
RIPEMD320($s2.$pp)
...
More interesting case:
dynamic_157 RIPEMD320(RIPEMD320($s).RIPEMD320($p))
It is possible to precompute RIPEMD320($s) once for each hash and
RIPEMD320($p) once for each candidate as above.
The list of dynamics possible for that optimization (based on
$ ./JohnTheRipper/run/john --list=format-details --format=dynamic | cut -f 1,7 | grep '\$s'):
dynamic_6 md5(md5($p).$s) 128/128 SSE4.1 10x4x3
dynamic_8 md5(md5($s).$p) 128/128 SSE4.1 10x4x3
dynamic_9 md5($s.md5($p)) 128/128 SSE4.1 10x4x3
dynamic_12 md5(md5($s).md5($p)) (IPB) 128/128 SSE4.1 10x4x3
dynamic_13 md5(md5($p).md5($s)) 128/128 SSE4.1 10x4x3
dynamic_14 md5($s.md5($p).$s) 128/128 SSE4.1 10x4x3
dynamic_15 md5($u.md5($p).$s) 128/128 SSE4.1 10x4x3
dynamic_16 md5(md5(md5($p).$s).$s2) 128/128 SSE4.1 10x4x3
dynamic_38 sha1($s.sha1($s.sha1($p))) (Wolt3BB) 128/128 SSE4.1 10x4x1
dynamic_39 md5($s.pad16($p)) (net-md5) 128/128 SSE4.1 10x4x3
dynamic_40 sha1($s.pad20($p)) (net-sha1) 128/128 SSE4.1 10x4x1
dynamic_55 sha224(sha224($p).$s) 128/128 SSE4.1 4x
dynamic_56 sha224($s.sha224($p)) 128/128 SSE4.1 4x
dynamic_57 sha224(sha224($s).sha224($p)) 128/128 SSE4.1 4x
dynamic_65 sha256(sha256($p).$s) 128/128 SSE4.1 4x
dynamic_66 sha256($s.sha256($p)) 128/128 SSE4.1 4x
dynamic_67 sha256(sha256($s).sha256($p)) 128/128 SSE4.1 4x
dynamic_75 sha384(sha384($p).$s) 64/64 128x1 sha2-OpenSSL
dynamic_76 sha384($s.sha384($p)) 64/64 128x1 sha2-OpenSSL
dynamic_77 sha384(sha384($s).sha384($p)) 64/64 128x1 sha2-OpenSSL
dynamic_85 sha512(sha512($p).$s) 64/64 128x1 sha2-OpenSSL
dynamic_86 sha512($s.sha512($p)) 64/64 128x1 sha2-OpenSSL
dynamic_87 sha512(sha512($s).sha512($p)) 64/64 128x1 sha2-OpenSSL
dynamic_95 GOST(GOST($p).$s) 64/64 128x1
dynamic_96 GOST($s.GOST($p)) 64/64 128x1
dynamic_97 GOST(GOST($s).GOST($p)) 64/64 128x1
dynamic_105 WHIRLPOOL(WHIRLPOOL($p).$s) 64/64 128x1 OpenSSL
dynamic_106 WHIRLPOOL($s.WHIRLPOOL($p)) 64/64 128x1 OpenSSL
dynamic_107 WHIRLPOOL(WHIRLPOOL($s).WHIRLPOOL($p)) 64/64 128x1 OpenSSL
dynamic_115 Tiger(Tiger($p).$s) 32/64 128x1 sph_tiger
dynamic_116 Tiger($s.Tiger($p)) 32/64 128x1 sph_tiger
dynamic_117 Tiger(Tiger($s).Tiger($p)) 32/64 128x1 sph_tiger
dynamic_125 RIPEMD128(RIPEMD128($p).$s) 32/64 128x1 sph_ripmd
dynamic_126 RIPEMD128($s.RIPEMD128($p)) 32/64 128x1 sph_ripmd
dynamic_127 RIPEMD128(RIPEMD128($s).RIPEMD128($p)) 32/64 128x1 sph_ripmd
dynamic_135 RIPEMD160(RIPEMD160($p).$s) 32/64 128x1 sph_ripmd
dynamic_136 RIPEMD160($s.RIPEMD160($p)) 32/64 128x1 sph_ripmd
dynamic_137 RIPEMD160(RIPEMD160($s).RIPEMD160($p)) 32/64 128x1 sph_ripmd
dynamic_145 RIPEMD256(RIPEMD256($p).$s) 32/64 128x1 sph_ripmd
dynamic_146 RIPEMD256($s.RIPEMD256($p)) 32/64 128x1 sph_ripmd
dynamic_147 RIPEMD256(RIPEMD256($s).RIPEMD256($p)) 32/64 128x1 sph_ripmd
dynamic_155 RIPEMD320(RIPEMD320($p).$s) 32/64 128x1 sph_ripmd
dynamic_156 RIPEMD320($s.RIPEMD320($p)) 32/64 128x1 sph_ripmd
dynamic_157 RIPEMD320(RIPEMD320($s).RIPEMD320($p)) 32/64 128x1 sph_ripmd
dynamic_1007 md5(md5($p).$s) (vBulletin) 128/128 SSE4.1 10x4x3
dynamic_1011 md5($p.md5($s)) (WebEdition CMS) 128/128 SSE4.1 10x4x3
dynamic_1012 md5($p.md5($s)) (WebEdition CMS) 128/128 SSE4.1 10x4x3
dynamic_1033 sha1_64(unicode($pass).$salt) 128/128 SSE4.1 10x4x1
dynamic_1501 sha1($salt.sha1($pass)) (Redmine) 128/128 SSE4.1 10x4x1
dynamic_1502 sha1(sha1($pass).$salt) (XenForo SHA-1) 128/128 SSE4.1 10x4x1
dynamic_1503 sha256(sha256($pass).$salt) (XenForo SHA-256) 128/128 SSE4.1 4x
dynamic_2006 md5(md5($p).$s) (PW > 55 bytes, sse2) 128/128 SSE4.1 10x4x3
dynamic_2008 md5(md5($s).$p) (PW > 23 bytes, sse2) 128/128 SSE4.1 10x4x3
dynamic_2009 md5($s.md5($p)) (PW > 55 or salt > 23 bytes, sse2) 128/128 SSE4.1 10x4x3
dynamic_2014 md5($s.md5($p).$s) (PW > 55 or salt > 11 bytes, sse2) 128/128 SSE4.1 10x4x3
MediaWiki md5($s.md5($p)) 128/128 SSE4.1 10x4x3
PHPS md5(md5($p).$s) 128/128 SSE4.1 10x4x3
Is the optimization implemented in john?
Thanks!
--
Regards,
Aleksey Cherepanov
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.