Хэш MD5 в сборке руки и порядок - PullRequest
0 голосов
/ 29 сентября 2018

Я новичок в программировании сборки рукоятки.Я пытаюсь написать функцию в сборке arm cortex m4, которая выполняет алгоритм MD5 Hash.Я следую алгоритму страницы вики, найденному здесь https://en.wikipedia.org/wiki/MD5.

В википейдже объявляются константы A, B, C, D и массивы S и K. Все значения показаны в младшем порядке.

About little endian:

Я провел некоторое исследование, и кажется, что в памяти вся строка отображается в порядке , как если бы вся строка была в старшем порядке.Это потому, что каждый символ является байтом.Значения в вики объявляются с прямым порядком байтов, поэтому после того, как я их объявляю, они отображаются в памяти как с прямым порядком байтов (нормальный порядок).

Я сделал предварительную обработку для хэша MD5.Позвольте мне показать вам, как это выглядит в памяти для строки «Быстрая коричневая лиса перепрыгивает через ленивую собаку»:

 54686520 51756963 6B204272 6F776E20 466F7820 4A756D70 73204F76 65722054 
 6865204C 617A7920 446F672E 80000000 00000000 00000000 00000000 00006001

Итак, 54 = T, 68, = h, ... и т.д ...

Теперь вот где моя путаница.

После сообщения добавляется один бит.Это байт 0x80.После этого оставшиеся 512 бит заполняются нулями до последних 64 бит, то есть туда, где идет длина сообщения.Таким образом, как показано, сообщение имеет длину 0x160 бит.Но длина в памяти имеет младший порядок следования, поэтому она отображается как 6001.

Таким образом, длина в памяти имеет младший порядок следования.

Но константы A, B, C, Dи массив K объявлен первоначально в порядке байтов в соответствии с вики.

Поэтому, когда я просматриваю их в памяти, они отображаются как обычно.

Так что теперь яя в замешательстве!моя длина в памяти имеет прямой порядок байтов, а константы и массив K находятся в памяти с прямым порядком байтов.

Каким будет правильный способ просмотра примера в памяти?

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Неверно описывать строки ASCII как big-endian.Порядковый номер применяется только к многобайтовым значениям, поэтому строки ASCII не имеют порядкового номера, потому что они просто массивы байтов.Например, если бы у вас был массив 16-битных чисел, то порядок байтов применялся бы индивидуально к каждому значению в массиве, но не к порядку элементов.

Реальный ответ на ваш вопрос заключается в том, что существуетнет простого способа просмотра «сырых» данных памяти, когда они организованы таким образом.У большинства отладчиков есть переменные средства наблюдения, которые можно использовать для просмотра содержимого областей памяти с учетом типа, что обычно проще;так, например, вы можете сказать окну наблюдения, что K указывает на 64-байтовую строку и что K+56 указывает на 64-разрядное целое число без знака с прямым порядком байтов, и тогда эти значения будут интерпретироваться и сообщаться правильно.

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

0 голосов
/ 30 сентября 2018

Язык программирования и архитектура не имеют к этому никакого отношения.Вы пытаетесь подготовить 32-битные значения из строки.

"The Quick Brown Fox Jumps Over The Lazy Dog."

Как строка ASCII, байты выглядят так в шестнадцатеричном виде:

54 68 65 20 51 75 69 63 6B 20 42 72 6F 77 6E 20 46 6F 78 20 4A 75 6D 70 73 20 4F 76 65 72 20 54 68 65 20 4C 61 7A 79 20 44 6F 67 2E

Но md5 касается данных, а не строк правильно?Подробнее об этом чуть позже.

Вы должны быть осторожны с порядком байтов.Обычно люди говорят об байтовой отмене больших количеств (адрес байта начинается сверху или снизу, большим концом или маленьким концом).16 или 32 или 64 и т. Д. Биты.Первоначально речь идет о 64-битной величине для длины:

0x1122334455667788

, если смотреть в виде списка байтов в порядке возрастания адресов, младший (как обычно понимается) порядок байтов равен

88 77 66 55 44 33 22 11

поэтому

0x0000000000000160

будет

60 01 00 00 00 00 00 00

И следующий вопрос - ваша строка.Должен ли он начинаться с 0x54686520 или 0x20656854 или 0x63697551?

Я полагаю из текста в Википедии

The MD5 hash is calculated according to this algorithm. All values are in little-endian.

//Note: All variables are unsigned 32 bit and wrap modulo 2^32 when calculating

Тогда ваш последний (единственный) кусок должен выглядеть так:

0x20656854
0x63697551
0x7242206B
0x206E776F
0x20786F46
0x706D754A
0x764F2073
0x54207265
0x4C206568
0x20797A61
0x2E676F44
0x00000080
0x00000000
0x00000000
0x00000160
0x00000000

Используя исходную процедуру md5, которую я нашел в Интернете ипри использовании моего дистрибутива Linux я получил

ec60fd67aab1c782cd3f690702b21527

Как хеш в обоих случаях, так и подготовленные данные для последнего / единственного блока начались с 0x20656854 из этой программы.Эта программа также правильно рассчитала результат для строки в Википедии.

Итак, из статьи в Википедии, которая должна была лучше обрабатывать 64-битную длину.Ваши данные (это не строка) должны обрабатываться в 32-битных байтовых числах из 512 бит.

54 68 65 20 becomes 0x20656854 0x000000000000160 becomes 0x00000160, 0x00000000.
0 голосов
/ 29 сентября 2018

Если я сделаю это, я найду библиотеку MD5 или класс, напишу простой пример, чтобы взять текст, который я хочу хэшировать, затем попросить компилятор сгенерировать сборку для нужной мне части ARM.

Вы можете рассмотреть версию mbed [1] или Arduino [2].

[1] https://os.mbed.com/users/hlipka/code/MD5/
[2] https://github.com/tzikis/ArduinoMD5

...