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

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

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

4

Другие решения

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

0

По вопросам рекламы [email protected]