Создать торрент-хэш

Как сгенерировать торрент-хэш-информацию о торрент-файлах.

Я взглянул на этот пример: как вычислить хеш-значение торрента с помощью 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 Параметр - это торрент-файл, представленный в виде строки. Насколько я понимаю, я должен получить информацию, которая приходит после 4:info, Это работает хорошо, я думаю, например:

d6:lengthi2847431620e4:name8:filename12:piece lengthi1143252e6:pieces50264

После этого есть только информация, которую я не могу прочитать, я думаю, это какие-то двоичные данные?

Так что мой вопрос на самом деле сводится к следующему: является ли информация, которая должна быть хеширована все, что приходит 4:infoи где мне перестать собирать данные для хеша?

2 ответа

Решение

Пример кода, который вы основали, похоже, предполагает, что информационный ключ - это последнее, что есть в торрент-файле (это может быть не так, поэтому прочитайте весь ответ, чтобы получить всю историю). Таким образом, он будет охватывать оставшуюся часть файла (минус 1 байт), начиная с байта, следующего за:: info. Вы бы увидели что-то вроде "...:infod6:length...". SHA1 начинается с "d6:length..." и идет до конца файла минус 1 байт (последний байт, обычно 'e', ​​не включен).

Например, если торрент-файл имеет размер 43125 байт и ":info" начинается со смещения 362, тогда данные SHA начинаются со смещения 367 и продолжают смещаться 43123 (то есть это 42757 байт).

Возможно, вы знаете, что ваши торрент-файлы действительно заканчиваются информационным ключом. Если вы не знаете, то ваш алгоритм должен быть немного более сложным. Торрент-файл кодируется, а информационный ключ состоит из "словаря" bencode (поищите bencode в Википедии и прочитайте статью - это довольно просто понять). Буква "d", следующая за ":info", запускает словарь, который заканчивается буквой "e". Длина словаря не закодирована, поэтому единственный способ узнать, где он заканчивается, - анализировать содержимое, пока не найдете "е", которое его заканчивает. Если файл правильно отформатирован, содержимое словаря будет состоять из серии хорошо отформатированных закодированных элементов (и элементов с дополнительными вложениями). В конце концов вы найдете "е" после конца элемента (вместо другого элемента). Это "е" заканчивает словарь. SHA1 находится над всем содержимым этого словаря, включая открывающуюся "d" и закрывающую "e". Это возможно для других закодированных элементов. Они НЕ включены в расчет SHA1.

Разный заметки:

Предполагая, что информационный ключ - это последнее, что есть в файле (опять же, это может и не быть), единственный байт, который "пропущен" из SHA1 в вашем алгоритме, является конечным "е" для всего торрента (который является просто одиночный словарь bencode - все торрент-файлы начинаются с "d" и заканчиваются "e").

Это двоичные данные, поэтому вы должны прочитать их как таковые при заполнении torrentstub[].

Вы не можете проверить на -1, чтобы определить, когда закончить, как вы делаете в своем примере. Код, на котором он основан, просматривает результат операции чтения при тестировании на -1 (eof), а не сами данные. Вы должны использовать длину торрент-файла, минус начало данных (после ":info") минус 1, чтобы получить правильную длину.

Пример кода, на который вы ссылаетесь, действительно читает последний байт, но исключает его при генерации SHA1.

Чтение одного байта, копирование в строку с последующим повторным сканированием строки очень неэффективно. У вас уже есть данные в массиве, поэтому просто используйте strstr (так как начало - данные ASCII) или отсканируйте их самостоятельно (не слишком сложно просто кодировать их, поскольку это очень короткая строка фиксированной длины).

Я предполагаю, что у вас есть код для фактического SHA1. На какой платформе вы работаете?

Спецификация.torrent находится в свободном доступе и должна помочь вам легко понять формат файла. Все, что вам нужно сделать, это SHA1 содержимое info ключ, чтобы получить хэш информации.

Другие вопросы по тегам