Проблемы с воспроизведением того же HMAC MD5 на Java и C - PullRequest
1 голос
/ 08 января 2012

В настоящее время я нахожусь в тупике при воссоздании хэша 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 вещи, которые я хотел бы подтвердить:

  1. Повлило ли заполнение каждого четного байта на 0 алгоритмами HMAC-MD5? (либо потому, что он сразу же после первого байта встретит ноль, либо что-то еще)
  2. Является ли тот факт, что я вижу разные "мусор", потому что C и Java используют разные кодировки символов? (та же машина, на которой работает Ubuntu)

Я собираюсь прочитать код HMAC-MD5 и MD5, чтобы увидеть, как они обрабатывают входящий массив байтов (независимо от того, вызывают ли проблемы нулевые и четные байты). Мне также трудно написать правильную функцию кодирования на стороне C для преобразования результирующей строки в шестнадцатеричную строку из 32 символов. Любой вклад / помощь будет принята с благодарностью.

Обновление (3 февраля): изменится ли пропуск байтового массива со знаком / без знака на вывод HMAC-MD5? Реализация Java принимает байтовый массив (который подписан); но реализация C принимает массив байтов UNSIGNED. Я думаю, что это также может быть фактором для получения разных результатов. Если это влияет на конечный результат; что я могу сделать на самом деле? Буду ли я передавать байтовый массив SIGNED в C (метод принимает байтовый массив без знака) или я буду преобразовывать байтовый массив SIGNED в число без знака?

Спасибо! Климент

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Проблема была в том, что я использовал реализацию RSA. После того, как я перешел на OpenSSL, все мои проблемы были решены. Реализация RSA не приняла во внимание все необходимые детали кроссплатформенной поддержки (включая 32-битные / 64-битные процессоры).

Всегда используйте OpenSSL, потому что они уже решили все кросс-платформенные проблемы.

0 голосов
/ 08 января 2012

Возможно, проблема в том, что вы наивно создали строку UTF-16. Любой символ больше 0x7F ( см. Объяснение Unicode ) необходимо расширить в схему кодирования UTF.

Я бы сначала поработал над получением той же строки байтов между реализацией C и Java, поскольку, возможно, именно в этом и заключается ваша проблема, поэтому я согласился бы с вашим предположением (1)

Вы пытались вычислить MD5, не дополняя C-строку, а просто преобразовав ее в UTF - вы можете использовать iconv для экспериментов с кодировкой.

...