Спасибо за ответ. Вот вся процедура:
....
if not CryptAcquireContext(@hProv, nil,
'Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider', 75,
CRYPT_VERIFYCONTEXT) then
begin
InFileName := 'Провайдер не найден';
Result := False;
Exit;
end;
hStoreHandle := CertOpenSystemStore(hProv, 'AddressBook');
enctype := X509_ASN_ENCODING OR PKCS_7_ASN_ENCODING;
FileStream := TMemoryStream.Create;
try
FileStream.LoadFromFile( InFileName );
{Массив сертификатов получателей}
try
arCertContext := TMemoryStream.Create;
MyName := 'Сертификат1';
GetMem(pSignerName,2*Length(MyName)+1);
StringToWideChar(MyName, pSignerName, 2*Length(MyName)+1);
pSignerCert := CertFindCertificateInStore(hStoreHandle, enctype, 0, CERT_FIND_SUBJECT_STR, pSignerName, nil);
if pSignerCert <> nil then begin
arCertContext.SetSize( arCertContext.Size + SizeOf( Pointer ));
TPointerList( arCertContext.Memory^ )[0] := PCCERT_CONTEXT( pSignerCert );
end;
MyName := 'Сертификат2';
GetMem(pSignerName,2*Length(MyName)+1);
StringToWideChar(MyName, pSignerName, 2*Length(MyName)+1);
pSignerCert := CertFindCertificateInStore(hStoreHandle, enctype, 0, CERT_FIND_SUBJECT_STR, pSignerName, nil);
if pSignerCert <> nil then begin
arCertContext.SetSize( arCertContext.Size + SizeOf( Pointer ));
TPointerList( arCertContext.Memory^ )[1] := PCCERT_CONTEXT( pSignerCert );
end;
CertCount := 2;
try
ZeroMemory( @EncParams, SizeOf( CRYPT_ENCRYPT_MESSAGE_PARA ));
EncParams.cbSize := SizeOf( CRYPT_ENCRYPT_MESSAGE_PARA );
EncParams.dwMsgEncodingType := X509_ASN_ENCODING OR PKCS_7_ASN_ENCODING;
EncParams.ContentEncryptionAlgorithm.pszObjId := szOID_CP_GOST_28147;
EncParams.hCryptProv := hProv;
cbEncrypted := 0;
CryptEncryptMessage( @EncParams, CertCount, arCertContext.Memory, FileStream.Memory, FileStream.Size, nil, @cbEncrypted );
if cbEncrypted > 0 then
begin
Stream := TMemoryStream.Create;
try
Stream.SetSize( cbEncrypted );
CryptEncryptMessage( @EncParams, CertCount, arCertContext.Memory, FileStream.Memory, FileStream.Size, Stream.Memory, @cbEncrypted );
Stream.SaveToFile( InFileName + '.enc' );
finally
Stream.Free;
end;
end
else
begin
ShowMessage('При шифровании документа возникла ошибка определения размера зашифрованного документа');
end;
finally
{Высвобождаем ссылки на сертификаты}
for i := 0 to 1 do
CertFreeCertificateContext(TPointerList( arCertContext.Memory^ )[i]);
end;
finally
end;
finally
FileStream.Free;
CertCloseStore(hStoreHandle, 0);
end;
Там 2 сертификата. ЭТОТ ЖЕ код один в один в Delphi BDS 2006 работает безупречно. Проблемы начинаются в RAD Studio XE2... Не знаю почему.