Писал на дельфи используя библиотеку 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;