28.10.2005 12:17:17Capicom & MD5 & Delphi Ответов: 2
Yanka
Добрый день!

Я создаю хэш по алгоритму MD5 с помощью CAPICOM. В документации MSDN есть описание как это делать и примерчик на VB.

Вот моя функция.

function MD5Hash(S: string): string;
var
HashData : OleVariant;
begin
HashData := CreateOleObject(’CAPICOM.HashedData’);
try
HashData.Algorithm := 3;
HashData.Hash(S);
Result:= HashData.Value;
except
Result:= ’’;
end;
end;

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

Например:
MD5Hash(’MD5’)=46179971574D2B186392FA3BB94604ED

Тогда как правильный результат (полученный с помощью нескольких других компонентов) совершенно другой:
MD5("MD5") = 7F138A09169B250E9DCB378140907378

Почему? Я что-то делаю не так? Или CAPICOM не подходит для этой цели?

Спасибо.
 
Ответы:
28.10.2005 14:36:08Kirill Sobolev
Проблема в юникоде.
Вы подаете HashedData.Hash юникодную строку, в то время как другие компоненты подают ANSI строку (или просто байтовый буфер). Если "MD5" преобразовать к ANSI а потом посчитать хэш то как раз 7F1..78 и получится.
28.10.2005 15:21:36Yanka
Я передаю обычную ANSI строку. Даже если я просто делаю

HashData := CreateOleObject(’CAPICOM.HashedData’);
HashData.Algorithm := 3;
HashData.Hash(’MD5’);
Result:= HashData.Value;

то результат аналогичный. Как в таком случае нужно преобразовывать строку?
Если передаю массив байт - результат также неверный :-(.