Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Rand  
#1 Оставлено : 28 июля 2009 г. 13:36:21(UTC)
Rand

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.07.2009(UTC)
Сообщений: 4

Добрый день! Подскажите плз. Возникла у меня своеобразная задача. Нужно было хэшировать некие массивы данных с помошью крипто про провайдера. Воспользовался насколько я понял стандартной схемой хэширования с использованием функций
CryptCreateHash;
CryptHashData;
CryptGetHashParam.

для инициализации контекста криптопровайдера использовал
CryptAcquireContext(@hProv, nil, PChar(ProvName), ProvType, CRYPT_VERIFYCONTEXT)
а для первичной инициализации хэш-объекта
CryptCreateHash(hProv, CALG_GOST_3411_94, 0, 0, @hash)

с параметрами
const
CALG_GOST_3411_94 = 32798;
ProvName = 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider';
ProvType = 75;

Потом возвращаю хэш в десятичной форме.
вроде бы все работает. Но возвращаются для одинаковых значений разные значения хэша.
Насколько я понимаю это неправильно. В чем может быть проблема?
Offline Kirill Sobolev  
#2 Оставлено : 28 июля 2009 г. 15:58:25(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
конечно неправильно. проблема скорее всего в передаче хешируемых данных. если убрать массив данных а просто хешировать константный двоичный массив, прошитый в коде - при каждом запуске будет в итоге разное значение?
Техническую поддержку оказываем тут
Наша база знаний
Offline Rand  
#3 Оставлено : 28 июля 2009 г. 17:27:03(UTC)
Rand

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.07.2009(UTC)
Сообщений: 4

когда просто передаю строку в качестве значения в функцию, которая возвращает хэш, чаще всего возвращает одно значение. Но которое тоже периодически меняется. Но систему этих изменений никак не уловлю. Попробовал на всякий случай криптопровайдер Crypto-Pro GOST R 34.10-94 Cryptographic Service Provider. Все тоже самое.
Offline Kirill Sobolev  
#4 Оставлено : 28 июля 2009 г. 17:48:52(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
проблема точно не в криптопровайдере.
можно на код от CryptAcquireContext до CryptGetHashParam посмотреть?
Техническую поддержку оказываем тут
Наша база знаний
Offline Rand  
#5 Оставлено : 28 июля 2009 г. 18:17:47(UTC)
Rand

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.07.2009(UTC)
Сообщений: 4

Писал на дельфи используя библиотеку wcrypt2
Примерно так вызывал.

GetCrypto;
...
OutCrypto(InStr);
...
CryptoRelease;

// инициализации контекста криптопровайдера
procedure BaseThread.GetCrypto;
var err: string;
begin
if not CryptAcquireContext(@hProv, nil, PChar(ProvName), ProvType, CRYPT_VERIFYCONTEXT) then
begin
{
case int64(GetLastError) of
обработка ошибок
}
end;
end;

ну и сама функция для возврата хэша

function BaseThread.OutCrypto(InStr: string): String;
var
hash: HCRYPTHASH;
hashSize, DataSize: DWORD;
err, sHash : string;
i: integer;
pbHash: PByte;
begin
Result := '';
if not CryptCreateHash(hProv, CALG_GOST_3411_94, 0, 0, @hash) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_NOT_ENOUGH_MEMORY: err := 'ERROR_NOT_ENOUGH_MEMORY';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_KEY: err := 'NTE_BAD_KEY';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Error of CryptCreateHash: '+err,
mtError, [mbOK], 0);
exit;
end;
if not CryptHashData(hash, @InStr, length(InStr), 0) then
begin
case int64(GetLastError) of
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_HASH_STATE: err := 'NTE_BAD_HASH_STATE';
NTE_BAD_KEY: err := 'NTE_BAD_KEY';
NTE_BAD_LEN: err := 'NTE_BAD_LEN';
NTE_BAD_UID: err := 'NTE_BAD_UID';
NTE_FAIL: err := 'NTE_FAIL';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
else err := 'Unknown error';
end;
MessageDlg('Error of CryptHashData: '+err,
mtError, [mbOK], 0);
exit;
end;
DataSize := SizeOf(DataSize);
if not CryptGetHashParam(hash,HP_HASHSIZE, @hashSize, @DataSize, 0) then
MessageDlg('Error of CryptGetHashParam: '+ IntToStr(GetLastError),
mtError, [mbOK], 0);
sHash:= '';
GetMem(pbHash, hashSize); // выделяем память для переменной
if CryptGetHashParam(hash,HP_HASHVAL,pbHash, @hashSize,0) then // получаем хеш
begin
for I := 0 to hashSize - 1 do // выводим хеш
sHash:=sHash+Format('%d', [Ord(PAnsiChar(pbHash)[I])]);
Result := sHash;
end;
FreeMem(pbHash); // освобождаем переменную
if not CryptDestroyHash(hash) then
begin
case int64(GetLastError) of
ERROR_BUSY: err := 'ERROR_BUSY';
ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
NTE_BAD_HASH: err := 'NTE_BAD_HASH';
NTE_BAD_UID: err := 'NTE_BAD_UID';
else err := 'Unknown error';
end;
MessageDlg('Error of CryptDestroyHash: '+err,
mtError, [mbOK], 0);
exit;
end;
end;
Offline Kirill Sobolev  
#6 Оставлено : 28 июля 2009 г. 19:41:57(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
InStr: string - в дельфи на самом деле это структура, и хешируете Вы неизвестно что.
Вам нужен такой вызов
CryptHashData(hash, @InStr[1], length(InStr), 0);
Техническую поддержку оказываем тут
Наша база знаний
Offline mick  
#7 Оставлено : 28 июля 2009 г. 19:51:26(UTC)
mick

Статус: Участник

Группы: Участники
Зарегистрирован: 15.04.2009(UTC)
Сообщений: 15
Откуда: no

Можно просто PChar(string)
так как string это уже и так указатель
Offline Rand  
#8 Оставлено : 28 июля 2009 г. 20:34:32(UTC)
Rand

Статус: Новичок

Группы: Участники
Зарегистрирован: 27.07.2009(UTC)
Сообщений: 4

CryptHashData(hash, @InStr[1], length(InStr), 0);
да такой вариант вызова похоже работает корректно. Меня смутило, что когда фиксированное значение посылаю одинаковый хэш возвращал..
Спасибо всем за помощь)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.