Проблема создания информационного хэша торрент-файла - PullRequest
3 голосов
/ 30 июня 2011

Я создаю сайт 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)));
}

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

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

EDIT

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

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

http://pastebin.com/HiQgRX6M

EDIT

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

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

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

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

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

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

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

, который я предполагаю, будет:

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

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

0 голосов
/ 30 июня 2011

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

Хеш в .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.
...