簡體   English   中英

創建種子哈希信息

[英]Create torrent hash info

如何在種子文件中生成種子哈希信息。

我一直在研究以下示例: 如何使用Java計算torrent的哈希值,並嘗試將其轉換為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之后的4:info 我認為這行得通,例如:

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

之后,只有我無法讀取的信息,我想這是一些二進制數據嗎?

因此,我的問題實際上可以歸結為:應該對信息進行哈希處理4:info之后的所有內容,我應該在哪里停止收集哈希數據呢?

您以此為基礎的示例代碼似乎假設info鍵是torrent文件中的最后一件事(可能不是,因此,請閱讀完整答案以獲取全文)。 這樣,它將覆蓋文件的其余部分(減去1個字節),從“:info”之后的字節開始。 您會看到類似“ ...:infod6:length ...”的信息。 SHA1以“ d6:length ...”開頭,並到達文件末尾減去1個字節(不包括最后一個字節,通常為'e')。

例如,如果Torrent文件為43125字節,並且“:info”從偏移量362開始,則SHA數據將從偏移量367開始,並繼續偏移量43123(即42757字節)。

您可能知道您的torrent文件確實以info鍵結尾。 如果您不知道,那么您的算法必須更加復雜。 將對torrent文件進行bencode編碼,而info鍵則包含一個bencode“ dictionary”(在Wikipedia中搜索bencode並閱讀該文章,這很容易理解)。 “:info”后面的“ d”開始以“ e”結尾的字典。 字典的長度沒有經過編碼,因此,知道字典結尾的唯一方法是解析內容,直到找到結尾的“ e”為止。 如果文件格式正確,則詞典的內容將由一系列格式良好的Bencoded元素(以及進一步嵌套的元素)組成。 最終,您會在一個元素(而不是另一個元素)的末尾找到一個“ e”。 此“ e”以字典結尾。 SHA1在此詞典的整個內容上,包括開頭“ d”和結尾“ e”。 其他被編碼的元素也可能遵循此規則。 這些不包括在SHA1計算中。

雜項。 筆記:

假設信息密鑰是文件中的最后一件事(再次可能不是),則算法中SHA1“遺漏”的單個字節是整個torrent的最后一個“ e”(只是一個單個Bencode字典-所有種子文件均以“ d”開頭,以“ e”結尾)。

這是二進制數據,因此在填充torrentstub []時必須照此讀取。

您無法像示例中那樣測試-1以確定何時結束。 它基於的代碼在測試-1(eof)而不是數據本身時會查看讀取操作的結果。 您必須使用種子文件的長度減去數據的開頭(“:info”之后)減去1才能獲得正確的長度。

您引用的示例代碼實際上確實讀取了最后一個字節,但在生成SHA1時將其排除在外。

讀取一個字節,復制到字符串,然后重復重新掃描字符串是非常低效的。 您已經在數組中存儲了數據,因此只需使用strstr(因為開頭是ASCII數據)或自己掃描(因為它是一個非常短的固定長度的字符串,所以不難編碼)。

我假設您有執行實際SHA1的代碼。 您在哪個平台上工作?

.torrent規范是免費提供的 ,應該可以幫助您輕松地了解文件格式。 您所需要做的就是SHA1 info鍵的內容以獲取信息哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM