bittorrent-dht bruteforce哈希发现问题

时间:2016-10-14 11:11:35

标签: node.js bittorrent dht

所以,我是node.js的新手,我选择使用bittorrent-dht,这似乎完全符合我的想法。

我的想法基本上是生成随机的十六进制字符串,并在DHT上进行查找,保留那些具有足够对等点的字符串,以便稍后在适当的torrent客户端中查看(在我的情况下,我使用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个不同的查找并保持&gt; 100个同行。显然,现在很少会出现任何问题...如果我降低我的期望说50个或更低的同龄人,我显然会得到更多的点击量,但是将这些哈希值提供给Tixati会导致它找不到同伴或找不到同伴但是没有连接他们(超时)。

我的问题如下:

  • 这段代码是否合理?我不是故意它是优雅的,但我真的可以看到明显的错误或事物吗?
  • 为什么我的torrent客户端无法连接到同行,因为哈希似乎有同行? (注意:我的torrent客户端功能完备......);我是否碰到了一些奇怪的私人/封锁同伴?
  • 要搜索的最小合作伙伴数量是多少?

我现在暂时把它留在我的树莓上,但我不会期待太多;或者至少在很长一段时间之前......

1 个答案:

答案 0 :(得分:1)

  

赔率不大

这是轻描淡写。仅将cpu寄存器从0增加到2¹⁶⁰-1 require more energy than it takes to boil all of earth's oceans

目前人类可以利用的技术无法实现DHT键的强力枚举。

目前,从DHT收集信息的唯一方法是收听传入的请求。这是相当低效和嘈杂的,并不是人们想要在常规最终用户机器上做的事情。在服务器上,最好使用多个IP地址,您可以使用my implementation来完成所有必要的繁重工作。