Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CryptoAPI - CryptVerifySignature problem

12K
07 декабря 2006 года
needjava
30 / / 06.10.2006
Здравствуйте уважаемая общественность!
Проблема с функцией CryptVerifySignature!

Я подписываю сообщение.Вот код подписи:
Код:
// сообщение, которое надо подписать содержится в файле dataToSignFile
hFile1 = ::CreateFile (dataToSignFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

// читаем файл в szBuf
DWORD dwFileSize = ::GetFileSize (hFile1, NULL);
char* szBuf = static_cast<char*>(malloc(dwFileSize + 1));
ZeroMemory(szBuf, dwFileSize + 1);
ReadFile (hFile1, szBuf, dwFileSize, &dwRWBytes, NULL);

// получаем размер подписи
DWORD count = 0;
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFileSize, 0);
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &count);
CryptDestroyHash (hHash);

// подписываем сообщение szBuf
// и записываем подпись в файл hFile2
hFile2 = ::CreateFile (resFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
char* sign_hash = static_cast<char*>(malloc(count + 1));
ZeroMemory(sign_hash, count + 1);
CryptCreateHash (hCryptProv, CALG_MD5, 0, 0, &hHash);
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFileSize, 0);
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, (BYTE*)&sign_hash[0], &count);
DWORD dwRWBytes2 = 0;
WriteFile (hFile2, sign_hash, count, &dwRWBytes2, NULL);
CloseHandle (hFile2);

// подписали - все закрываем
CloseHandle (hFile1);
CryptDestroyHash (hHash);


Теперь эту подпись надо проверить:
Проверяем функцией CryptVerifySignature следующим образом:

Код:
// dataToSignFile- файл с исходным сообщением
// resFile - файл с подписанным сообщением dataToSignFile
hFile1 = CreateFile (dataToSignFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hFile2 = CreateFile (resFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

// читаем в szBuf файл с исходным сообщением
DWORD dwRWBytes = 0;
DWORD dwFile1Size = ::GetFileSize (hFile1, NULL);
char* szBuf = static_cast<char*>(malloc(dwFile1Size + 1));
ZeroMemory(szBuf, dwFile1Size + 1);
ReadFile (hFile1, szBuf, dwFile1Size, &dwRWBytes, NULL);

// загоняем в hHash хеш исходного сообщения
CryptHashData (hHash, (BYTE *)&szBuf[0], dwFile1Size, 0);

// читаем в szBuf2 файл с подписанным сообщением
DWORD dwRWBytes2 = 0;
DWORD dwFile2Size = ::GetFileSize (hFile2, NULL);
char* szBuf2 = static_cast<char*>(malloc(dwFile2Size + 1));
ZeroMemory(szBuf2, dwFile2Size + 1);
ReadFile (hFile2, szBuf2, dwFile2Size, &dwRWBytes2, NULL);

// проверяем подпись - ВОТ ЗДЕСЬ КАК РАЗ ПРОБЛЕМА!!!
BOOL signOk = CryptVerifySignature (hHash, (BYTE *)&szBuf2[0], dwFile2Size, hPPKey, NULL, 0);

CloseHandle (hFile1);
CloseHandle (hFile2);


У меня signOk всегда равно 0.(контекст и ключи экпортируются и импортируются - нормально)

Что здесь не так, подскажите! У кого какие мысли?

Спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог