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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Хемуль Хемулевский  
#1 Оставлено : 8 октября 2025 г. 15:27:02(UTC)
Хемуль Хемулевский

Статус: Новичок

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

Коллеги добрый день. Помогите разобраться как установить комбинированный алгоритм подписи в параметр HashEncryptionAlgorithm.

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

Код:
EncodedTime signTime = getCurrentEncodedTime();
result.date = signTime.localTime;
CRYPT_ATTR_BLOB attrBlob;
CRYPT_ATTRIBUTE attr;
attrBlob.cbData = signTime.asn1Data.size();
attrBlob.pbData = signTime.asn1Data.data();
attr.pszObjId = (LPSTR)szOID_RSA_signingTime;
attr.cValue = 1;
attr.rgValue = &attrBlob;

CRYPT_SIGN_MESSAGE_PARA stSignMessagePara;
DWORD MessageSizeArray[1];
const BYTE* MessageArray[1];
CRYPT_OBJID_BLOB hashParam;
hashParam.cbData = 0;
hashParam.pbData = nullptr;
CRYPT_ALGORITHM_IDENTIFIER hashAlgo;
CRYPT_ALGORITHM_IDENTIFIER signAlgo;
hashAlgo.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_512;
signAlgo.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_512_R3410;
hashAlgo.Parameters = hashParam;
signAlgo.Parameters = hashParam;

ZeroMemory(&stSignMessagePara, sizeof(CRYPT_SIGN_MESSAGE_PARA));
stSignMessagePara.cbSize = sizeof(stSignMessagePara);
stSignMessagePara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
stSignMessagePara.pSigningCert = pCertCtx_;
stSignMessagePara.HashAlgorithm= hashAlgo;
stSignMessagePara.pvHashAuxInfo = nullptr;
stSignMessagePara.HashEncryptionAlgorithm = signAlgo;
stSignMessagePara.pvHashEncryptionAuxInfo = nullptr;
stSignMessagePara.rgpMsgCert = &pCertCtx_;
stSignMessagePara.cMsgCert = 1;
stSignMessagePara.cAuthAttr = 1;
stSignMessagePara.rgAuthAttr = &attr;
MessageArray[0] = (const BYTE*)datatosing.bytes();
MessageSizeArray[0] = datatosing.length;

CryptSignMessage(
&stSignMessagePara, 
TRUE, 
1, 
MessageArray, 
MessageSizeArray, 
NULL, 
&dwSignatureSize)


Пробовал сделать тоже самое через CryptMsgOpenToEncode и структуру CMSG_SIGNER_ENCODE_INFO но результат оказался таким же.
А алгоритм поменять нужно так как при последующей проверке на другой системе, где используется JCP получаю ошибку вида:

java.security.NoSuchAlgorithmException: no such algorithm: 1.2.643.7.1.1.1.2 for provider JCSP

Имел опыт только с JCP там можно задавать параметры digest и sign (JCP.GOST_DIGEST_2012_512_OID и JCP.GOST_SIGN_2012_512_OID), а как сделать тоже самое в cpapilite разобраться не могу...

Отредактировано пользователем 8 октября 2025 г. 15:38:38(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 8 октября 2025 г. 16:14:59(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,945
Мужчина
Российская Федерация

Сказал «Спасибо»: 599 раз
Поблагодарили: 2337 раз в 1834 постах
Здравствуйте.

В сертификате указано и из него должно использоваться.

1.2.643.7.1.1.1.1 - алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 - в квал.сертификатах
1.2.643.7.1.1.1.2 - алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512


Почему потребовался ключ 512?

Техническую поддержку оказываем тут
Наша база знаний
Offline Хемуль Хемулевский  
#3 Оставлено : 8 октября 2025 г. 16:40:22(UTC)
Хемуль Хемулевский

Статус: Новичок

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

Началось с того что при проверки подписи на другой системе где используется JCSP и проверка проходит через java.security.signature получаю ошибку: java.security.NoSuchAlgorithmException: no such algorithm: 1.2.643.7.1.1.1.2 for provider JCSP. Она происходит в тот момент когда Signature обращается к JCSP и не находит там алгоритма 1.2.643.7.1.1.1.2. В этот момент я пошел посмотреть как реализован выбор алгоритма на других системах, от которых данная проверка проходит успешно и нашел там следующую java реализацию:

Код:

        switch (keyAlgoritm) {

            case JCP.GOST_EL_2012_512_NAME:
            case JCP.GOST_DH_2012_512_NAME:

                signAlg = JCP.GOST_SIGN_2012_512_NAME;
                digestOidValue = JCP.GOST_DIGEST_2012_512_OID;
                signOidValue = JCP.GOST_SIGN_2012_512_OID;
                digestAlg = JCP.GOST_DIGEST_2012_512_NAME;
                break;
            case JCP.GOST_EL_2012_256_NAME:
            case JCP.GOST_DH_2012_256_NAME:

                signAlg = JCP.GOST_SIGN_2012_256_NAME;
                digestOidValue = JCP.GOST_DIGEST_2012_256_OID;
                digestAlg = JCP.GOST_DIGEST_2012_256_NAME;
                signOidValue = JCP.GOST_SIGN_2012_256_OID;
                break;
            case JCP.GOST_EL_SIGN_NAME:
            case JCP.GOST_DHEL_SIGN_NAME:
                signAlg = JCP.GOST_EL_SIGN_NAME;
                digestOidValue = JCP.GOST_DIGEST_OID;
                signOidValue = JCP.GOST_EL_SIGN_OID;
                break;
        }
    }

И если я правильно понимаю провайдер JCSP ожидает алгоритм 1.2.643.7.1.1.3.3 а не 1.2.643.7.1.1.1.2 в поле алгоритма подписи.

Отредактировано пользователем 8 октября 2025 г. 20:01:37(UTC)  | Причина: Не указана

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