3

我正在创建一个 BitTorrent 网站。

如果用户上传 .torrent 文件,我需要获取信息哈希以从跟踪器获取更多信息。

但是我似乎无法从文件中获得正确的信息哈希。

我已经从 mininova下载了 .torrent ( http://www.mininova.org/get/2886852 )。

根据 mininova,信息哈希应该是:6a7eb42ab3b9781eba2d9ff3545d9758f27ec239(http://www.mininova.org/det/2886852)。但是,当我尝试创建文件的信息哈希时,我得到以下信息: 3d05f149e604b1efaa0ed554a31e693755de7cb0

我不知道为什么我无法获得正确的信息哈希。

如果我理解正确,我必须从 torrent 数据的信息部分创建哈希。

相关代码:

$bencode = new BencodeModel();
$data = $bencode->decode_file($form->fields['filename']->saved_file);
$hash = $torrentmanager->create_hash($data['info']);

BencodeModel(太长无法在此处发布):http ://pastebin.com/Zc5i94DQ

创建哈希函数:

function create_hash($info)
{
    $bencode = new BencodeModel();
    return urlencode(sha1($bencode->encode($info)));
}

我完全不知道我哪里出错了。任何帮助深表感谢!

如果您需要更多信息,请告诉我,我会更新相关信息。

编辑

根据要求提供 sha1 的数据:

var_dump($bencode->encode($info));

http://pastebin.com/HiQgRX6M

编辑

这越来越奇怪了。

我已经将该站点部署到实时服务器(在 Linux 上运行),并且在那里进行哈希处理。

但是在我的开发机器(Windows)上它仍然不起作用。

我已经尝试过替换换行符/回车。

有任何想法吗?

4

2 回答 2

1

我能够使用 PHP 5.3.x 让代码在 Windows XP 和 7 上运行,并获得正确的哈希值。我猜你在 Windows 上加载的 .torrent 与你在 Linux 上加载的不同(可能是编码问题)。

尝试运行此代码并查看是否得到 SHA1 哈希148251317dae971fcd5a5dcc5d4bde3d85130c8f回显:

echo sha1(file_get_contents('your.torrent'));

我假设是:

echo sha1(file_get_contents($form->fields['filename']->saved_file));

如果您得到不同的哈希,那么您正在加载的文件不正确。

于 2011-09-27T02:45:37.467 回答
0

种子文件中的哈希不能是文件的哈希。想一想……哈希是根据它的内容来的,你无法提前知道哈希是什么。因此,计算文件的哈希值,然后将其嵌入文件中会更改文件的哈希值,从而使您刚刚嵌入的哈希值无效。

.torrent 文件中的哈希值基于文件的内容,而不是全部内容。

BT 规范

info_hash
    The 20 byte sha1 hash of the bencoded form of the info value from the metainfo file. Note that this is a substring of the metainfo file. This value will almost certainly have to be escaped.
于 2011-06-29T21:50:12.193 回答