2016-06-14 12 views
0

私はpythonでmd5ハッシュをブルートフォースするためにこの関数を昨日プロトタイプしました。 この場合、Match: aa4124bc0a9335c27f086f24ba207a4912が印刷されます。これは文字列 "aa"のハッシュです。MD5 Bruteforce、PythonからJavascriptへの翻訳

import hashlib 

def crack(chars, st, hsh): 
    if chars == 0: 
     if hashlib.md5(st).hexdigest() == hsh: 
      print "Match: " + st 
      print hashlib.md5(st).hexdigest() 
    else: 
     for i in range(32,127): 
      new = st + str(unichr(i)) 
      crack(chars - 1, new, hsh) 

crack(2, "", "4124bc0a9335c27f086f24ba207a4912") 

今、私はJavaScriptで実装しようとしています。私はすでにmd5ライブラリを使用しており、うまくいきます。ここでは、私が書いたコードは、再帰が期待どおりに動作していません。私はコードとコンソールの出力を説明するために表示します。

<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <script src="js/md5.min.js"></script> 
    <script> 
    function crack(chars, st, hsh){ 
     console.log(chars); 
     console.log(st); 
     if (chars == 0){ 
      if (md5(st) == hsh){ 
       console.log(st); 
      } 
     } 
     else { 
      for (i = 32; i <= 126; i++){ 
       newst = st + String.fromCharCode(i); 
       crack(chars - 1, newst, hsh); 
      } 
     } 
    } 

    crack(2, "", "4124bc0a9335c27f086f24ba207a4912"); 
    </script> 
</body> 
</html> 

今コンソール出力:この問題を解決するために必要とされる魔術のはどのような

2 
(space ascii 32) 
1 
(space ascii 32) 
0 
(space ascii 32) 
0 
! 
0 
" 
0 
# 
0 
$ 
0 
% 
0 
& 
0 
etc. 
0 
~ (ascii 126) 

答えて

3

ループ・イテレータiはグローバル変数です。 varまたはletと、それは地元ください:

function crack(chars, st, hsh) { 
 
    if (chars == 0) { 
 
    if (md5(st) == hsh) { 
 
     console.log(st); 
 
    } 
 
    } else { 
 
    for (var i = 32; i <= 126; i++) { // <--- Declare i with var or let 
 
     var newst = st + String.fromCharCode(i); 
 
     crack(chars - 1, newst, hsh); 
 
    } 
 
    } 
 
} 
 

 
crack(2, "", "4124bc0a9335c27f086f24ba207a4912");
<script src="https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.3.0/js/md5.min.js"></script>

再帰関数呼び出しでi変数グローバルイテレータをインクリメントすることも、呼び出し側のためにその値が増加します。