토런트 파일의 정보 해시를 계산하고,이 사이트에 비교하여 "올바른"해시 값을 받고 문제가 데 :내가 토런트 파일의 정보 해시를 구문 분석하는 C++를 사용하고
나는 기초가 옳았는지 확인하기 위해 아주 간단한 장난감 예제를 만들었습니다.
나는 숭고한에 토런트 파일을 열고 정보 사전을 제외한 모든 전원을 제거, 그래서는 다음과 같습니다 파일이 있습니다d6:lengthi729067520e4:name31:ubuntu-12.04.1-desktop-i386.iso12:piece lengthi524288e6:pieces27820:¡´E¶ˆØËš3í ..............(more unreadable stuff.....)..........
나는이 파일을 읽고이 코드를 구문 분석을 :
g++ -o hashes info_hasher.cpp -lssl -lcrypto
그리고 나는이 outpu 만났다 오전 :
#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;
}
과 같이 컴파일 t는 :
나는이 출력 기대하고4d0ca7e1599fbb658d886bddf3436e6543f58a8b
:
이14FFE5DD23188FD5CB53A1D47F1289DB70ABF31E
아무도 알고 있나요 어떻게 내가 잘못 여기 일을 할 수 있는가? 문제는 파일의 마지막 부분을 읽을 수 없게 만드는 것이 될 수 있습니까? 이것을 16 진수 또는 그 이상으로 구문 분석해야합니까?
문제가 줄 바꿈 문자와 관련 있다고 확신합니다! 감사! 위의 예는 장난감 예이며 정보 용 사전을 제외한 토렌트 파일의 모든 내용을 삭제했습니다. – Ethan
Arvid에서 제공 한 토런트 파일 인 root-dictionary와 info-dictionary는 모두 정렬되어 있지 않음을주의하십시오. bencode 스펙에 따라 사전을 정렬해야합니다. 그러나 어떤 이유로 정보 - 사전이 정렬되지 않은 합의 된 컨벤션은 위의 Arvid에 설명 된 것처럼 (정렬되지 않은) 그대로 정보 사전을 원시로 해시하는 것입니다. – Encombe
예, 좋은 지적입니다. 또한 bencode 된 사전이 잘못 정렬 되더라도 info-hash는 여전히 축 어적 형태의 해시라는 것을 보여줄 수 있습니다. 일부 클라이언트 (해독하기 전에 디코딩 및 재 코드화)가 발생하면 잘못된 정보 해시가 발생할 수 있습니다. – Arvid