创建种子文件的信息哈希值时出现问题。

3

我正在创建一个BitTorrent网站。

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

然而,我似乎无法从文件中获取正确的信息哈希值。

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

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

我不知道为什么我不能获取正确的信息哈希值。

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

相关代码:

$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)上仍然无法正常工作。

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

有任何想法吗?


告诉我们最终输入到 sha1 中会有所帮助。 - Jon
@hakre:因为一个种子文件只有1个info哈希值,而这个哈希值被用来“scrape”信息。当我手动使用该哈希值获取信息时,我可以获得所需的信息:http://tracker.mininova.org/scrape?info_hash=6a7eb42ab3b9781eba2d9ff3545d9758f27ec239 - PeeHaa
$form->fields['filename']->saved_file 真的会返回文件内容吗?我不记得在 PHP 中上传时有这种语法。 - fent
@DeadEnD:我使用自己的定制框架。$form->fields['filename']->saved_file 返回文件名,我将其用作 $bencode->decode_file() 的参数,该函数读取并解码文件内容。 - PeeHaa
你能提供$data['info']的pastebin吗?为什么要对哈希值进行urlencode()处理? - fent
显示剩余3条评论
2个回答

1

我已经成功在Windows XP和7上运行了PHP 5.3.x的代码,并获得了正确的哈希值。我猜想你在Windows上加载的.torrent文件与你在Linux上加载的不同(可能是编码问题)。

尝试运行这段代码,看看是否会输出SHA1哈希值148251317dae971fcd5a5dcc5d4bde3d85130c8f

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

我会假设这是:

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

如果你得到了一个不同的哈希值,那么你加载的文件就不正确。

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.

种子文件中没有哈希值。我正在尝试从种子文件内的信息计算哈希值。 - PeeHaa
@PeeHaa:仔细阅读规格说明,了解需要使用哪种编码来创建哈希值。如果您真的需要它,请查看bencode类。我非常确定错误就在其中。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接