30.01.2007 12:12:07проблема с шифрованием Ответов: 2
Александр
Шифрую с помощью CryptEncryptMessage. Возникает проблема при шифровании уже зашифрованных сообщений этой же функцией. Программа вылетает при диалоге выбора файла для шифрования. Код вызова диалога стандартный и не вызывает подозрений в силу своей простоты, поэтому остается грешить только на саму функцию шифрования. Может кто что-нибудь подскажет. Код привожу ниже...

int do_encrypt (char *in_filename, char *out_filename,
PCCERT_CONTEXT pUserCert,pRecCert)
{
DWORD EncryptAlgSize;
CRYPT_ALGORITHM_IDENTIFIER EncryptAlgorithm;
CRYPT_ENCRYPT_MESSAGE_PARA EncryptParams;
HCRYPTPROV hCryptProv = 0; /* Дескриптор провайдера*/
BYTE *tbenc = NULL; /* Данные для шифрования*/
size_t tbenc_len = 0; /* Длина*/
DWORD EncryptParamsSize;
BYTE* pbEncryptedBlob = NULL; /* Зашифрованные данные*/
DWORD cbEncryptedBlob = 0; /* Длина зашифрованных данных*/
BOOL should_release_ctx = 0; /* if FALSE DO NOT Release CTX*/
PCCERT_CONTEXT pRecipientCerts[MAX_ADD_SENDERS]; /* Сертификаты получателей*/
int ret = 0; /* статус возврата*/
DWORD keytype = 0;
int i;

/*--------------------------------------------------------------------*/
/* читаем файл для шифрования*/
ret = get_file_data_pointer (in_filename, &tbenc_len, &tbenc);
if (! ret) GenerateError("Cannot read input file.");


/*--------------------------------------------------------------------*/
/* инициализируем контекст, использую свой сертификат*/
ret = CryptAcquireCertificatePrivateKey(pUserCert,0,NULL,&hCryptProv,
&keytype, &should_release_ctx);

if (!ret) {
GenerateError("Cryptographic context could not be acquired.");
}

// Указываем получателей сообщения
pRecipientCerts[0]=pRecCert;
int recipient_cnt=1;

/*--------------------------------------------------------------------*/
/* Инициализируем структуру описания алгоритма */

EncryptAlgSize = sizeof(CRYPT_ALGORITHM_IDENTIFIER);
memset(&EncryptAlgorithm, 0, EncryptAlgSize);

/*--------------------------------------------------------------------*/
/* Устанавливаем алгоритм шифрования данных*/

EncryptAlgorithm.pszObjId = szOID_CP_GOST_28147;

/*--------------------------------------------------------------------*/
/* Инициализируем параметры структуры CRYPT_ENCRYPT_MESSAGE_PARA */

EncryptParamsSize = sizeof(EncryptParams);
memset(&EncryptParams, 0, EncryptParamsSize);
EncryptParams.cbSize = EncryptParamsSize;

EncryptParams.dwMsgEncodingType = ENC_TYPE;

EncryptParams.hCryptProv = hCryptProv;
EncryptParams.ContentEncryptionAlgorithm = EncryptAlgorithm;

/*--------------------------------------------------------------------*/
/* Вызов CryptEncryptMessage для определения длины шифрованных данных*/

if(!CryptEncryptMessage(
&EncryptParams,
recipient_cnt,
pRecipientCerts,
tbenc,
tbenc_len,
NULL,
&cbEncryptedBlob))
{
GenerateError( "Getting EncrypBlob size failed.");
}
/*--------------------------------------------------------------------*/
/* Резервируем память для шифрованных данных*/
pbEncryptedBlob = (BYTE*)malloc(cbEncryptedBlob);

if(!pbEncryptedBlob)
GenerateError("Memory allocation error while encrypting.");

/*--------------------------------------------------------------------*/
/* Вызов CryptEncryptMessage для шифрования данных*/

ret = CryptEncryptMessage(
&EncryptParams,
recipient_cnt,
pRecipientCerts,
tbenc,
tbenc_len,
pbEncryptedBlob,
&cbEncryptedBlob);

if (!ret)
GenerateError("Невозможно зашифровать");


if (ret && out_filename) {
ret = write_file (out_filename, cbEncryptedBlob, pbEncryptedBlob);
ShowMessage("Сообщение зашифровано успешно") ;
}

/*--------------------------------------------------------------------*/
/* Очистка памяти*/


if (should_release_ctx) {
if(hCryptProv)
{
CryptReleaseContext(hCryptProv,0);
}
}

release_file_data_pointer (tbenc);
if (pbEncryptedBlob) free (pbEncryptedBlob);

return ret;
}
 
Ответы:
30.01.2007 13:26:35Kirill Sobolev
Не очень понятно - на какой именно строке в этом примере вылетает?
30.01.2007 13:36:34Александр
как оказалось проблема в диалоге PromptForFileName. при повторном его вызове почему то приложение вылетает. странно...