Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

md5


listvenniza ©   (2013-08-07 15:56:00) 

прошу помощи.
трассирую прогу под нет.
идет вызов стандартной с крипто апи md5sum
передается строка: "C1BFEBFBFF000306A98AB5C567"
функция возвращает: ""3898a80d277947193310068008b5f1ae""

перепробывал на дельфи все найденные мд5 вариации, в основном на выходе имею: "7c195f9e5b6364e712f8f07b08cc0ec2"
он лайн сервисы то же дают.

в какую сторону копать? вроде бы пробывал и юникодные варианты строки. или может организация функции GetMd5Sum другая?


listvenniza   (2013-08-07 17:31:00) [1]

спасибо, вопрос закрыт!

вообщем нужно было в дельфи перевести в юникод
Encoding.Unicode.GetEncoder("...")  затем уже считать мд5 полученных байтов.


ProgRAMmer Dimonych   (2013-08-07 17:27:00) [2]

Рискну предположить, что дело в том, как интерпретируется строка теми же онлайн-сервисами и библиотеками. Наверняка берут в однобайтовой кодировке или в UTF-8, или ещё как-нибудь. А в Вашей GetMd5Sum() используется UTF-16. Хеш считается не от строки, а от массива байтов. Соответственно если реализация хеш-функции правильная (а это скорее всего так), проблема в том, как строка преобразуется в массив байтов.

Ещё, помнится, в универских лабах столкнулся с отличиями в значениях HMAC, полученных CryptoAPI и своей реализацией строго по RFC, но здесь ведь не этот случай. Да и не столь важно, совпадают ли эеши с эталонными. Важнее, чтобы совпадали у отправителя и получателя.

А какова конечная цель?


listvenniza   (2013-08-07 15:58:00) [3]

реализация  GetMd5Sum:

public static string GetMd5Sum(string str)
{
   Encoder encoder = Encoding.Unicode.GetEncoder();
   byte[] bytes = new byte[str.Length * 2];
   encoder.GetBytes(str.ToCharArray(), 0, str.Length, bytes, 0, true);
   byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes);
   StringBuilder builder = new StringBuilder();
   for (int i = 0; i < buffer2.Length; i++)
   {
       builder.Append(buffer2[i].ToString("x2"));
   }
   return builder.ToString();
}


Наверх

Титульная страница Поиск, карта сайта Написать письмо