10.11.2006 11:36:07Подскажите пожалуйста! Ответов: 12
DarkF0x
Добрый День славное сообщество программеров!
В первый раз возникла необходимость работать с криптопровайдерами, ну и конечно повылезало целая куча геммор....ев, вроде бы все понятно, но....
Вообщем так - есть хранилище ключей, причем через CryptoPro CSP это хранилице прекрасно видно и более того все ключики в нем есть! Но программно почему-то достучаться до ключей я не могу!
Вот исходничек:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

#include <windows.h>
#include <stdio.h>
#include <wincrypt.h>

#pragma comment (lib, "Crypt32.lib")
#pragma comment (lib, "Advapi32.lib")

int main(int carg,LPSTR* args)
{
DWORD namesize;
DWORD provtype;
char provName[255];

int i = 0;
while (CryptEnumProviders(i, 0, 0, &provtype, 0,
&namesize))
{
if (CryptEnumProviders(i, 0, 0, &s, provName,
namesize))
{
printf("%s : \n", provName);

HCRYPTPROV hProv = NULL;

if (CryptAcquireContext(&hProv, 0, provName,
s,
CRYPT_VERIFYCONTEXT))
{

HCRYPTKEY hPublicKey = NULL;

if (CryptGetUserKey(hProv,
AT_SIGNATURE |
AT_KEYEXCHANGE,
&hPublicKey))
printf("Get Keys\n");
else
{
char err_message[255];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT),
(LPTSTR) err_message,
sizeof(err_message), NULL );

CharToOem(err_message,err_message);
printf("%s\n",err_message);
}



}
CryptReleaseContext(hProv, 0);
}
i++;
}
return 0;
};

Контекст получается нормально, а вот функция CryptGetUserKey маниакально всегда возвращает, что Ключи не найдены!
Хотя ключики в хранилище есть! Вопрос : Как все таки ключи получить из хранилища?
 
Ответы:
10.11.2006 11:39:02DarkF0x
В теле исходника, где описан вызов CryptAcquireContext вместо s конечно переменная provtype.. =)
10.11.2006 12:04:04Василий
Флажком CRYPT_VERIFYCONTEXT Вы и говорите криптопровайдеру, что НЕ требуется доступ к секретным ключам.
10.11.2006 12:12:23DarkF0x
А какой тогда флаг нужно установить?
10.11.2006 12:15:31DarkF0x
Вообще мне нужен открытый ключ из контейнера! Я буду сравнивать ЭЦП...
10.11.2006 12:29:07Василий
А можно подробнее постановку задачи?
М.б. и не придётся брать ключ из контейнера.
Для проверки подписи НЕ требуется секретный ключ
10.11.2006 12:43:51DarkF0x
Да конечно... Вообщем все просто, есть данные которые подписываются ЭЦП, ЭЦП генерируется из хеша значения нужных данных и закрытого ключа. Моя прога должна проверить целостность полученных данных, то есть взять хеш значение нужных полей + открытый ключ из контейнера и сравнить ЭЦП полученный с данными и тот что я получу. По идее мне закрытый ключ нафиг не нужен, но самое интересное, что я не могу открытый ключ получить из контейнера! Хотя он там естб, его видно в CryptoPro CSP. С хешем все понятно как его получать, а вот открытый ключ не получается получить!
10.11.2006 14:22:13Василий
Чуть понятнее. Хотя и не совсем.
Обычно, схема такая (если не используются сертификаты открытых ключей).
Субъект А подписывает данные своим секретным ключом, передаёт субъекту Б сами данные, значение подписи (64 байта) и свой открытый ключ (экспортированный в блоб).
Субъект Б получает от субъекта А сами данные, значение подписи и открытый ключ (экспортированный в блоб) и использует их для проверки подписи. При этом никаких секретных ключей не нужно.
10.11.2006 16:06:40DarkF0x
так в том-то и дело, что у нас стоит центр сертификации, создается сертификат и пара ключей... Закрытый остается с одной стороны, открытый с другой... Я использую открытый ключ, хочу его взять из контейнера, мне не нужно, чтобы мне передавали открытый ключ, он у меня уже есть, да и обмен ключами больше похож на сессионные ключи, у нас пара уже есть, просто я не могу получить из этой пары открытый ключ, контейнер мне его не отдает, пишет что ключа нет!
10.11.2006 16:54:07Василий
Если есть сертификат - зачем открывать контейнер??? В сертификате есть открытый ключ
10.11.2006 17:05:46darkf0x
Ага.... Вот... А как достучаться до сертификата и ключа в нем?
10.11.2006 17:35:38Василий
Т.е. при проверке подписи сертификат будете вытаскивать из контейнера секретного ключа?
Это значит, что вы имеете контейнер с ключом, с помощью которого подпись делалась. А это значит, что вы автор подписи. Так на фига проверять собственную подпись? Ведь подпись удостоверяет авторство того, кто подписал.
13.11.2006 9:06:41DarkF0x
Мда... Тухляк полный! Для особо одаренных: Есть две проги, стоят на разных тачках, одна прога подписывает, другая проверяет подпись, подписанный документ пожет быть изменен в процессе передачи по каналам связи, для этого мне и нужно аутентифицировать документ, на данном этапе мне нужно хотя бы из контейнера ключи достать!!! Больше пока ничего не надо, а я не могу их достать, хотя открытые ключи там ЕСТЬ! Че не понятно? Вопрос простой : Почему все время возвращается ошибка, что ключей нет, хотя они там точно есть! такой вопрос уже поднимался на этом форуме, но остался без ответа!