Проблема создания информационного хэша торрент-файла

Я создаю сайт BitTorrent.

Если пользователь загружает файл.torrent, мне нужно получить хэш информации, чтобы получить больше информации с трекера.

Однако я не могу получить правильный хэш информации из файла.

Я скачал.torrent ( http://www.mininova.org/get/2886852) от Мининовой.

По словам Мининова, информационный хеш должен быть: 6a7eb42ab3b9781eba2d9ff3545d9758f27ec239 ( http://www.mininova.org/det/2886852). Однако, когда я пытаюсь создать информационный хеш файла, я получаю следующее: 3d05f149e604b1efaa0ed554a31e693755de7cb0

Я понятия не имею, почему я не могу получить правильный хэш информации.

Если я правильно понял, я должен создать хеш из раздела информации о торрент-данных.

Соответствующий код:

$bencode = new BencodeModel();
$data = $bencode->decode_file($form->fields['filename']->saved_file);
$hash = $torrentmanager->create_hash($data['info']);

BencodeModel (слишком долго, чтобы оставлять сообщения здесь): http://pastebin.com/Zc5i94DQ

Создать хэш-функцию:

function create_hash($info)
{
    $bencode = new BencodeModel();
    return urlencode(sha1($bencode->encode($info)));
}

Я полностью в темноте, где я ошибаюсь. Любая помощь высоко ценится!

Если вам нужно больше информации, просто скажите мне, и я обновлю с соответствующей информацией.

РЕДАКТИРОВАТЬ

По запросу запрашиваются данные для sha1:

var_dump($bencode->encode($info));

http://pastebin.com/HiQgRX6M

РЕДАКТИРОВАТЬ

Это становится все более странным.

Я развернул сайт на живом сервере (который работает в Linux), и там работает хеширование.

Однако на моем компьютере разработчика (Windows) это все еще не работает.

Я уже пробовал замененные разрывы строк / возврат каретки.

Есть идеи?

2 ответа

Мне удалось заставить код работать на Windows XP и 7 с PHP 5.3.x и получить правильный хеш. Я предполагаю, что.torrent, который вы загружаете в Windows, отличается от того, который вы загрузили в Linux (возможно, проблемы с кодировкой).

Попробуйте запустить этот код и посмотрите, получите ли вы хэш SHA1 148251317dae971fcd5a5dcc5d4bde3d85130c8f повторил:

echo sha1(file_get_contents('your.torrent'));

я предполагаю, что будет:

echo sha1(file_get_contents($form->fields['filename']->saved_file));

Если вы получили другой хеш, то загружаемый вами файл неверен.

Хеш в торрент-файле не может быть хешем файла. Подумайте об этом.... Хеш основан на его содержимом, и вы не можете знать, что это за хеш заранее. Таким образом, вычисление хеша файла, а затем встраивание его в файл изменяет хеш файла, делая недействительным только что внедренный хеш.

Хеш в.torrent-файле основан на содержимом файла, но не на всем его содержимом.

Из спецификации BT:

info_hash
    The 20 byte sha1 hash of the bencoded form of the info value from the metainfo file. Note that this is a substring of the metainfo file. This value will almost certainly have to be escaped.
Другие вопросы по тегам