Рейтинг:0

Сомнения относительно преобразования шестнадцатеричного в байтовый ввод SHA-256

флаг br

Хэш-функции, такие как SHA-256, принимают на вход двоичную строку. Теперь, когда мы преобразуем шестнадцатеричную строку в обычную текстовую строку, вычисленное значение SHA-256 будет таким же. В этом моя проблема

Рассмотрим простую строку в шестнадцатеричном формате. ; его значение SHA-256 равно cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8.

При преобразовании в байтовую форму мы должны написать 46 или же 046. В любом случае вывод SHA-256 не соответствует:

За 46 ты получишь 25fc0e7096fc653718202dc30b0c580b8ab87eac11a700cba03a7c021bc35b0c.

За 046 ты получишь b2d084ae2bd0f4b38953ea3adb009b4f059816f93392addbcfb373399f183e88.

Как преобразовать шестнадцатеричные числа в байты, чтобы результат был таким же? Каковы правила? Насколько я знаю, SHA-256 требует байтового формата.

я использовал это (Гитхаб) программное обеспечение для расчета значений SHA-256.

Aman Grewal avatar
флаг gb
На этом сайте нет опции байтов. Как вы вводите его как байты?
J.Doe avatar
флаг br
в раскрывающемся списке есть текстовая опция. Я предполагаю, что это байты?
fgrieu avatar
флаг ng
Вопрос касается SHA-256, а не другого SHA (также известного как SHA-0). SHA был предшественником SHA-1. Он оказался небезопасным даже больше, чем SHA-1. Второй (соответственно третий) показанный хэш относится к двухсимвольной (соответственно трехсимвольной) последовательности `46` (соответственно `046`) при кодировании в столько байтов на ASCII или UTF-8, что составляет байты 0x34 0x36 (соответственно 0x30 0x34 0x36), где префикс 0x соответствует шестнадцатеричному формату.
Рейтинг:7
флаг in

Давайте рассмотрим простую строку в Hex: Его значение SHA:

cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8

Да, это правильно.

При преобразовании в байтовую форму мы должны писать 46 или 046.

Ни один.

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

Если вы интерпретируете его как текст ASCII, это будет символ «точка». Так printf "\x2E" | ша256сум такой же как печать "." | ша256сум на большинстве систем. Таким образом, на вашем сайте вы можете просто использовать одну точку в качестве текста. Это также можно сделать с помощью эхо но эхо имеет слишком много проблем с переносимостью, чтобы считаться надежной альтернативой printf.

Обычно мы не представляем байты с помощью десятичных знаков. Если вы это сделаете, вам, вероятно, придется запрограммировать его специально. Например, в Java вы можете использовать байт б = 46 или же байт [] ба = { 46 } а затем использовать это в алгоритме хеширования.Если вы действительно хотите запрограммировать его с помощью командной строки, тогда printf "\x$(printf "%x" 46)" | ша256сум кажется работает.

J.Doe avatar
флаг br
Спасибо. Но когда мы инициализируем данные, т.е. w[i] перед запуском алгоритма, что мы делаем, поскольку требуемые данные находятся в байтах с помощью переменных (w[i]), являющихся 32-битными)? Изменяем ли мы данные в двоичные, а затем присваиваем или работаем непосредственно с шестнадцатеричными, сохраняя их в w[i] в ​​шестнадцатеричном формате. Я не думаю, что последний сработает и даст правильный хэш?
J.Doe avatar
флаг br
Я пытаюсь написать SHA256 с нуля, и эта часть ужасно запутана. Остальная логика выглядит нормально. Предположим, что текст в Hexa: 2E 2F 05 EE, который должен быть заполнен в W[0]. Как мы поступим и какова будет его ценность?
Maarten Bodewes avatar
флаг in
Обычно мы создаем интерфейс, используя байты для хеш-функции SHA-256. В этом случае значение «2E 2F 05 EE» в байтах будет преобразовано в одно слово «0x2E2F05EE» при просмотре реализации SHA-256. Но обратите внимание, что SHA-256 определяется как использующий **старший** порядок байтов.Вы не должны **никогда** использовать шестнадцатеричные числа, созданные из строки, только байты и слова. Шестнадцатеричные числа полезны только для отладки (конечно, их может использовать отладчик, и вы можете использовать их в операторах отладочной печати или трассировки), вы **никогда** не должны использовать их для самой реализации.
Maarten Bodewes avatar
флаг in
Вы можете просто *сдвинуть значение байта в нужное место, используя `
Рейтинг:0
флаг ng
SSA
  • Пункт списка

Я использовал python, чтобы выявить разницу, когда вы берете 2E и просто кодируете как байт и даете байт, закодированный как b'2E'.

  • python имеет метод bytes.fromhex() для ex..
  • v=bytes.fromhex('474039')
  • здесь v печатается как б'Г@9'
  • Для декодирования используйте binascii.hexlify(v), и вывод будет б'474039' введите описание изображения здесь

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.