2015-10-09 69 views
4

我試圖「發現」hash_res生成時變量的值是什麼。有沒有更好的方法在python中找到未知的循環?

這是給我的唯一信息是使用以下行:

random.seed(UNKNOWN+hash(CONST_VAR)) 
hash_res = random.randint(1<<32, 1<<40) 

加的CONST_VAR值是給定的是113092RESULT_VAR的值也是給定的,它是75284812356

到目前爲止,這是我想出的,但我不確定這是正確的方式還是存在更快,更好的方式。

import random 
from hashlib import md5 

UNKNOWN = 0 
CONST_VAR = 113092 
RESULT_VAR = 75284812356 
hash_res = 0 

while hash_res != RESULT_VAR: 
    UNKNOWN = UNKNOWN+1 
    random.seed(UNKNOWN+hash(CONST_VAR)) 
    hash_res = random.randint(1<<32, 1<<40) 

print UNKNOWN 

基本上我循環給定的散列線那麼對於每次迭代,我會遞增UNKNOWN的值,直到hash_res值相匹配的RESULT_VAR。然後打印出UNKNOWN的值時,循環終止(又名hash_res匹配了RESULT_VAR

這是一種強制方法,我的問題是,有沒有更好的辦法?

注意 我是C#開發,努力學習新的東西:)

+2

試圖破解賭場? :D – thefourtheye

+0

不是!我真希望那是真的@thefourtheye!這是一個使用python的朋友給我的練習。我只是想學習。 –

+0

也許你也可以使用多線程(我只是編輯了我的答案) – oliverpool

回答

4

這是一種強制方法,我的問題是,有沒有更好的辦法?

對於不是數學安全/密碼學研究人員的所有實際手段,

「散列」函數的規格很簡單,它是一個幾乎不可能反轉的函數,即暴力強制是反轉它的最快方法。

有很多技巧(彩虹表,在圖形卡處理器上做數學運算,甚至是專門的芯片等),使事情變得更快,但除了理解MD5中的一些弱點並實現這個非常接近金屬(閱讀:可能是C/C++,而不是Python),沒有什麼可以做的。

3

這是一個蠻力的方法,我的問題是,有沒有更好的方法?

您可以嘗試通過減少在每個循環中執行的操作次數來提高蠻力。

例如,您可以在變量中存儲hash(CONST_VAR),1<<321<<40

你也可以看看源(如@tobias_k建議),找到一個更快的方法來檢查,如果你(使用random.getstate()可能比random.randint(1<<32, 1<<40)更快實例)

我勸你有正確的UNKNOWN使用已知的UNKOWN進行一些測試以找到最快的算法。


編輯

也許你可以嘗試使用並行多線程在同一時間尋找值(與4個線程,首先查找4 * N,第二個爲4 * N + 1,依此類推)

1

按@ tobias_k的建議,看看源,我認爲這個問題歸結爲,在解決未知:

a = UNKNOWN+113092 
a, x = divmod(a, 30268) 
a, y = divmod(a, 30306) 
a, z = divmod(a, 30322) 
x, y, z = int(x)+1, int(y)+1, int(z)+1 
x = (171 * x) % 30269 
y = (172 * y) % 30307 
z = (170 * z) % 30323 
random = (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 

4294967296 + int(random * 2361183241434822606848) == 75284812356 

不幸的是,這種算法的每一步都會丟失信息,這使得逆向工程幾乎不可能。

相關問題