| ||||
| ||||
Шифрую с помощью 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; } | ||||
Ответы: | ||||
| ||||
Не очень понятно - на какой именно строке в этом примере вылетает? | ||||
| ||||
как оказалось проблема в диалоге PromptForFileName. при повторном его вызове почему то приложение вылетает. странно... | ||||