| ||||
| ||||
Добрый вечер! Выполняется следующий код: 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• ), совсем не похожую на хэш. Пожалуйста объясните где я не прав. Заранее Большое спасибо. | ||||
Ответы: | ||||
| ||||
По-моему у тебя лишний вызов функции: CryptGetHashParam(hhash_file, HP_HASHSIZE, NULL, &dwsize_hash, 0); у меня примерное без нее пашет. | ||||
| ||||
Доброе утро! Здесь определяется размер возврашаемого хэша 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); С этим всё правильно. Может быть какие-нибудь ошибки в создании хэша или в процессе последовательного хэширования данных. я не могу понять. Может быть нужно задать начальный вектор для объекта хэша? Кто-нибудь может помочь? Большое спасибо! | ||||
| ||||
А что, по-Вашему, "похоже на хеш"? :-) Хеш - это 32 байта двоичных данных. Просматривать его значение в текстовом редакторе абсолютно бессмысленно. | ||||
| ||||
Даже не знаю как вам объяснить. Но постараюсь. Хэш-это последовательность символов из 32 байт. У меня тоже получается последовательность из 32 байт, но там очень много нулей. Мне кажется что такого быть не должно. А вам как кажется? Может что-то не правильно в моём коде который я приводил? :(. Буду очень признателен если кто-нибудь поможет мне сэтим разобраться! Заранее большое спасибо! | ||||
| ||||
Тогда сообщите параметры вызова CryptAcquireContext | ||||
| ||||
Я использую функцию: CryptAcquireCertificatePrivateKey( certcontext, 0, NULL, &hcryptprov, &dwkeytype, &brelease); dwkeytype=AT_KEYEXCHANGE. сертификат предназначен для шифрования и подписи. | ||||
| ||||
А сертификат ГОСТовый? | ||||
| ||||
Сертификат точно ГОСТовый. Если вы не можете понять в чём дело, тогда небольшая просьба: Не могли бы вы снять хэш с файла в 100 единиц по ГОСТ Р.34.11-1994 (своими средствами) и выложить результат. Чтобы я смог понять когда я добьюсь нужного результата. Большое спасибо. | ||||
| ||||
Меняю файл на хеш. Шлите на e-mail. | ||||
| ||||
Большое спасибо! Вот это похоже на хэш =)). | ||||