Calculer l’info-hash d’un fichier torrent

J’utilise C ++ pour parsingr le hachage d’informations d’un fichier torrent, et j’ai des difficultés à obtenir une valeur de hachage “correcte” par rapport à ce site:

http://i-tools.org/torrent

J’ai construit un exemple de jouet très simple pour m’assurer que les bases sont correctes.

J’ai ouvert un fichier .torrent en sublime et enlevé tout sauf le dictionnaire d’informations. J’ai donc un fichier qui ressemble à ceci:

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

J’ai lu ce fichier et l’ai analysé avec ce code:

 #include  #include  #include  #include  #include  #include  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; } 

Comstackz-le comme suit:

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

Et je suis rencontré avec cette sortie:

 4d0ca7e1599fbb658d886bddf3436e6543f58a8b 

Quand j’attends cette sortie:

 14FFE5DD23188FD5CB53A1D47F1289DB70ABF31E 

Est-ce que quelqu’un sait ce que je pourrais faire de mal ici? Le problème pourrait-il être lié à la non lisibilité de la fin du fichier? Dois-je parsingr cela en tant que sortilège en premier ou quelque chose d’autre?

Assurez-vous de ne pas avoir de saut de ligne à la fin du fichier, vous pouvez également vous assurer qu’il se termine par un ‘e’.

Le hachage info d’un fichier torrent est le hachage SHA-1 de la section info (sous forme codée) du fichier .torrent. En gros, vous devez décoder le fichier (il est codé) et vous souvenir des décalages d’octets où le contenu de la valeur associée à la touche “info” commence et se termine. C’est la plage d’octets dont vous avez besoin pour le hachage.

Par exemple, s’il s’agit du fichier torrent:

 d4:infod6:pieces20:....................4:name4:test12:piece lengthi1024ee8:announce27:http://tracker.com/announcee 

Vous voulez juste hacher cette section:

 d6:pieces20:....................4:name4:test12:piece lengthi1024ee 

Pour plus d’informations sur le codage, voir BEP3 .

Le calcul SHA1 est aussi simple que ce que vous avez écrit, plus ou moins. L’erreur est probablement dans les données que vous alimentez, si vous obtenez la mauvaise réponse de la fonction de bibliothèque.

Je ne peux pas vous parler du travail de préparation de fichiers torrent que vous avez effectué, mais je vois quelques problèmes. Si vous revisitez les documents SHA1 , notez que la fonction SHA1 n’a jamais besoin de sa propre longueur de résumé en tant que paramètre. Ensuite, vous voudrez être certain que la technique que vous utilisez pour lire le contenu du fichier suive fidèlement les octets exacts, pas de traduction.

Une suggestion de style moins critique: utilisez le troisième paramètre de SHA1. En règle générale, il vaut mieux éviter le stockage statique dans la bibliothèque. Toujours préférer fournir votre propre tampon. De plus, là où vous avez un 20 codé en dur dans votre fonction d’impression, c’est un endroit merveilleux pour cette constante de longueur de résumé que vous flirtez avec.