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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline oops1  
#1 Оставлено : 24 апреля 2020 г. 10:54:55(UTC)
oops1

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

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

Сказал(а) «Спасибо»: 2 раз
Код:

Проверка завершена успешно     	ошибок не обнаружено
Контейнер закрытого ключа      	пользователя
  имя                          	CONTAINER
  уникальное имя               	REGISTRY\\CONTAINER
  FQCN                         	\\.\REGISTRY\CONTAINER
  проверка целостности контейнера 	успешно
Ключ обмена                    	доступен
  длина ключа                  	1024 бит
  экспорт открытого ключа      	успешно
  вычисление открытого ключа   	успешно
  импорт открытого ключа       	успешно
  подпись                      	успешно
  проверка                     	успешно
  создание ключа обмена        	успешно
  экспорт ключа                	разрешен
  алгоритм                     	ГОСТ Р 34.10-2012 DH 512 бит
                               	ГОСТ Р 34.10-2012 512 бит, параметры по умолчанию
                               	ГОСТ Р 34.11-2012 512 бит
                               	ГОСТ 28147-89, параметры шифрования ТК26 Z
  сертификат в контейнере      	отсутствует
Срок действия закрытого ключа  	24 июля 2021 г. 10:25:11
Использование ключа обмена     	разрешено до окончания срока действия закрытого ключа.
Ключ подписи                   	отсутствует
  загрузка ключей              	успешно
Версия контейнера              	2
Расширения контейнера          	
  некритическое                	Расширение контейнера КриптоПро CSP. Срок действия ключа обмена
  действителен по              	24 июля 2021 г. 10:25:11


пытаюсь его скопировать программно на токен
Этот код выполняется без ошибок
(код не компилируемый, это пример)
Код:

// контейнер назначения
CryptAcquireContext(out cryptoProviderDestination, token.FullPathToContainer, CSPProviderName, (uint) CSPProviderType, WNewkeyset | WSilent)

// контейнер получатель
CryptAcquireContext(out cryptoProviderSource, sourceContainer, CSPProviderName, (uint) CSPProviderType, 0)

//копирования параметров (функции хеширования) контейнера источника в контейнер получения
CryptGetProvParam(source, HashId, buffer, ref dataLen, 0) 
CryptSetProvParam(dest, HashId, buffer, 0);
CryptGetProvParam(source, Cipherid, buffer, ref dataLen, 0) 
CryptSetProvParam(dest, Cipherid, buffer, 0);

//Получение дескриптора закрытого ключа, который будет скопирован
CryptGetUserKey(cryptoProviderSource, AT_KEYEXCHANGE, out hSenderKey)

//Генерация эфемерного ключа в контейнере-отправителе и в контейнере-получателе
CryptGenKey(cryptoProviderSource, CALG_DH_EL_EPHEM, CRYPT_EXPORTABLE, out hSenderEphemKey)

// Генерация эфемерного ключа в контейнере-получателе.
CryptGenKey(cryptoProviderDestination, CALG_DH_EL_EPHEM, CRYPT_EXPORTABLE | CRYPT_PREGEN, out hResponderEphemKey)

//копирования параметров (эфемерного ключа) контейнера источника в контейнер получения
CryptGetKeyParam(hSenderEphemKey, KP_DHOID, pbKeyBlob, ref dataLen, 0)
CryptSetKeyParam(hResponderEphemKey, KP_DHOID, pbKeyBlob, 0)

//установки параметра ключа в контейнера  получения
CryptSetKeyParam(hResponderEphemKey, KP_X, null, 0)

//Получение ключа согласования в контейнере - получателя
ExportKey(hSenderEphemKey, PUBLICKEYBLOB)
CryptImportKey(cryptoProviderDestination, buffer, (uint) buffer.Length, hResponderEphemKey, 0, out hResponderAgreeKey)

// Экспортирование эфемерного ключа получателя в BLOB.
var pbKeyBlob = ExportKey(hResponderEphemKey, PUBLICKEYBLOB);
CryptImportKey(cryptoProviderDestination, pbKeyBlob, (uint) pbKeyBlob.Length, hSenderEphemKey, 0, out hSenderAgreeKey)

//Конвертирование ключа согласования в сессионный в контейнере - отправителе
CryptSetKeyParam(hSenderAgreeKey, KP_ALGID, BitConverter.GetBytes((uint) CALG_PRO_EXPORT), 0)
CryptSetKeyParam(hResponderAgreeKey, KP_ALGID, BitConverter.GetBytes((uint) CALG_PRO_EXPORT), 0)


Код:

uint dwBlobLen = 0;
CryptExportKey(hSenderEphemKey, hExkKey, PRIVATEKEYBLOB, 0, null, ref dwBlobLen)


Функция возвращает размер буфера = 0

GetLastError возвращает ошибку
либо -2146893813 либо 1008

Не могу понять что я делаю не так
Offline Сонина Лолита  
#2 Оставлено : 27 апреля 2020 г. 11:32:07(UTC)
Сонина Лолита

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 19 раз в 17 постах
Добрый день!

Для экспорта/импорта закрытых ключей 2012 года должен использоваться алгоритм экспорта CALG_PRO12_EXPORT.
Попробуйте в Вашем коде заменить CALG_PRO_EXPORT на CALG_PRO12_EXPORT.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Сонина Лолита за этот пост.
oops1 оставлено 27.04.2020(UTC)
Offline oops1  
#3 Оставлено : 27 апреля 2020 г. 12:18:27(UTC)
oops1

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: Сонина Лолита Перейти к цитате
Добрый день!

Для экспорта/импорта закрытых ключей 2012 года должен использоваться алгоритм экспорта CALG_PRO12_EXPORT.
Попробуйте в Вашем коде заменить CALG_PRO_EXPORT на CALG_PRO12_EXPORT.



Спасибо помогло, я наконец смог пройти эту функцию, и тут же уперся в другую проблему
На функции импорта на етокен

я получаю ошибку 2148532331 -- Нет доступа к карте. Введен неправильный PIN-код.

Пин код устанавливаю

CryptSetProvParam(cryptoProviderDestination, KeyExchangePIN, destPin /*ASCII*/, 0) -- возвращает true

пин код корректный, етокен pki клиент принимает пароль

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

Offline Агафьин Сергей  
#4 Оставлено : 27 апреля 2020 г. 12:25:30(UTC)
Grey

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

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

Сказал «Спасибо»: 5 раз
Поблагодарили: 215 раз в 174 постах
Добрый день.
CSP 4.0 не проверяет ПИН на его предъявлении через CryptSetProvParam (это исправлено только в CSP 5.0), так что CryptSetProvParam(PP_KEYEXCHANGE_PIN) всегда будет возвращать TRUE. Полагаю, у вас, всё же, действительно неверный пароль.
Попробуйте создать контейнер руками через csptest (Program Files / Crypto Pro / CSP / csptest):
Код:
csptest -keys -cont testcont -newk -pass 1234567890

Если здесь ваш пароль подойдет, значит, нужно смотреть на формат передачи в функцию. Там должна быть ASCII-строка с нулем в конце.
С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
thanks 1 пользователь поблагодарил Grey за этот пост.
oops1 оставлено 27.04.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.