Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close