| ||||
| ||||
CryptDecryptMessage выдает NTE_BAD_KEY. В чём может быть дело? Сертификат есть, в MY, ключ к нему тоже есть /*подпсись сделать удаётся*/, но вот CryptDecryptMessage обламывает. HELP! SecurityResult * SecurityHelper::decryptPWD(const char* _encrypted_pwd) { FromB64 epwd(_encrypted_pwd); HCERTSTORE CertStoreArray[] = {MY_SIGNATURE::get_store("MY")}; CRYPT_DECRYPT_MESSAGE_PARA DecryptParams; DWORD DecryptParamsSize = sizeof(DecryptParams); memset(&DecryptParams, 0, DecryptParamsSize); DecryptParams.cbSize = DecryptParamsSize; DecryptParams.dwMsgAndCertEncodingType = MY_TYPE; DecryptParams. cCertStore = 1; DecryptParams.rghCertStore = CertStoreArray; byte * bres = NULL; DWORD cres = 0; if(!CryptDecryptMessage(&DecryptParams, epwd.get_bytes(), epwd.get_len(), NULL, &cres, NULL)) return ....; bres = new byte[cres]; if(!CryptDecryptMessage( &DecryptParams, epwd.get_bytes(), epwd.get_len(), bres, &cres, NULL)) { //ИДЁТ СЮДА delete [] bres; return .... } .. } | ||||
Ответы: | ||||
| ||||
Более классический вариант (без вспомогательный функций типа "get_bytes"): void HighLevel_Decrypt(BYTE* encrypted, DWORD count) { std::cout<<std::endl; std::cout<<" High-level decrypt "<<std::endl; std::cout<<"================================"<<std::endl; HCERTSTORE hSystemStore; if(!(hSystemStore = CertOpenSystemStore(NULL,"MY"))) { Error("CertOpenSystemStore"); return; } std::cout<<"System store is opened"<<std::endl; // Инициализация структуры, необходимой для расшифрования CRYPT_DECRYPT_MESSAGE_PARA DecryptPara; ZeroMemory(&DecryptPara,sizeof(DecryptPara)); DecryptPara.cbSize=sizeof(DecryptPara); DecryptPara.dwMsgAndCertEncodingType=X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; HCERTSTORE StoreArray[]={hSystemStore}; DecryptPara.cCertStore=1; DecryptPara.rghCertStore=StoreArray; DWORD dwSize=0; if(!CryptDecryptMessage(&DecryptPara,encrypted,count,NULL,&dwSize,NULL)) { Error("CryptDecryptMessage"); return; } BYTE* decrypted=static_cast<BYTE*>(malloc(dwSize+1)); ZeroMemory(decrypted,dwSize+1); if(!CryptDecryptMessage(&DecryptPara,encrypted,count,decrypted,&dwSize,NULL)) { Error("CryptDecryptMessage"); return; } std::cout<<"Decryption completed"<<std::endl; std::cout<<"Result string: "<<decrypted<<std::endl; // Освобождение контекста локальных переменных free(decrypted); free(encrypted); CertCloseStore(hSystemStore,0); } То есть предлагаю упростить приведенную Вами функцию. Возможно, что дело именно в вспомогательных процедурах и функциях. | ||||
| ||||
Юрий, и Ваш, и пример из MSDN у меня отрабатывают так же. Сертификаты пытаюсь использовать разных CP. Не помогает. Наверное я ламер, пойду повешусь. | ||||
| ||||
может ключа обмена нет, если подпись создается нормально? | ||||
| ||||
АААААААА!!! ТОЧНО!!! Вылезаю из петли. Спасибо, Кирилл! | ||||
| ||||
...Как мало нужно человеку для отказа от самоубийства :) | ||||