30.06.2004 12:21:54CryptSignAndEncryptMessage Ответов: 0
Kiwi
Уважаемые Паганини шифрования. Не могли бы вы помочь вот с какой проблеммой. Пишу на дельфи. Версия CryptoPro 2.0 (Build 2049). Расшифровка и проверка подписи выполняется без проблемм, а вот шифрование с подписью работает как-то странно. Иногда через раз иногда реже, но для того, чтобы удачно зашифровать, требуется выполнять какие-то магические пассы.
Не подскажете, с чем это может быть связано?
Вот код, который я выполняю:
pSignPara^.dwMsgEncodingType:= PKCS_7_ASN_ENCODING;
pSignPara^.pSigningCert:= aSenderCertContext;
pSignPara^.HashAlgorithm.pszObjId:= szOID_CP_GOST_R3411_R3410EL;
pSignPara^.HashAlgorithm.Parameters.cbData:= 0;
pSignPara^.pvHashAuxInfo:= nil;
pSignPara^.cMsgCert:= 0; pSignPara^.rgpMsgCert:= nil;
pSignPara^.cAuthAttr:= 0;
pSignPara^.dwInnerContentType:= 0;
pSignPara^.cMsgCrl:= 0;
pSignPara^.cUnauthAttr:= 0;
pSignPara^.dwFlags:= 0;
pSignPara^.pvHashAuxInfo:= nil;
pSignPara^.rgAuthAttr:= nil;
pSignPara^.cbSize:= SizeOf(CRYPT_SIGN_MESSAGE_PARA);
pEncryptPara^.hCryptProv:= 0;
pEncryptPara^.dwMsgEncodingType:= PKCS_7_ASN_ENCODING;
pEncryptPara^.ContentEncryptionAlgorithm.pszObjId:= szOID_CP_GOST_28147;
pEncryptPara^.dwFlags:= 0;
pEncryptPara^.dwInnerContentType:= 0;
pEncryptPara^.pvEncryptionAuxInfo:= nil;
pEncryptPara^.cbSize:= SizeOf(CRYPT_ENCRYPT_MESSAGE_PARA);

AssignFile(f, aInFileName);
AssignFile(DestF, aOutFileName);
Reset(F);
Rewrite(DestF);
dwCount:= FileSize(f);
GetMem(pbBuffer, dwCount);
BlockRead(f, pbBuffer^, dwCount);
CryptSignAndEncryptMessage(pSignPara,
pEncryptPara,
1,
@aRecipientCertContext,
pbBuffer,
dwCount,
nil,
dwEncryptedCount);
GetMem(pbEncryptedBuffer, dwEncryptedCount);
if CryptSignAndEncryptMessage(pSignPara,
pEncryptPara,
1,
@aRecipientCertContext,
pbBuffer,
dwCount,
pbEncryptedBuffer,
dwEncryptedCount)
then begin
result:= true;
BlockWrite(DestF, pbEncryptedBuffer^, dwEncryptedCount);
end;

Разумеется, память под структуры pSignPara и pEncryptPara выделяю, и т.д. Да это и не вызывает особых сомнений, поскольку функция выполняется!!! только не всегда :-).
GetLastError выдает следующее: "Внутренняя ошибка"
Спасибо за помощь.