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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline ikozlov  
#1 Оставлено : 21 мая 2012 г. 18:56:14(UTC)
ikozlov

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

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Задача - получить зашифрованную строку алгоритмом GOST3411withGOST3410EL.
В Java и C++ разные результаты.

Java:
Код:
X509Certificate x509Certificate = (X509Certificate) certificateFactory.generateCertificate(new ByteArrayInputStream(cert.getEncoded()));
PrivateKey privateKey = (PrivateKey)keyStore.getKey("mycert", "mypass".toCharArray());
Signature sig = Signature.getInstance("GOST3411withGOST3410EL");
sig.initSign(privateKey);
byte[] input_bytes = new String("ABCdef123").getBytes("UTF8");
sig.update(input_bytes);
byte[] signature_bytes = sig.sign();
System.out.println(new String(signature_bytes, "UTF8"));
System.out.println("signature_bytes.length: " + signature_bytes.length);


Цитата:
На выходе имею строку байт длинной 64 символа
signature_bytes.length: 64


C++:
Код:
HCRYPTKEY hCryptKey;
HCERTSTORE hStore = NULL; // Дескритор хранилища сертификатов
// Открытие хранилища сертификатов "MY" текущего пользователя.
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG |CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if(!hStore)
	HandleError("The store could not be opened!\n");
else
	printf("The store is open!\n");

// Получение сертификата с заданным именем из хранилища сертификатов. 
PCCERT_CONTEXT pContext = NULL ; // Контекст сертификата
CRYPT_HASH_BLOB chb;
chb.pbData = hashData;
chb.cbData = hashDataLength;

pContext = CertFindCertificateInStore(hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_HASH, &chb, NULL);
if(pContext == NULL)
{
	HandleError("There is no such a certificate in the store\n");
}

BYTE  *pbSignedMessageBlob;
DWORD cbSignedMessageBlob;

// Создаем и заполняем структуру для создания цифровой подписи
CRYPT_SIGN_MESSAGE_PARA  SigParams;

SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SigParams.pSigningCert = pContext;
SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411_R3410;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
BYTE* pbMessage = (BYTE*)"ABCdef123";
DWORD cbMessage = (DWORD)strlen((char*) pbMessage)+1;
const BYTE* MessageArray[] = {pbMessage};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = cbMessage;

//Включаем кэширование
DWORD cData;
PCCERT_CONTEXT pCert= SigParams.pSigningCert;
int ret = CertGetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &cData);
CRYPT_KEY_PROV_INFO* pCryptKeyProvInfo  = NULL;
if (ret) {
	pCryptKeyProvInfo = (CRYPT_KEY_PROV_INFO *)malloc(cData);
	if(!pCryptKeyProvInfo)
	HandleError("Error in allocation of memory.");
	ret = CertGetCertificateContextProperty(pCert,CERT_KEY_PROV_INFO_PROP_ID, pCryptKeyProvInfo,&cData);
	if (ret)
	{
		/* Установим флаг кеширования провайдера*/
		pCryptKeyProvInfo->dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID;
		/* Установим свойства в контексте сертификата*/
		ret = CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID,0, pCryptKeyProvInfo);
	}
}

// Получаем длину буфера подписи. Тут появляется окно ввода пина

if(CryptSignMessage(
&SigParams,              // указатель на SigParams
TRUE,                    // подпись создается отдельно 
1,                       // число сообщений
MessageArray,            // сообщение
MessageSizeArray,        // длина сообщения
NULL,                    // буфер для подписи
&cbSignedMessageBlob))   // размер буфера
{
printf("Signature size %d.\n",cbSignedMessageBlob);
}
else
{
HandleError("Error in CryptSignMessage.");
}

// выделяем память под подпись
if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob]))
{
HandleError("Error in new[].");
}

// формируем подпись.
if(CryptSignMessage(
&SigParams,            // указатель на SigParams
TRUE,                  // подпись создается отдельно 
1,                     // число сообщений
MessageArray,          // сообщение
MessageSizeArray,      // длина сообщения
pbSignedMessageBlob,   // буфер для подписи
&cbSignedMessageBlob)) // размер буфера
{
print_signature(cbSignedMessageBlob, pbSignedMessageBlob);
}
else
{
HandleError("Errror in cryptsignmessage 2");
}


Цитата:
На выходе имею
Signature size 589.


64 явно != 589. В чем может быть причина разного результата?
Offline Андрей Писарев  
#2 Оставлено : 21 мая 2012 г. 19:10:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
64 явно != 589. В чем может быть причина разного результата?

в разном формате результатов


64 - значение зашифрованного хеша -> значение ЭЦП


589 - ASN.1 структура, содержащая значение ЭЦП


пример в картинках

Отредактировано пользователем 21 мая 2012 г. 19:19:57(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#3 Оставлено : 21 мая 2012 г. 19:19:22(UTC)
ikozlov

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

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
Цитата:
64 явно != 589. В чем может быть причина разного результата?

в разном формате результатов


64 - значение зашифрованного хеша -> значение ЭЦП


589 - ASN.1 структура, содержащая значение ЭЦП


Правильно я понимаю, что от результата, который мне возвращается кодом C++ мне нужно получить хэш алгоритмом CALG_GR3411?
Offline Андрей Писарев  
#4 Оставлено : 21 мая 2012 г. 19:20:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
ikozlov написал:


Правильно я понимаю, что от результата, который мне возвращается кодом C++ мне нужно получить хэш алгоритмом CALG_GR3411?


для чего?
Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#5 Оставлено : 21 мая 2012 г. 19:23:42(UTC)
ikozlov

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

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
ikozlov написал:


Правильно я понимаю, что от результата, который мне возвращается кодом C++ мне нужно получить хэш алгоритмом CALG_GR3411?


для чего?


Я видимо не правильно понял. Моя цель - подписать строку. Буду благодарен, если укажите что я делаю не верно.
Offline Андрей Писарев  
#6 Оставлено : 21 мая 2012 г. 19:24:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
ikozlov написал:
Андрей * написал:
ikozlov написал:


Правильно я понимаю, что от результата, который мне возвращается кодом C++ мне нужно получить хэш алгоритмом CALG_GR3411?


для чего?


Я видимо не правильно понял. Моя цель - подписать строку. Буду благодарен, если укажите что я делаю не верно.


Цитата:
if(CryptSignMessage
- вот здесь и подписывается
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#7 Оставлено : 21 мая 2012 г. 19:27:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Описание есть в руководстве разработчика и MSDN.

http://cpdn.cryptopro.ru...f8c0d2c813525c84e3d.html

Цитата:
Функция CryptSignMessage создает хеш определенного содержания, подписывает хеш и затем производит закодирование и текста исходного сообщения, и подписанного хеша.

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#8 Оставлено : 21 мая 2012 г. 19:33:10(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Код:
// Создаем и заполняем структуру для создания цифровой подписи
CRYPT_SIGN_MESSAGE_PARA  SigParams;
 ....
SigParams.pSigningCert = pContext;
...
SigParams.cMsgCert = 0;



Лучше изменить на
Цитата:
SigParams.cMsgCert = 1;
чтобы сертификат подписанта добавлялся
Если это не предумышленное действие :)

Предвидя следующие проблемы при проверке сторонним софтом (КриптоАРМ.. )
Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#9 Оставлено : 21 мая 2012 г. 19:36:53(UTC)
ikozlov

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

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
Код:
// Создаем и заполняем структуру для создания цифровой подписи
CRYPT_SIGN_MESSAGE_PARA  SigParams;
 ....
SigParams.pSigningCert = pContext;
...
SigParams.cMsgCert = 0;



Лучше изменить на
Цитата:
SigParams.cMsgCert = 1;
чтобы сертификат подписанта добавлялся
Если это не предумышленное действие :)

Предвидя следующие проблемы при проверке сторонним софтом (КриптоАРМ.. )


После добавления этого параметра, приложение начало падать в функции
// Получаем длину буфера подписи. Тут появляется окно ввода пина

Код:
  if(CryptSignMessage(
    &SigParams,              // указатель на SigParams
    TRUE,                    // подпись создается отдельно 
    1,                       // число сообщений
    MessageArray,            // сообщение
    MessageSizeArray,        // длина сообщения
    NULL,                    // буфер для подписи
    &cbSignedMessageBlob))   // размер буфера
  {
    printf("Signature size %d.\n",cbSignedMessageBlob);
  }
  else
  {
    HandleError("Error in CryptSignMessage.");
  }
Offline Андрей Писарев  
#10 Оставлено : 21 мая 2012 г. 19:42:27(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
После добавления этого параметра, приложение начало падать в функции
// Получаем длину буфера подписи. Тут появляется окно ввода пина


Если не секрет, с каким кодом\текстом ошибки?

Пример из SDK не работает?


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