2016-04-12 4 views
1

私は(パイソン)以下の単純なハッシュ関数の衝突を見つけるしたいと思います:ここもJSの実装in jsbinおもちゃハッシュ関数の衝突を見つける方法はありますか?

def hash_function(s=''): # 'Hello World!' -> 7b2ea1ba 
    a, b, c, d = 0xa0, 0xb1, 0x11, 0x4d 
    result_hash = '' 

    for byte in bytes(s, 'ascii'): 
     a ^= byte 
     b = b^a^0x55 
     c = b^0x94 
     d = c^byte^0x74 

    for i in [d, c, a, b]: 
     tmp = str(hex(i))[2:] 
     result_hash += tmp if len(tmp) is 2 else '0' + tmp 

    return result_hash 

私はthis question on SOを見つけましたが、答えはありませんでした私にはかなり分かりやすい。

関数の出力の長さは常に8 aに等しい、bcd変数は、結果のハッシュを形成するために、最終的に進値に変換される整数、すなわち123 -> 7b46 -> 2e13 -> 0dされそうです。


この関数の衝突を見つけるのを手伝ってもらえますか?

+1

結果空間は32ビットであり、誕生日パラドックスがあり、それが可能であってはならないbruteforcing。 –

答えて

1

同じハッシュを持つ文字列のペアを見つける簡単な方法は、ランダムな文字列を生成してハッシュし、結果をdictに格納することです。ハッシュをキーとして、文字列を値として使用します。既にdictに入っているハッシュを取得した場合は、それを印刷してください。

私はあなたのhash_functionをわずかに最適化し、コードPython 2/3互換にしました。

from __future__ import print_function 
from random import choice, randrange, seed 

def hash_function(s=''): # 'Hello World!' -> 7b2ea1ba 
    a, b, c, d = 0xa0, 0xb1, 0x11, 0x4d 

    for byte in bytearray(s): 
     a ^= byte 
     b = b^a^0x55 
     c = b^0x94 
     d = c^byte^0x74 

    return format(d<<24 | c<<16 | a<<8 | b, '08x') 

s = b'Hello World!' 
print(s, hash_function(s)) 

#ASCII chars that print nicely 
ascii = b''.join([chr(i) for i in range(33, 127)]) 

seed(37) 

found = {} 
for j in range(5000): 
    #Build a random 4 byte random string 
    s = b''.join([choice(ascii) for _ in range(4)]) 
    h = hash_function(s) 
    if h in found: 
     v = found[h] 
     if v == s: 
      #Same hash, but from the same source string 
      continue 
     print(h, found[h], s) 
    found[h] = s 

出力

Hello World! 7b2ea1ba 
0944dbd0 TXN9 YXC9 
105a9dce wA5> rA0> 
7a29e4bd %+m' -+e' 
7776b2e2 u&4u n&/u 
7c3ea3aa D-\6 z-b6 
6d46d1d2 `<r_ "<0_ 
6a26e0b2 ;;x8 ";a8 
1033eda7 ,AwW =AfW 
627395e7 #[email protected] ;3Xe 
7d6ee7fa D,Hg `,lg 
3c2bb2bf NmRc Cm_c 
1e31b9a5 nOc[ oOb[ 
1a49f7dd MKv' ]Kf' 
161beb8f)G\y IG<y 
0247bbd3 !SX1 VS/1 
関連する問題