4

トレント ファイルの情報ハッシュを解析するために C++ を使用していますが、このサイトと比較して「正しい」ハッシュ値を取得するのに問題があります。

http://i-tools.org/torrent

基本が正しいことを確認するために、非常に単純なおもちゃの例を作成しました。

崇高な .torrent ファイルを開き、info ディクショナリ以外のすべてを取り除いたので、次のようなファイルができました。

d6:lengthi729067520e4:name31:ubuntu-12.04.1-desktop-i386.iso12:piece lengthi524288e6:pieces27820:¡´E¶ˆØËš3í   ..............(more unreadable stuff.....)..........

このファイルを読み込んで、次のコードで解析します。

#include <string>
#include <sstream>
#include <iomanip>
#include <fstream>
#include <iostream>

#include <openssl/sha.h>


void printHexRep(const unsigned char * test_sha) {

    std::cout << "CALLED HEX REP...PREPPING TO PRINT!\n";
    std::ostringstream os;
    os.fill('0');
    os << std::hex;
    for (const unsigned char * ptr = test_sha; ptr < test_sha + 20; ptr++) {

        os << std::setw(2) << (unsigned int) *ptr;
    }
    std::cout << os.str() << std::endl << std::endl;
}


int main() {

    using namespace std;

    ifstream myFile ("INFO_HASH__ubuntu-12.04.1-desktop-i386.torrent", ifstream::binary);

    //Get file length
    myFile.seekg(0, myFile.end);
    int fileLength = myFile.tellg();
    myFile.seekg(0, myFile.beg);

    char buffer[fileLength];

    myFile.read(buffer, fileLength);
    cout << "File length == " << fileLength << endl;
    cout << buffer << endl << endl;

    unsigned char datSha[20];
    SHA1((unsigned char *) buffer, fileLength, datSha);
    printHexRep(datSha);

    myFile.close();

    return 0;
}

次のようにコンパイルします。

g++ -o hashes info_hasher.cpp -lssl -lcrypto

そして、私はこの出力に遭遇しました:

4d0ca7e1599fbb658d886bddf3436e6543f58a8b

この出力を期待している場合:

14FFE5DD23188FD5CB53A1D47F1289DB70ABF31E

ここで私が間違っているかもしれないことを誰かが知っていますか? 問題は、ファイルの最後が読めないことにあるのでしょうか? これを最初に16進数か何かとして解析する必要がありますか?

4

2 に答える 2

1

SHA1 計算は、多かれ少なかれ、あなたが書いたものと同じくらい簡単です。ライブラリ関数から間違った答えが得られた場合、エラーはおそらくフィードしているデータにあります。

あなたが行った torrent ファイルの準備作業について話すことはできませんが、いくつかの問題が見られます。SHA1 docsを再度参照する場合は、SHA1 関数がパラメーターとして独自のダイジェスト長を必要としないことに注意してください。次に、ファイルの内容を読み取るために使用している手法が、変換ではなく、正確なバイトを忠実に吸い上げていることを確認する必要があります。

あまり重要でないスタイルの提案: SHA1 の 3 番目のパラメーターを使用します。原則として、ライブラリ内の静的ストレージは避けるのが最善です。常に独自のバッファーを提供することを好みます。また、印刷関数にハードコーディングされた 20 がある場合、それは、いちゃつくために使用してきたダイジェストの長さの定数にとって素晴らしい場所です。

于 2013-11-03T03:43:50.640 に答える