2013-11-03 4 views
4

토런트 파일의 정보 해시를 계산하고,이 사이트에 비교하여 "올바른"해시 값을 받고 문제가 데 :내가 토런트 파일의 정보 해시를 구문 분석하는 C++를 사용하고

http://i-tools.org/torrent

나는 기초가 옳았는지 확인하기 위해 아주 간단한 장난감 예제를 만들었습니다.

나는 숭고한에 토런트 파일을 열고 정보 사전을 제외한 모든 전원을 제거, 그래서는 다음과 같습니다 파일이 있습니다

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 진수 또는 그 이상으로 구문 분석해야합니까?

답변

8

파일 끝에 줄 바꿈이 없는지 확인하고 'e'로 끝나고 싶을 수도 있습니다.

토런트 파일의 정보 - 해시는 .torrent 파일의 정보 섹션 (인코딩 된 형식)의 SHA-1 해시입니다. 본질적으로 파일을 디코드 (bencoded)하고 "info"키와 관련된 값의 내용이 시작되고 끝나는 바이트 오프셋을 기억해야합니다. 그것이 해쉬 할 필요가있는 바이트의 범위입니다. 당신은 바로이 부분을 해시 완

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

: 이것은 토런트 파일 인 경우 예를 들어

,

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

bencoding에 대한 자세한 내용은 BEP3를 참조하십시오.

+0

문제가 줄 바꿈 문자와 관련 있다고 확신합니다! 감사! 위의 예는 장난감 예이며 정보 용 사전을 제외한 토렌트 파일의 모든 내용을 삭제했습니다. – Ethan

+2

Arvid에서 제공 한 토런트 파일 인 root-dictionary와 info-dictionary는 모두 정렬되어 있지 않음을주의하십시오. bencode 스펙에 따라 사전을 정렬해야합니다. 그러나 어떤 이유로 정보 - 사전이 정렬되지 않은 합의 된 컨벤션은 위의 Arvid에 설명 된 것처럼 (정렬되지 않은) 그대로 정보 사전을 원시로 해시하는 것입니다. – Encombe

+3

예, 좋은 지적입니다. 또한 bencode 된 사전이 잘못 정렬 되더라도 info-hash는 여전히 축 어적 형태의 해시라는 것을 보여줄 수 있습니다. 일부 클라이언트 (해독하기 전에 디코딩 및 재 코드화)가 발생하면 잘못된 정보 해시가 발생할 수 있습니다. – Arvid

1

SHA1 계산은 사용자가 작성한 것만 큼 간단합니다. 라이브러리 기능에서 오답을 얻으면 오류가 데이터를 입력하는 중일 수 있습니다.

내가 한 토런트 파일 준비 작업은 말할 수 없지만 몇 가지 문제가 있습니다. SHA1 docs을 다시 방문 할 경우 SHA1 함수가 자체 다이제스트 길이를 매개 변수로 요구하지 않습니다. 다음으로 파일의 내용을 읽는 데 사용하는 기술이 정확한 바이트와 변환되지 않은 파일을 충실히 빠는 것임을 확실히 알고 싶을 것입니다.

덜 중요한 스타일 제안 : SHA1에 세 번째 매개 변수를 사용합니다. 일반 규칙에서는 라이브러리의 정적 저장소를 사용하지 않는 것이 좋습니다. 항상 자신의 버퍼를 제공하는 것을 선호합니다. 또한 인쇄 기능에 하드 코드 20이있는 곳은 그 다이제스트 길이 상수에 대한 훌륭한 장소입니다.

+0

whooopss는 완전히 잘못 읽고 SHA1에 전달 된 길이가 수신 배열에 대한 것이라고 생각합니다! 나는 그것을 고정 시켰고 분명히 다른 해시를 얻었지만 여전히 올바른 것은 아니다. 나는 토런트 파일에 문제가 있다고 생각한다. 내가 정면을 다듬은 토런트 파일은 다른 웹 페이지로 들어가서 동일한 결과를 얻었 기 때문에 근본적으로 손상되지 않았습니다. 변경 사항을 반영하도록 게시 된 코드를 변경했습니다. – Ethan