В BitTorrent v2 есть куски корневого ключа (строка) у которого есть root sha256 файла закодированного в бинарном виде, в документации написано:
«Корень частей» — это корневой хэш дерева Меркла с коэффициентом ветвления 2, построенный из блоков файла размером 16 КБ. Последний блок может быть короче 16 КБ. Оставшиеся хэши листьев за концом файла, необходимые для построения верхних слоев дерева Меркла, обнуляются. Начиная с мета-версии 2 SHA2-256 используется в качестве функции дайджеста для дерева меркла. Хэш хранится в двоичной форме, а не в виде удобочитаемой строки.
Мне нужно извлечь этот хэш, чтобы использовать его на моем торрент-трекере, чтобы на информационной веб-странице пользователи могли видеть оригинальные хэши торрент-файлов, как мне это сделать? Как я мог декодировать эту двоичную строку, и я не знаю, являются ли они конкатенацией всех хэшей частей.
PHP или C предпочтительнее или, может быть, некоторые документы. Я нуб в кодировании, поэтому, пожалуйста, объясните подробно. Благодаря тонну!!
Я попробовал функцию unpack(), но что-то упустил.
@NicoHaase Конечно, в новом информационном словаре торрентов BitTorrent v2 каждый файл содержит свой оригинальный хэш, закодированный в двоичной строке, короче, вы не можете прочитать его текстовым редактором, вот картинка i.postimg.cc/2y5SC7pd/2023- 01-26-085936.png, как видите закодировано, хочу расшифровать.
Пожалуйста, добавьте все пояснения к вашему вопросу, отредактировав его. Это также должно включать образец ввода и код, который вы использовали для решения вашей проблемы.
Почему вы хотите показать это значение пользователю? Что вы ожидаете, что они будут делать с ним?
@AnonCoward Много полезного из этого:
Я также собираюсь добавить возможность поиска по хешу, например. вы хотите скачать софт, внутри этого софта есть пакет, который никто не скачивал или только 1-2 человека с медленной раздачей, потому что торрент был обновлен и вы скачали старую версию, вы можете искать другие рои для этого пакета по его хешу , и это не совсем софт, это могут быть фильмы, документы, iso, мертвые артефакты и т.д.






Хеш, хранящийся в торрент-файле, не закодирован, это его собственное представление, с которым работают компьютеры: последовательность байтов. В случае SHA2-256 это будет 32 байта (256 бит).
Если вам нужно, чтобы он был представлен в тексте, вам придется его закодировать. Есть много способов сделать это. Обычно используется шестнадцатеричный формат, который также часто используется для отображения информационного хеша торрента.
Я не знаю, являются ли они конкатенацией всех хэшей частей.
Как сказано в BEP, корень частей — это корневой хеш дерева Меркла , его нельзя получить конкатенацией хэшей отдельных блоков.
Его можно вычислить только из самого содержимого торрента. Поэтому, если у вас нет данных, вы не можете их пересчитать, вы можете только извлечь их из торрент-файла. Но поскольку он использует фиксированную конструкцию (независимую от размера фрагмента), корень фрагментов всегда одинаков для файлов одинакового содержания.
Блин, это слишком сложно для меня :( Мне нужно знать только корневой хэш sha2 каждого файла, чтобы показать его на веб-странице. Насколько я понял, мне нужно закодировать ключ "pieces root" в шестнадцатеричный? Был бы признателен, если бы Вы могли бы дать мне какой-нибудь код для этого.Не то, чтобы я не знаком со структурой торрента, просто я слаб в кодировании.
Ну, раз уж вы упомянули php, bin2hex должен выполнить эту работу после извлечения байтов из торрент-файла.
Я постараюсь ответить, спасибо, это будет то же самое, что и исходный файл sha256, или что-то другое?
Я сделал это с библиотекой bencode php, просто чтобы быть уверенным, но, к сожалению, похоже, что я получаю хеш, который не совсем тот же, странно, не могли бы вы помочь в этом, пожалуйста? Вот код, корневой хэш и вывод bin2hex на одной картинке: i.postimg.cc/yNqW3nxV/2023-01-28-071853.png
Как я уже сказал, корневой хэш дерева Меркла — это не то же самое, что просто хеширование файла. Если бы это было так, нам бы не понадобилось построение дерева Меркла. Вам нужен корневой хэш частей, который вы получили. То, что это не соответствует вашим потребностям, кажется другим вопросом, проблемой XY.
О, я вижу, на самом деле я ожидал, что это произойдет, поэтому в предыдущем комментарии я спросил — «такой же, как исходный файл sha256 или что-то другое?». Мой единственный вопрос сейчас заключается в том, как рассчитать одну и ту же версию дерева Меркла для отдельных файлов. Под этим я подразумеваю «дерево Меркла с коэффициентом ветвления 2, построенное из 16-килобайтных блоков файла…»? Я знаю, что утомил вас, но уверяю, что благодарен, и уже выбрал ваш ответ как принятый.
Собственно отвечать не надо, я нашел ответ, еще раз спасибо!
Святая корова, ChatGPT сделал мне рабочий код для этого
Я написал инструмент командной строки Windows для извлечения/вычисления корневых хэшей Merkle.
Его можно использовать для поиска нужных файлов среди трекеров, получивших поддержку BitTorrent v2, например, для поиска сидов для восстановления мертвых торрентов.
Использование:
Откройте командную строку и выполните следующие действия:
tmrr.exe example.torrent # For extracting root hashes from a torrent
tmrr.exe r your_file # For calculating Merkle root hash for a file
Инструмент выведет все корневые хэши файлов с их именами и размерами. Не стесняйтесь оставлять отзывы.
Я просмотрел словарь «дерево файлов», объединив все каталоги и имена файлов, извлек хэши файлов, передав каждый ключ «корневой фрагмент» функции bin2hex(), и скомпилировал этот код для окон.
Пожалуйста, добавьте все пояснения к своему ответу, отредактировав его, а не ссылаясь на внешние ресурсы.
Хотя почему минус
Что вы имеете в виду под "декодировать"? Можете ли вы поделиться образцом входных данных и ожидаемым результатом?