Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI - CryptVerifySignature problem / 4 сообщений из 4, страница 1 из 1
07.12.2006, 15:13
    #34183615
needjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - CryptVerifySignature problem
Здравствуйте уважаемая общественность!
Проблема с функцией 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
07.12.2006, 18:39
    #34184392
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - CryptVerifySignature problem
первая мысль - поставить после BOOL signOk =...
вывод GetLastError и посмотреть код ошибки
...
Рейтинг: 0 / 0
08.12.2006, 15:21
    #34186581
needjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - CryptVerifySignature problem
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
11.12.2006, 17:14
    #34191063
needjava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI - CryptVerifySignature problem
Всем большущее спасибо! Я разобрался — мой был косяк — в функции:
Код: plaintext
1.
CryptGenKey (hCryptProv, AT_KEYEXCHANGE, dwKeyLen | CRYPT_EXPORTABLE, &hPPKey);
 
а должно было быть:

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

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


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