Здравствуйте, уважаемые профи! Еще раз прошу прощения, но как новичок в использовании криптоалгаритмов опять прошу помощи. Стоит задача: реализовать шифрование по ГОСТ используя сертификат получателя. Сделал код.
var
pStreamData: TMemoryStream;
MessageArray: array of Pbyte;
SizeArray: array of DWORD;
SizeBuff, SizeBuf1: DWORD;
cert : PCCERT_CONTEXT;
hCertPubKey: HCRYPTKEY;
phProv: HCRYPTPROV;
my: hcertstore;
begin
pStreamData:=TMemoryStream.Create;
try
my := CertOpenSystemStore(0, 'MY');
cert:= CryptUIDlgSelectCertificateFromStore(my, 0, 'Óêàæèòå ñåðòèôèêàò äëÿ øèôðîâàíèÿ', '', 0, 0, nil);
if cert = nil then
begin
CertFreeCertificateContext (cert);
showmessage ('Íå âûáðàí ñåðòèôèêàò');
Exit;
end;
if not CryptAcquireContext(phProv, nil, 'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider', 75,CRYPT_VERIFYCONTEXT) then begin
showmessage ('Íå óäàëîñü ïîëó÷èòü êîíòåêñò êðèïòîïðîâàéäåðà');
Exit;
end;
if not CryptImportPublicKeyInfo(phProv,PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, @cert.pCertInfo.SubjectPublicKeyInfo,hCertPubKey)
then showmessage('Íå óäàëîñü ïîëó÷èòü êëþ÷');
pStreamData.LoadFromFile('d:\sc.txt');
SetLength(MessageArray, 1);
SetLength(SizeArray, 1);
MessageArray[0] := pStreamData.Memory;
SizeArray[0] := pStreamData.Size;
if CryptEncrypt(hCertPubKey,0,true,0, nil,SizeBuff, SizeArray[0]) then
if CryptEncrypt(hCertPubKey,0,true,0, MessageArray[0],SizeBuf1, SizeBuff) then
Begin
pStreamData.SaveToFile('d:\sc.txt.enc');
showmessage ('Åñòü');
end else showmessage (SysErrorMessage(GetLastError))
else showmessage (SysErrorMessage(GetLastError));
finally
CertFreeCertificateContext (cert);
pStreamData.Free;
end;
end;
Функция CryptEncrypt возвращает false showmessage (SysErrorMessage(GetLastError)) - Указан неправильный алгоритм. Часы напряжений, поисков, изучений навели меня на следующий вывод:
CryptEncrypt использовать для таких целей нельзя. Тупик. Может есть мысли.
Спасибо.