| ||||
| ||||
Добрый День славное сообщество программеров! В первый раз возникла необходимость работать с криптопровайдерами, ну и конечно повылезало целая куча геммор....ев, вроде бы все понятно, но.... Вообщем так - есть хранилище ключей, причем через 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 маниакально всегда возвращает, что Ключи не найдены! Хотя ключики в хранилище есть! Вопрос : Как все таки ключи получить из хранилища? | ||||
Ответы: | ||||
| ||||
В теле исходника, где описан вызов CryptAcquireContext вместо s конечно переменная provtype.. =) | ||||
| ||||
Флажком CRYPT_VERIFYCONTEXT Вы и говорите криптопровайдеру, что НЕ требуется доступ к секретным ключам. | ||||
| ||||
А какой тогда флаг нужно установить? | ||||
| ||||
Вообще мне нужен открытый ключ из контейнера! Я буду сравнивать ЭЦП... | ||||
| ||||
А можно подробнее постановку задачи? М.б. и не придётся брать ключ из контейнера. Для проверки подписи НЕ требуется секретный ключ | ||||
| ||||
Да конечно... Вообщем все просто, есть данные которые подписываются ЭЦП, ЭЦП генерируется из хеша значения нужных данных и закрытого ключа. Моя прога должна проверить целостность полученных данных, то есть взять хеш значение нужных полей + открытый ключ из контейнера и сравнить ЭЦП полученный с данными и тот что я получу. По идее мне закрытый ключ нафиг не нужен, но самое интересное, что я не могу открытый ключ получить из контейнера! Хотя он там естб, его видно в CryptoPro CSP. С хешем все понятно как его получать, а вот открытый ключ не получается получить! | ||||
| ||||
Чуть понятнее. Хотя и не совсем. Обычно, схема такая (если не используются сертификаты открытых ключей). Субъект А подписывает данные своим секретным ключом, передаёт субъекту Б сами данные, значение подписи (64 байта) и свой открытый ключ (экспортированный в блоб). Субъект Б получает от субъекта А сами данные, значение подписи и открытый ключ (экспортированный в блоб) и использует их для проверки подписи. При этом никаких секретных ключей не нужно. | ||||
| ||||
так в том-то и дело, что у нас стоит центр сертификации, создается сертификат и пара ключей... Закрытый остается с одной стороны, открытый с другой... Я использую открытый ключ, хочу его взять из контейнера, мне не нужно, чтобы мне передавали открытый ключ, он у меня уже есть, да и обмен ключами больше похож на сессионные ключи, у нас пара уже есть, просто я не могу получить из этой пары открытый ключ, контейнер мне его не отдает, пишет что ключа нет! | ||||
| ||||
Если есть сертификат - зачем открывать контейнер??? В сертификате есть открытый ключ | ||||
| ||||
Ага.... Вот... А как достучаться до сертификата и ключа в нем? | ||||
| ||||
Т.е. при проверке подписи сертификат будете вытаскивать из контейнера секретного ключа? Это значит, что вы имеете контейнер с ключом, с помощью которого подпись делалась. А это значит, что вы автор подписи. Так на фига проверять собственную подпись? Ведь подпись удостоверяет авторство того, кто подписал. | ||||
| ||||
Мда... Тухляк полный! Для особо одаренных: Есть две проги, стоят на разных тачках, одна прога подписывает, другая проверяет подпись, подписанный документ пожет быть изменен в процессе передачи по каналам связи, для этого мне и нужно аутентифицировать документ, на данном этапе мне нужно хотя бы из контейнера ключи достать!!! Больше пока ничего не надо, а я не могу их достать, хотя открытые ключи там ЕСТЬ! Че не понятно? Вопрос простой : Почему все время возвращается ошибка, что ключей нет, хотя они там точно есть! такой вопрос уже поднимался на этом форуме, но остался без ответа! | ||||