Проблема создания информационного хэша торрент-файла
Я создаю сайт 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));
РЕДАКТИРОВАТЬ
Это становится все более странным.
Я развернул сайт на живом сервере (который работает в 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.