В настоящее время я нахожусь в тупике при воссоздании хэша HMAC MD5, сгенерированного Java-программой на C. Любая помощь, предложения, исправления и рекомендации будут с благодарностью.
Java-программа создает строку HMAC MD5 (закодированную в 16-строковую строку HEX длиной 32 символа) с использованием UTF16LE и MAC; что мне нужно, это воссоздать тот же результат в программе на Си.
Я использую источник RSA для MD5, а код HMAC-MD5 взят из RFC 2104 (http://www.koders.com/c/fidBA892645B9DFAD21A2B5ED526824968A1204C781.aspx)
Я "смоделировал" UTF16LE в реализации C, заполнив каждый четный байт нулями. Представление Hex / Int кажется согласованным с обеих сторон, когда я делаю это; но это правильный способ сделать это? Я подумал, что это будет лучшим способом, потому что вызов функции HMAC-MD5 допускает только байтовый массив (такой вещи, как вызов двухбайтового массива в реализации RFC2104, но это не имеет значения).
Когда я запускаю строку, чтобы пройти через HMAC - вы, естественно, получаете «мусор». Теперь моя проблема в том, что даже «мусор» не одинаков для всех систем (исключая тот факт, что, возможно, кодировка base 16 может быть несовместимой). Я имею в виду, что это «might» может быть результатом Java HMAC-MD5, но C может дать «v ? ! { » (просто пример , не фактические данные).
У меня есть 2 вещи, которые я хотел бы подтвердить:
- Повлило ли заполнение каждого четного байта на 0 алгоритмами HMAC-MD5? (либо потому, что он сразу же после первого байта встретит ноль, либо что-то еще)
- Является ли тот факт, что я вижу разные "мусор", потому что C и Java используют разные кодировки символов? (та же машина, на которой работает Ubuntu)
Я собираюсь прочитать код HMAC-MD5 и MD5, чтобы увидеть, как они обрабатывают входящий массив байтов (независимо от того, вызывают ли проблемы нулевые и четные байты). Мне также трудно написать правильную функцию кодирования на стороне C для преобразования результирующей строки в шестнадцатеричную строку из 32 символов. Любой вклад / помощь будет принята с благодарностью.
Обновление (3 февраля): изменится ли пропуск байтового массива со знаком / без знака на вывод HMAC-MD5? Реализация Java принимает байтовый массив (который подписан); но реализация C принимает массив байтов UNSIGNED. Я думаю, что это также может быть фактором для получения разных результатов. Если это влияет на конечный результат; что я могу сделать на самом деле? Буду ли я передавать байтовый массив SIGNED в C (метод принимает байтовый массив без знака) или я буду преобразовывать байтовый массив SIGNED в число без знака?
Спасибо!
Климент