powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI
24 сообщений из 24, страница 1 из 1
CryptoAPI
    #33219015
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как с помощью CryptoAPI получить из сертификата имя криптопровайдера, для которого этот сертификат предназначен?
...
Рейтинг: 0 / 0
CryptoAPI
    #33220556
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то в этом духе:
Код: plaintext
1.
2.
CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID,pPInfo,cbData)
pPInfo->pwszProvName
только не забыть выделить память под pPInfo
...
Рейтинг: 0 / 0
CryptoAPI
    #33256428
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы получить ответ на такой вопрос: какими функциями CryptoAPI можно пользоваться, чтобы не происходил конфликт между несколькими российскими криптопровайдерами? Например, Base Cryptography Functions нормально работают, когда на одном компьютере стоит несколько CSP. А Simplified Message Functions не работают. Будут ли работать функции Low-level Message Function?
...
Рейтинг: 0 / 0
CryptoAPI
    #33256429
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я работаю низкоуровневыми функциями CryptoAPI. Мне необходимо собрать сообщение в формате PKCS #7, чтобы его можно было дешифровать, проверить подпись высокоуровневыми функциями. Посметрел описание этого формата на сайте rsa.com, но, честно говоря, мало что понял. Кто-нибудь пробовал делать что-то подобное (самому формировать этот формат)? Буду благодарен за любую помощь.
...
Рейтинг: 0 / 0
CryptoAPI
    #33257658
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maksim UMЧто-то в этом духе:
Код: plaintext
1.
2.
CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID,pPInfo,cbData)
pPInfo->pwszProvName
только не забыть выделить память под pPInfo

А если это сертификат открытого ключа, то при вызове этой функции вылетает ошибка - объект не найден. В этом слчае можно как-то узнать имя или тип криптопровайдера, к которому принадлежит этот сертификат?
...
Рейтинг: 0 / 0
CryptoAPI
    #33265870
DmSK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maksim UMЧто-то в этом духе:
Код: plaintext
1.
2.
CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID,pPInfo,cbData)
pPInfo->pwszProvName
только не забыть выделить память под pPInfo

такой вопрос,
откуда берет информацию выше указанная функция:
- из контекста сертификата ?!
- из других источников ?!

спасибо_
...
Рейтинг: 0 / 0
CryptoAPI
    #33266129
Dmitry Skrypka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а кто знает ответ на этот вопрос:
-как сериализированный контекст сертификата опять восстановить в PCCERT_CONTEXT ?!

спасибо_
...
Рейтинг: 0 / 0
CryptoAPI
    #33266200
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSK Maksim UMЧто-то в этом духе:
Код: plaintext
1.
2.
CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID,pPInfo,cbData)
pPInfo->pwszProvName
только не забыть выделить память под pPInfo

такой вопрос,
откуда берет информацию выше указанная функция:
- из контекста сертификата ?!
- из других источников ?!

спасибо_
Эта функция берет информацию из контекста сертификата. Правильнее ее вот так написать: CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, cntx, &si).
...
Рейтинг: 0 / 0
CryptoAPI
    #33266203
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Skrypkaа кто знает ответ на этот вопрос:
-как сериализированный контекст сертификата опять восстановить в PCCERT_CONTEXT ?!

спасибо_
Простите, а что такое сериализованный контекст?
...
Рейтинг: 0 / 0
CryptoAPI
    #33266617
Dmitry Skrypka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно я не учел проф.
...
Рейтинг: 0 / 0
CryptoAPI
    #33266725
Dmitry Skrypka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно, я не так выразился.... ?!

--
The CertSerializeCertificateStoreElement function
serializes a certificate context's encoded certificate
and its encoded properties.
--

задача следующая, преобразовать контекст сертификата в
последовательность байт для последующего сохранения допустим
на диске. И по мере необходимости данный вектор байт обратно в
контекст, то что у меня и не получается.

как эта задача решается ?!
...
Рейтинг: 0 / 0
CryptoAPI
    #33267318
Maksim UM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понятно для чего.
Но решение есть.
Экспорт (можно в файл или еще куда):
Код: plaintext
1.
2.
hCert->pbCertEncoded  - сам сертификат (без закрытого ключа)
hCert->cbCertEncoded  - размер
Импорт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  If(!CertAddEncodedCertificateToStore(hStore,X509_ASN_ENCODING,
                                          &pbData,
                                          cbData,
                                          CERT_STORE_ADD_REPLACE_EXISTING,
                                          hCert))
  {
     Ops...
  } 
pbData - загруженные данные (pbCertEncoded)
cbData - длина
...
Рейтинг: 0 / 0
CryptoAPI
    #33267866
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые программисты, пожалуйста, скажите мне по какому принципу работают функции CryptDecryptMessage, CryptVerifyMessageSignature. Как в этих функциях происходит выбор криптопровайдера для дешифрирования, проверки подписи? Есть вариант открывать сообщение формта PKCS#7 дефолтным криптопровайдером, считывать, например, OID и по нему выбирать нужный криптопровайдер для дешифрирования или проверки подписи.
...
Рейтинг: 0 / 0
CryptoAPI
    #33268284
siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проходя мимо....

На всякий случай, скажу, вдруг что....
Сабж линейкой 9х не поддерживается.
...
Рейтинг: 0 / 0
CryptoAPI
    #33269861
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
siebentearbeitПроходя мимо....

На всякий случай, скажу, вдруг что....
Сабж линейкой 9х не поддерживается.
Не в этом суть :) Решений все-равно не ищется ... :(
...
Рейтинг: 0 / 0
CryptoAPI
    #33280937
siebente
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про выбор криптопровайдера в CryptAPI написано в MSDN, точно помню, видел, когда читал и собирался её использовать...
Но из-за 9х взялся за CryptoPP 5.21 :)
...
Рейтинг: 0 / 0
CryptoAPI
    #33283424
AlexeyStaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что это за пакет? Он мне поможет в работе с PKCS#7-форматом?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CryptoAPI
    #34184455
Лёлечка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вы не подскажите, почему такой текст (простите за Делфи)
if CryptEnumProvidersU(ProvNumPublic, nil, 0,@dwprovtypePublic, @provnamePublic, @cbnamePublic) then
begin
if length(ContainerEdit.Text) = 0 then cont := nil;
// if not cryptacquirecontext(@hprovPublic, cont , provnamePublic, dwprovtypePublic,CRYPT_NEWKEYSET)// (ïðîâàéäåð, êîíòåéíåð, èìÿ, òèï, ôëàãè)}
if not CryptAcquireContext(@hprovpublic, cont, provnamePublic, dwprovtypePublic, CRYPT_NEWKEYSET)
then begin
case int64(GetLastError) of
ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
ERROR_NOT_ENOUGH_MEMORY: err := 'ERROR_NOT_ENOUGH_MEMORY';
NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
NTE_BAD_KEYSET: err := 'NTE_BAD_KEYSET';
NTE_BAD_KEYSET_PARAM: err := 'NTE_BAD_KEYSET_PARAM';
NTE_BAD_PROV_TYPE: err := 'NTE_BAD_PROV_TYPE';
NTE_BAD_SIGNATURE: err := 'NTE_BAD_SIGNATURE';
NTE_EXISTS: err := 'NTE_EXISTS';
NTE_KEYSET_ENTRY_BAD: err := 'NTE_KEYSET_ENTRY_BAD';
NTE_KEYSET_NOT_DEF: err := 'NTE_KEYSET_NOT_DEF';
NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
NTE_PROV_DLL_NOT_FOUND: err := 'NTE_PROV_DLL_NOT_FOUND';
NTE_PROV_TYPE_ENTRY_BAD: err := 'NTE_PROV_TYPE_ENTRY_BAD';
NTE_PROV_TYPE_NO_MATCH: err := 'NTE_PROV_TYPE_NO_MATCH';
NTE_PROV_TYPE_NOT_DEF: err := 'NTE_PROV_TYPE_NOT_DEF';
NTE_PROVIDER_DLL_FAIL: err := 'NTE_PROVIDER_DLL_FAIL';
NTE_SIGNATURE_FILE_BAD: err := 'NTE_SIGNATURE_FILE_BAD';
else err := 'Unknown error';
end;
MessageDlg('Îøèáêà ñîçäàíèÿ êîíòåéíåðà: ' + err, mtError, [mbOK], 0);
exit;
end
else MessageDlg('Ñîçäàí êîíòåéíåð ñ èìåíåì ' + err, mtInformation, [mbOK], 0);
//ContainersForm.Show;
end;
выдает ошибку NTE_KEYSET_NOT_DEF
Что не так?
...
Рейтинг: 0 / 0
CryptoAPI
    #34184547
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые программисты, пожалуйста, скажите мне по какому принципу работают функции CryptDecryptMessage, CryptVerifyMessageSignature. Как в этих функциях происходит выбор криптопровайдера для дешифрирования, проверки подписи?

См. диаграмму здесь: http://msdn2.microsoft.com/en-us/library/aa382376.aspx. Обратите внимание на CryptAcquireContext функцию. Она открывает существующий CSP контейнер и возвращет хендл на него. Вот когда тот CSP контейнер на который Вы ссылаетесь создавался (кстати той же самой функцией CryptAcquireContext), то тот, кто это сделал (подозреваю что это были не Вы раз задаёте этот вопрос), определил какой именно CSP использовать.

Успехов.
...
Рейтинг: 0 / 0
CryptoAPI
    #34211696
warlocklex111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос как передать ключ по сети или сохранить в файл и потом им воспользоваться.
если вот на стороне сервера можно так
// Получение хэндл криптопровайдера
g=CryptAcquireContext(&hProv, NULL, NULL,
PROV_RSA_FULL,0);
/*g=GetLastError();
ShowMessage(IntToStr(g)); */
if (!g)
{ShowMessage(IntToStr(g));
return; }
// генерация сессионного ключа
g=CryptGenKey(hProv,CALG_RC4,CRYPT_EXPORTABLE|CRYPT_ENCRYPT, &hSessionKey);
//ShowMessage(IntToStr(g));
if (!g)
{
ShowMessage("Error_CryptGenKey");
ShowMessage(IntToStr(g));
return;
}
// получение ключа для экспорта ключа шифрования
if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hPublicKey)){
ShowMessage("error_CryptGetUserKey");
return; }
countbk = 0;

if (!CryptExportKey(hSessionKey, hPublicKey,SIMPLEBLOB, 0, NULL, &countbk)){
ShowMessage(IntToStr(GetLastError()));
ShowMessage("error_CryptExportKey1");
return; }
/*BYTE* */data = static_cast<BYTE*>(malloc(countbk));

//ZeroMemory(data, count);

// экспорт ключа шифрования
if (!CryptExportKey(hSessionKey, hPublicKey,SIMPLEBLOB, 0, data, &countbk)){
ShowMessage("error_CryptExportKey");
return;}


а на стороне клиента что писать?
просто :
if(!CryptImportKey(hProv, data, countbk, hPublicKey, 0, &hNewKey)){
ShowMessage(GetLastError());
ShowMessage("serverError_Key's import");
return;}
ясен перец не катит.
Помогите советом?пжалуйсто
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CryptoAPI
    #36194990
Flame_xXx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maksim UMНе совсем понятно для чего.
Но решение есть.
Экспорт (можно в файл или еще куда):
Код: plaintext
1.
2.
hCert->pbCertEncoded  - сам сертификат (без закрытого ключа)
hCert->cbCertEncoded  - размер
Импорт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  If(!CertAddEncodedCertificateToStore(hStore,X509_ASN_ENCODING,
                                          &pbData,
                                          cbData,
                                          CERT_STORE_ADD_REPLACE_EXISTING,
                                          hCert))
  {
     Ops...
  } 
pbData - загруженные данные (pbCertEncoded)
cbData - длина
а чтобы сертификат выглядил как обычный сертификат в файле, я так понимаю его надо расшифровать прежде чем записывать? Я правильно понимаю? Не подскажете какими функциями при этом надо пользоваться?
...
Рейтинг: 0 / 0
CryptoAPI
    #36195588
Flame_xXx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, все, спасибо, разобрался:)
...
Рейтинг: 0 / 0
CryptoAPI
    #36199930
Flame_xXx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexeyStafsiebentearbeitПроходя мимо....

На всякий случай, скажу, вдруг что....
Сабж линейкой 9х не поддерживается.
Не в этом суть :) Решений все-равно не ищется ... :(
На самом деле можно выдернуть из реестра:
OOL WINAPI MyCryptEnumProviders(DWORD dwIndex LPDWORD Res DWORD dwFlags LPDWORD pdwProvType LPTSTR szProvName LPDWORD pcbProvName){ static LPTSTR szKeyPath = TEXT("SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider"); BOOL bResult = TRUE; DWORD dwNumKeys; HKEY hKey = NULL; HKEY hSubKey = NULL; LONG lResult; FILETIME ft; dwFlags Res; __try { /* Open registry provider registry key*/ lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE szKeyPath 0 KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS &hKey); if (lResult != ERROR_SUCCESS) { bResult = FALSE; __leave; } if (szProvName == NULL) { /* Query for Number of Keys and Size maximum size of*/ /* provider*/ lResult = RegQueryInfoKey(hKey NULL NULL NULL &dwNumKeys pcbProvName NULL NULL NULL NULL NULL NULL); if (lResult != ERROR_SUCCESS) { bResult = FALSE; __leave; } /* return Size of Provider Name*/ *pcbProvName = (*pcbProvName + 1) * sizeof(TCHAR); if (dwIndex >= dwNumKeys) return FALSE; } else { DWORD dwSize; DWORD dwType; /* Get Provider by Index*/ dwSize = *pcbProvName/sizeof(TCHAR); lResult = RegEnumKeyEx(hKey dwIndex szProvName &dwSize NULL NULL NULL &ft); if (lResult != ERROR_SUCCESS) { bResult = FALSE; __leave; } *pcbProvName = (dwSize + 1) * sizeof(TCHAR); /* Open the Provider Registry Key*/ lResult = RegOpenKeyEx(hKey szProvName 0 KEY_QUERY_VALUE &hSubKey); if (lResult != ERROR_SUCCESS) { bResult = FALSE; __leave; } /* Get Provider Type*/ dwSize = sizeof(DWORD); lResult = RegQueryValueEx(hSubKey TEXT("Type") NULL &dwType (LPBYTE)pdwProvType &dwSize); if (lResult != ERROR_SUCCESS) { bResult = FALSE; __leave; } } } __finally { /* Clean up*/ if (hKey != NULL) RegCloseKey(hKey); if (hSubKey != NULL) RegCloseKey(hSubKey); } return bResult;}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CryptoAPI
    #38393473
SereZa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кто может дать точный ответ каким образом виндовс в окошке свойств сертификата получает данное значение:


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


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