【问题标题】:Create torrent hash info创建种子哈希信息
【发布时间】:2012-11-20 04:07:07
【问题描述】:

如何在 torrent 文件上生成 torrent 哈希信息。

我一直在看这个例子:How to calculate the hash value of a torrent using Java 并试图将其转换为 C++。这是我到目前为止的代码:

void At::ReadTorrent::TorrentParser::create_hash(std::string torrentstub)
{
    std::string info;
    int counter = 0;

    while(info.find("4:info") == -1)
    {
        info.push_back(torrentstub[counter]);
        counter++;
    }

    unsigned char array[torrentstub.size()];
    int test = 0;

    for(int data; (data = torrentstub[counter]) > -1;)
    {
         array[test++] = data;
         counter++;
    }
    std::cout << array << std::endl;

    //SHA-1 some value here to generate the hash.
}

torrentstub 参数是表示为字符串的 torrent 文件。 据我了解,我必须获得4:info 之后的信息。我认为这行得通,例如:

d6:lengthi2847431620e4:name8:filename12:piece lengthi1143252e6:pieces50264

在这之后只有我无法读取的信息,我猜这是一些二进制数据?

所以我的问题实际上归结为: 应该对 4:info 之后的所有信息进行哈希处理,我应该在哪里停止收集哈希数据?

【问题讨论】:

  • 嗨,我正在尝试在 C++ 中做同样的事情,你能发布最终对你有用的东西吗?

标签: c++ bittorrent info-hash


【解决方案1】:

您基于此的示例代码似乎假设 info 密钥是 torrent 文件中的最后一件事(可能不是,因此请阅读整个答案以了解整个故事)。因此,它将覆盖文件的其余部分(减去 1 个字节),从 ":info" 之后的字节开始。您会看到类似“...:infod6:length...”的内容。 SHA1 以“d6:length...”开头,到文件末尾减去 1 个字节(最后一个字节,通常是 'e',不包括在内)。

例如,如果 torrent 文件为 43125 字节,“:info”从偏移量 362 开始,则 SHA 数据从偏移量 367 开始并继续到偏移量 43123(即 42757 字节)。

您可能知道您的 torrent 文件确实以 info 键结尾。如果你不知道,那么你的算法一定更复杂一点。一个 torrent 文件是经过编码的,信息密钥包含一个 bencode “字典”(在 Wikipedia 中搜索 bencode 并阅读文章——这很容易理解)。 “:info”后面的“d”开始以“e”结尾的字典。字典的长度没有被编码,所以知道它在哪里结束的唯一方法是解析内容,直到找到结束它的“e”。如果文件格式正确,则字典的内容将由一系列格式良好的编码元素(以及进一步嵌套的元素)组成。最终你会在一个元素(而不是另一个元素)的末尾找到一个“e”。这个“e”结束了字典。 SHA1 覆盖了这本字典的全部内容,包括开头的“d”和结尾的“e”。其他经过编码的元素可能会遵循这一点。这些不包括在 SHA1 计算中。

杂项。备注:

假设 info 密钥是文件中的最后一件事(同样,它可能不是),在您的算法中“遗漏”的 SHA1 的单个字节是整个 torrent 的最终“e”(它只是一个单独的 bencode 字典——所有 torrent 文件都以“d”开头并以“e”结尾)。

这是二进制数据,所以填写torrentstub[]时必须这样读取。

您无法像在示例中那样测试 -1 以确定何时结束。它所基于的代码在测试 -1 (eof) 时查看读取操作的结果,而不是数据本身。您必须使用 torrent 文件的长度减去数据的开头(在 ":info" 之后)减去 1 以获得正确的长度。

您引用的示例代码实际上确实读取了最后一个字节,但在生成 SHA1 时将其排除在外。

读取一个字节,复制到字符串然后反复重新扫描字符串是非常低效的。您已经拥有数组中的数据,所以只需使用 strstr(因为开头是 ASCII 数据)或自己扫描它(编码它并不难,因为它是一个非常短的固定长度字符串)。

我假设您有执行实际 SHA1 的代码。你在哪个平台上工作?

【讨论】:

    【解决方案2】:

    .torrent 规范是 freely available,应该可以帮助您轻松理解文件格式。您需要做的就是对info 密钥的内容进行SHA1 以获取信息哈希。

    【讨论】:

    • 是的,但是 infokey 在哪里结束?我是否应该只解析 4:info 中的所有内容并在最后一个“pieces”属性之后停止,最后从所有内容中创建一个哈希?
    • 如果您阅读规范,它会告诉您。没有任何答案可以让您可靠地跳过实际解析文件。
    • 还有大量经过测试和工作的代码,例如在 rtorrent 源代码树中。
    猜你喜欢
    • 2013-11-13
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多