2016-10-14 6 views
0

私はnode.jsを初めて使っていますので、私は自分の考えに必要なビットトレントを使用する必要があります。bittorrent-dht bruteforceハッシュディスカバリーの質問

私の考えは、基本的にはランダムな16進数の文字列を生成し、DHTのルックアップを行い、後で適切なトレントクライアント(私の場合はTixatiを使用します)で調べるのに十分なピアを保ちます。

私は次のコードのビットを書いた旨の、それは心の中でそれを保つため、私はNode.jsのに新しいです、エレガントではありません...

const crypto = require('crypto'); 

function rand_string(n) { 
    if (n <= 0) { 
      return ''; 
     } 
     var rs = ''; 
     try { 
      rs = crypto.randomBytes(n); 
     rs = rs.toString('hex').slice(0,n); 
      /* note: could do this non-blocking, but still might fail */ 
     } 
     catch(ex) { 
     console.log("cannot genhash");  
    } 
     return rs; 
} 

const min_peers = 100; 
var DHT = require('bittorrent-dht'); 
var dht = new DHT(); 
var hash = []; 
var abort_lookup_0; 
var abort_lookup_1; 
var abort_lookup_2; 
var abort_lookup_3; 
var peers = []; 
dht.listen(63112, function() { 
    console.log('DHT started'); 
    // 
    hash[0] = rand_string(40); 
    peers[0] = 0; 
    abort_lookup_0 = dht.lookup(hash[0]); 
    // 
    hash[1] = rand_string(40); 
    peers[1] = 0; 
    abort_lookup_1 = dht.lookup(hash[1]); 
    // 
    hash[2] = rand_string(40); 
     peers[2] = 0; 
     abort_lookup_2 = dht.lookup(hash[2]); 
    // 
    hash[3] = rand_string(40); 
     peers[3] = 0; 
     abort_lookup_3 = dht.lookup(hash[3]); 
}); 

// this is horrible but it will probably save headaches with loops 
dht.on('peer', function (peer, infoHash, from) { 
    if (infoHash.toString('hex') == hash[0]) peers[0]++; 
    if (infoHash.toString('hex') == hash[1]) peers[1]++; 
    if (infoHash.toString('hex') == hash[2]) peers[2]++; 
    if (infoHash.toString('hex') == hash[3]) peers[3]++; 
    // 
    if (peers[0] > min_peers) { 
     abort_lookup_0(); 
     console.log(hash[0]); 
     peers[0] = 0; 
     hash[0] = rand_string(40); 
     abort_lookup_0 = dht.lookup(hash[0]); 
    } 
    // 
    if (peers[1] > min_peers) { 
     abort_lookup_1(); 
     console.log(hash[1]); 
     peers[1] = 0; 
     hash[1] = rand_string(40); 
     abort_lookup_1 = dht.lookup(hash[1]); 
    } 
    // 
    if (peers[2] > min_peers) { 
       abort_lookup_2(); 
       console.log(hash[2]); 
       peers[2] = 0; 
       hash[2] = rand_string(40); 
       abort_lookup_2 = dht.lookup(hash[2]); 
     } 
    // 
    if (peers[3] > min_peers) { 
       abort_lookup_3(); 
       console.log(hash[3]); 
       peers[3] = 0; 
       hash[3] = rand_string(40); 
       abort_lookup_3 = dht.lookup(hash[3]); 
     } 
}) 

function failedHash() { 
    abort_lookup_0(); 
    hash[0] = rand_string(40); 
    peers[0] = 0; 
    abort_lookup_0 = dht.lookup(hash[0]); 
    // 
    abort_lookup_1(); 
    hash[1] = rand_string(40); 
    peers[1] = 0; 
    abort_lookup_1 = dht.lookup(hash[1]); 
    // 
     abort_lookup_2(); 
     hash[2] = rand_string(40); 
     peers[2] = 0; 
     abort_lookup_2 = dht.lookup(hash[2]); 
    // 
     abort_lookup_3(); 
     hash[3] = rand_string(40); 
     peers[3] = 0; 
     abort_lookup_3 = dht.lookup(hash[3]); 
} 

setInterval(failedHash, 15000); 

だから、私は4件の異なる検索を実行しています100人以上のピアを持つようにしてください。明らかに、これはめったに何も出てこない...私は、50人以下の相手に言いたいという私の期待を下げると、明らかにヒット数は増えるが、Tixatiにハッシュを与えると、同輩を見つけたり、それらに(タイムアウト)。次のように

私の質問は以下のとおりです。

  • は、このコード正気ですか?私はそれがエレガントであるということではありませんが、本当に明白なバグや見落としていることはありますか?
  • ピアツーピアのハッシュのために私のトレントクライアントがピアに接続できないのはなぜですか? (注:私のトレントクライアントは完全に機能しています...など);私はいくつかの奇妙なプライベート/ブロッキングピアにぶつかりますか?
  • 検索する相手の最小数は何ですか?

これは私のラズベリーで今実行していますが、私はあまり期待していません。あるいは、少なくともではない長い時間前に...

+1

あなたの方法に欠陥があります。実際のinfo_hashである160ビットの乱数を生成するチャンスは非常に小さく、不可能です。あなたが見るヒットは、あなたに偽の仲間を与える悪意のあるノードからのものです。 – Encombe

+0

私はオッズがあまり良くないと知っていますが、これはなぜ私がピアの最小数を設定することによって "ノイズ"をフィルタリングしているのかです。 –

答えて

1

オッズは、これは控えめな表現である

素晴らしいではありません。 cpuレジスタを0から2 106 -1までインクリメントするだけではrequire more energy than it takes to boil all of earth's oceansになります。

DHTキーのブルートフォース列挙は、現在人類が利用できる技術では不可能です。

現在、DHTからインフォハッシュを収集する唯一の方法は、着信要求をリスンすることです。これはかなり非効率的で騒々しいものであり、通常のエンドユーザマシン上でやりたいことではありません。サーバー上では、複数のIPアドレスを使用することをお勧めします。my implementationを使用すると、必要な処理がすべて必要になります。