10.06.2004 16:52:20Помогите с Хэшем файла Ответов: 10
Александр
Добрый вечер!
Выполняется следующий код:
CryptCreateHash(hcryptprov, CertOIDToAlgId("1.2.643.2.2.9"), 0, 0, &hhash_file);

infile = open(infile_name, _O_RDONLY|_O_BINARY);
outfile = open(outfile_name, _O_CREAT|_O_WRONLY|_O_BINARY);

while (!eof(infile))
{

buffer = new BYTE[32];
nbytesread = read(infile, buffer, 32);
CryptHashData(hhash_file, buffer, nbytesread, 0);

delete[] buffer;

}
CryptGetHashParam(hhash_file, HP_HASHSIZE, NULL, &dwsize_hash, 0);

pbhash = new BYTE[dwsize_hash];

CryptGetHashParam(hhash_file, HP_HASHVAL, pbhash, &dwsize_hash, 0);

write(outfile, pbhash, dwsize_hash);

delete[] pbhash;

close(infile);
close(outfile);

В выходном файле получаем какую-то ерунду ( x•   x• x• ),
совсем не похожую на хэш.
Пожалуйста объясните где я не прав.
Заранее Большое спасибо.
 
Ответы:
10.06.2004 17:53:38chip
По-моему у тебя лишний вызов функции:
CryptGetHashParam(hhash_file, HP_HASHSIZE, NULL, &dwsize_hash, 0);
у меня примерное без нее пашет.
11.06.2004 10:45:38Александр
Доброе утро!
Здесь определяется размер возврашаемого хэша
CryptGetHashParam(hhash_file, HP_HASHSIZE, NULL, &dwsize_hash, 0);
Здесь выделяется область памяти
pbhash = new BYTE[dwsize_hash];
Здесь возвращается само значение хэша
CryptGetHashParam(hhash_file, HP_HASHVAL, pbhash, &dwsize_hash, 0);
Здесь хэш записывается в файл.
write(outfile, pbhash, dwsize_hash);
С этим всё правильно.
Может быть какие-нибудь ошибки в создании хэша или в процессе последовательного хэширования данных.
я не могу понять. Может быть нужно задать начальный вектор для объекта хэша? Кто-нибудь может помочь?
Большое спасибо!
11.06.2004 14:29:06Василий
А что, по-Вашему, "похоже на хеш"? :-)
Хеш - это 32 байта двоичных данных. Просматривать его значение в текстовом редакторе абсолютно бессмысленно.
11.06.2004 15:16:35Александр
Даже не знаю как вам объяснить.
Но постараюсь.
Хэш-это последовательность символов из 32 байт.
У меня тоже получается последовательность из 32 байт, но там очень много нулей. Мне кажется что такого быть не должно. А вам как кажется? Может что-то не правильно в моём коде который я приводил? :(.
Буду очень признателен если кто-нибудь поможет мне сэтим разобраться!
Заранее большое спасибо!
11.06.2004 15:24:52Василий
Тогда сообщите параметры вызова CryptAcquireContext
11.06.2004 15:33:28Александр
Я использую функцию:
CryptAcquireCertificatePrivateKey(
certcontext, 0, NULL, &hcryptprov, &dwkeytype, &brelease);
dwkeytype=AT_KEYEXCHANGE.
сертификат предназначен для шифрования и подписи.
11.06.2004 15:43:36Василий
А сертификат ГОСТовый?
11.06.2004 15:51:15Александр
Сертификат точно ГОСТовый.
Если вы не можете понять в чём дело, тогда небольшая просьба:
Не могли бы вы снять хэш с файла в 100 единиц по ГОСТ Р.34.11-1994 (своими средствами) и выложить результат. Чтобы я смог понять когда я добьюсь нужного результата.
Большое спасибо.
11.06.2004 16:05:40Василий
Меняю файл на хеш. Шлите на e-mail.
11.06.2004 16:55:52Александр
Большое спасибо!
Вот это похоже на хэш =)).