powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI - CryptVerifySignature problem
4 сообщений из 4, страница 1 из 1
CryptoAPI - CryptVerifySignature problem
    #34183615
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемая общественность!
Проблема с функцией CryptVerifySignature!

Я подписываю сообщение.Вот код подписи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
// сообщение, которое надо подписать содержится в файле 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 следующим образом:

[/SRC c++]
// 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);
[/src]
У меня signOk всегда равно 0.(контекст и ключи экпортируются и импортируются - нормально)

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

Спасибо.
...
Рейтинг: 0 / 0
CryptoAPI - CryptVerifySignature problem
    #34184392
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
первая мысль - поставить после BOOL signOk =...
вывод GetLastError и посмотреть код ошибки
...
Рейтинг: 0 / 0
CryptoAPI - CryptVerifySignature problem
    #34186581
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GetLastError — вызывал — выдает — неправильная подпись
hash естественно тоже создается, просто не стал весь код постить сразу:
Вот код где создается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
bRes = CryptAcquireContext (&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL,  0 );
if (!bRes) {
   bRes = CryptAcquireContext (&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
}
// Load public key
...
// Import public key
...
// Create hash
CryptCreateHash (hCryptProv, CALG_MD5,  0 ,  0 , &hHash);
...
Рейтинг: 0 / 0
CryptoAPI - CryptVerifySignature problem
    #34191063
needjava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большущее спасибо! Я разобрался — мой был косяк — в функции:
Код: plaintext
1.
CryptGenKey (hCryptProv, AT_KEYEXCHANGE, dwKeyLen | CRYPT_EXPORTABLE, &hPPKey);
 
а должно было быть:

Код: plaintext
1.
CryptGenKey (hCryptProv, AT_SIGNATURE, dwKeyLen | CRYPT_EXPORTABLE, &hPPKey);
 

Как раз поэтому у меня функции шифрования/расшифрования и работали, а подпись нет .
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI - CryptVerifySignature problem
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]