| ||||
| ||||
Следующий код возвращает 0x80090006 = Invalid Signature в чем ошибка , ведь подпись проходит нормально, и только во время верификации что то не то RCODE(CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)); RCODE(CryptImportKey(hProv, arrPrivateKey, lenPrivateKey, 0, 0, &hRKey)); RCODE(CryptImportKey(hProv, arrPublicKey, lenPublicKey, 0, 0, &hBKey)); RCODE(CryptCreateHash( hProv, CALG_MD5, 0, 0, &hHash)); RCODE(CryptHashData( hHash, (PBYTE)arrInOutEncryptData, lenInOutEncryptData, 0 )); LPCTSTR sDescription = ""; //(char*)a_pPassword; RCODE(CryptSignHash(hHash, AT_SIGNATURE, TEXT(""), 0, NULL, &dwSigLen)); if ( dwSigLen ) pbSignature = new BYTE[dwSigLen]; RCODE(CryptSignHash(hHash, AT_SIGNATURE, sDescription, 0, pbSignature, &dwSigLen)); RCODE(CryptVerifySignature(hHash, pbSignature, dwSigLen, hBKey, sDescription, 0)); DWORD dwERR = GetLastError(); | ||||
Ответы: | ||||
| ||||
Кстати, если использовать ключи , что автоматически присваиваються контексту провайдера, то код работает нормально, а как только сразу после CryptAcquireContext выполняю CryptGenKey(hProv, AT_KEYEXCHANGE | CALG_RSA_SIGN | CALG_MD5, (dwKeyLen << 16) | CRYPT_EXPORTABLE , &hKey); CryptGetUserKey(hProv, AT_KEYEXCHANGE , &hXchgKey); // AT_KEYEXCHANGE CryptExportKey(hXchgKey, NULL, PUBLICKEYBLOB, 0, NULL, &m_bkPublic.dwLength); m_bkPublic.pKey = new BYTE[m_bkPublic.dwLength]; CryptExportKey(hXchgKey, 0, PUBLICKEYBLOB, 0, m_bkPublic.pKey, &m_bkPublic.dwLength); и после как наверху, то не идет верификация. отсюда вывод , что все решаеться при генерации ключей. Может параметры генерации не те ? | ||||
| ||||
при вызове CryptGenKey не надо указывать CALG_RSA_SIGN | CALG_MD5. | ||||
| ||||
Да и без этого попробовал . то же самое. А ведь работает если самому не генерировать ключи . В чем причина ? | ||||
| ||||
Вы подписываете ключом AT_SIGNATURE, а генерите (и видимо проверяете) ключом AT_KEYEXCHANGE - это разные ключи! | ||||