2

トレント ファイルのトレント ハッシュ情報を生成するにはどうすればよいですか。

私はこの例を見てきました: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ます。

4

2 に答える 2

4

これに基づいたサンプルコードは、情報キーがトレントファイルの最後のものであると想定しているようです(そうではない場合があるため、回答全体を読んでストーリー全体を理解してください)。そのため、「:info」に続くバイトから始まるファイルの残り (マイナス 1 バイト) をカバーします。「...:infod6:length...」のようなものが表示されます。SHA1 は "d6:length..." で始まり、ファイルの末尾から 1 バイトを引いた位置まで続きます (最後のバイト、通常は 'e' は含まれません)。

たとえば、トレント ファイルが 43125 バイトで、「:info」がオフセット 362 から始まる場合、SHA データはオフセット 367 から始まり、オフセット 43123 まで続きます (つまり、42757 バイト)。

トレント ファイルが実際に info キーで終わっていることをご存知かもしれません。わからない場合は、アルゴリズムをもう少し洗練する必要があります。トレント ファイルはベンコードされており、情報キーはベンコードの「辞書」で構成されています (ウィキペディアでベンコードを検索し、記事を読んでください。理解するのは非常に簡単です)。「:info」に続く「d」は、「e」で終わる辞書を開始します。辞書の長さはエンコードされていないため、末尾を知る唯一の方法は、末尾の「e」が見つかるまでコンテンツを解析することです。ファイルが正しくフォーマットされている場合、ディクショナリのコンテンツは一連の適切にフォーマットされた bencoded 要素 (およびさらにネストされた要素) で構成されます。最終的には、要素の末尾に (別の要素ではなく) 「e」が続くことがわかります。この「e」で辞書は終わります。SHA1 は、冒頭の「d」と末尾の「e」を含む、この辞書の内容全体に適用されます。他のコード化された要素がこれに従う可能性があります。これらは SHA1 計算には含まれません。

その他 ノート:

情報キーがファイルの最後のものであると仮定すると (そうでない場合もあります)、アルゴリズムで SHA1 から「取り除かれた」1 バイトは、トレント全体の最後の「e」です (これは単なる単一の bencode 辞書 -- すべての torrent ファイルは "d" で始まり "e" で終わります)。

これはバイナリ データなので、torrentstub[] に入力するときはそのように読み取る必要があります。

-1 をテストして、例のようにいつ終了するかを判断することはできません。それが基づいているコードは、データ自体ではなく、-1 (eof) をテストするときに読み取り操作の結果を調べます。適切な長さを得るには、トレント ファイルの長さからデータの開始部分 (":info" の後) を引いて 1 を引く必要があります。

参照するサンプル コードは、実際には最後のバイトを読み取りますが、SHA1 の生成時に除外します。

1 バイトを読み取り、文字列にコピーして、文字列を繰り返し再スキャンするのは非常に非効率的です。すでに配列にデータがあるので、strstr を使用するか (最初は ASCII データであるため)、自分でスキャンします (非常に短い固定長の文字列であるため、コード化するのは難しくありません)。

実際のSHA1を実行するコードがあると思います。どのプラットフォームで作業していますか?

于 2013-09-25T15:19:39.430 に答える
0

.torrent 仕様は無料で入手でき、ファイル形式を簡単に理解するのに役立ちます。キーの内容を SHA1 しinfoて情報ハッシュを取得するだけです。

于 2012-12-02T16:36:00.477 に答える