Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline navrocky  
#1 Оставлено : 6 февраля 2025 г. 18:57:44(UTC)
navrocky

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 30
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 2 раз в 2 постах
Подскажите как определить алгоритм вычисления хэша для подписи по открытому крипто контейнеру? Не совсем понимаю куда смотреть.

Есть открытый крипто контейнер (CryptAcquireContextW).

Теперь мне надо в функции CryptCreateHash() указать алгоритм хэширования. Как его правильно определить?

Я раньше пытался взять алгоритм подписи сертификата из крипто-контейнера, алгоритмы были следующие:
  • szOID_CP_GOST_R3411_12_256_R3410
  • szOID_CP_GOST_R3411_12_512_R3410
  • szOID_RSA_SHA256RSA
  • szOID_RSA_SHA384RSA

...

По этим алгоритмам я выбирал соответствующий алгоритм хэширования: CALG_GR3411_2012_256, CALG_GR3411_2012_512, CALG_SHA_256 ...

Сейчас словил ошибку с одним из свежевыданных ключей:

Код:
CryptSignHash: Указан неправильный алгоритм

В новом ключевом контейнере вот так:
Код:
SHA1 отпечаток      : 728546732952234722f7e7a73112060eb22e3968
Идентификатор ключа : 3c363a14f43e2b299ef125ab2f8940e3190f4c2a
Алгоритм подписи    : ГОСТ Р 34.11-2012/34.10-2012 256 бит
Алгоритм откр. кл.  : ГОСТ Р 34.10-2012 512 бит (1024 бит)


Видно, что алгоритм подписи сертификата 256 бит, а алгоритм публичного ключа 512 бит.

Я так понял, что неправильно получать алгоритм из подписи сертификата. Пытаюсь его взять из публичного ключа:
Код:
// Получаем информацию об открытом ключе
DWORD keyInfoSize = 0;
if (!CryptExportPublicKeyInfo(*prov, keySpec, Encoding, nullptr, &keyInfoSize))
    throw CPCSPException("<10de94fd> CryptExportPublicKeyInfo");

auto keyInfo = static_cast<PCERT_PUBLIC_KEY_INFO>(malloc(keyInfoSize));
finalize { free(keyInfo); };

if (!CryptExportPublicKeyInfo(*prov, keySpec, Encoding, keyInfo, &keyInfoSize))
    throw CPCSPException("<f476a203> CryptExportPublicKeyInfo");

// Получаем алгоритм открытого ключа
auto keyAlgId = keyInfo->Algorithm.pszObjId;


И теперь я получаю немного другие идентификаторы алгоритмов:
  • szOID_CP_GOST_R3410_12_256
  • szOID_CP_GOST_R3410_12_512
  • szOID_RSA_RSA


И если для гостовых алгоритмов я могу сопоставить битность гостового хэша. То для szOID_RSA_RSA я даже и не знаю какой алгоритм хэширования использовать.

В общем я немного в этом всем путаюсь.

Может есть какой-то более правильный способ получить алгоритм хэширования по открытому крипто-контексту?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.