Реализация MD5 через CryptoAPI

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Реализация MD5 через CryptoAPI

Сообщение Lumen » 10.08.2007 (Пт) 22:23

Всем доброго времени суток!

Пытаюсь разобраться с сабжем. Почему-то когда я читаю файл и передаю его CryptHashData, у меня мд5 хеш считается, но он получается всегда разный... Причем как выяснилось дело именно в чтении из файла, так как если натравить ф-ю CryptHashData на заранее приготовленный массив, то результат получается всегда одинаковый. Как я только не пробовал читать файл, все равно одна и та же борода...

Подскажите пожалуйста в чем может быть проблема.

на всякий случай приведу код, с помощью которого пытаюсь посчитать мд5 хеш файла.
Код: Выделить всё
Dim bResult As Boolean, hProv As Long, hHash As Long, dwHashLen As String, HashResult As String
Dim mes As String
Dim hFile As Long, hSize As Long, farray As Long, bread As Long

hFile = CreateFile("C:\project1.bat", GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
hSize = GetFileSize(hFile, 0)
farray = LocalAlloc(LMEM_ZEROINIT, hSize)
bResult = ReadFile(hFile, ByVal farray, hSize, bread, ByVal 0&)

bResult = CryptAcquireContext(hProv, ByVal vbNullChar, ByVal vbNullChar, PROV_RSA_FULL, 0)
bResult = CryptCreateHash(hProv, CALG_MD5, 0, 0, hHash)
bResult = CryptHashData(hHash, ByVal farray, ByVal hSize, 0)
HashResult = String(16, Chr(0))
bResult = CryptGetHashParam(hHash, HP_HASHVAL, HashResult, 16, 0)

For i = 1 To 16
    mes = mes + Hex(Asc(Mid(HashResult, i, 1)))
Next

MsgBox mes

Clipboard.SetText mes
bResult = CryptDestroyHash(hHash)
bResult = CryptReleaseContext(hProv, 0)
LocalFree farray

Да, и ещё. Хочу реализовать расчет мд5 хеша именно при помощи криптоапи. Без использования сторонних длл. А класс, который выложен на этом сайте меня не устраивает, так как там слишком медленно выполняется расчет (у меня например файл Winword.exe - размер чуть больше 10 мб обсчитывается около 10 секунд).
Подпись проходит рефакторинг

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2007 (Пт) 22:33

LocalAlloc возвращает не указатель, а хендл.
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 10.08.2007 (Пт) 23:18

Попробовал по-другому, теперь вот так считываю файл в массив:
Код: Выделить всё
hFile = CreateFile("C:\project1.bat", GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
hSize = GetFileSize(hFile, 0)
ReDim farray(hSize - 1)
bResult = ReadFile(hFile, farray(0), hSize, bread, ByVal 0&)


А так вызываю CrypthashData:
Код: Выделить всё
bResult = CryptHashData(hHash, farray(0), ByVal hSize, 0)


Результат тот же самый. В чем же проблема? Подскажите плиз...

Added: Ессно farray объявлен теперь как байтовый массив...
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 11.08.2007 (Сб) 3:28

Всё, проблема решена.
Подпись проходит рефакторинг


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 88

    TopList