21.04.2005 15:47:15CryptEncryptMessage отрабатывает, CryptDecryptMessage - нет :( Ответов: 5
Путин
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 ....
}
..
}

 
Ответы:
22.04.2005 9:29:40Юрий
Более классический вариант (без вспомогательный функций типа "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);
}

То есть предлагаю упростить приведенную Вами функцию. Возможно, что дело именно в вспомогательных процедурах и функциях.
22.04.2005 12:04:15ВВП
Юрий, и Ваш, и пример из MSDN у меня отрабатывают так же. Сертификаты пытаюсь использовать разных CP. Не помогает. Наверное я ламер, пойду повешусь.
22.04.2005 13:53:21Kirill Sobolev
может ключа обмена нет, если подпись создается нормально?
22.04.2005 15:43:57Путин
АААААААА!!! ТОЧНО!!! Вылезаю из петли.
Спасибо, Кирилл!
22.04.2005 15:54:38Юрий
...Как мало нужно человеку для отказа от самоубийства :)