01.06.2007 12:43:39Verify Sign Ответов: 4
Yuri
Следующий код возвращает 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();
 
Ответы:
01.06.2007 13:40:13Yuri
Кстати, если использовать ключи , что автоматически присваиваються контексту провайдера, то код работает нормально, а как только сразу после 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);

и после как наверху, то не идет верификация. отсюда вывод , что все решаеться при генерации ключей. Может параметры генерации не те ?
01.06.2007 13:50:18Kirill Sobolev
при вызове CryptGenKey не надо указывать CALG_RSA_SIGN | CALG_MD5.
01.06.2007 13:59:35Yuri
Да и без этого попробовал . то же самое.
А ведь работает если самому не генерировать ключи .
В чем причина ?
01.06.2007 14:39:03Kirill Sobolev
Вы подписываете ключом AT_SIGNATURE, а генерите (и видимо проверяете) ключом AT_KEYEXCHANGE - это разные ключи!