logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline arte-tkolomiets  
#1 Оставлено : 3 июля 2018 г. 19:05:55(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
Коллеги, прошу прощения, по недосмотру, тему сначала поместил в ветку 3.6.
Поскольку версия КриптоПро 3.9, пишу здесь.

Получена ASN-структура следующего вида
UserPostedImage

Далее пробую импортировать сессионный ключ следующим образом:

Код:

 Win32Check(CryptAcquireContext(@hProv, 'KeyContainer', '', 75, CRYPT_SILENT));

  Win32Check(CryptGetUserKey(hProv, AT_KEYEXCHANGE, @FPrivateKey));

  // сборка PublicKey BLOB из статической части и открытого ключа
  abPublicKeyBlob :=
    [
     $06,       // bType = PUBLICKEYBLOB
     $20,       // bVersion = 0x20
     $00, $00,
     $23, $2E, $00, $00, // KeyAlg = ALG_SID_GR3410EL
     $4D, $41, $47, $31, //Magic = GR3410_1_MAGIC
     $00, $02, $00, $00, // BitLen = 512
     // bASN1GostR3410_94_PublicKeyParameters
     $30, $12,
     $06, $07 ,
     $2A, $85, $03, $02, $02, $24, $00,
     $06, $07,
     $2A, $85, $03, $02, $02, $1E, $01,
     // APublicKey;
     $13, $1D, $94, $D3, $35, $01, $D3, $15,
     $18, $10, $63, $7F, $D1, $CD, $AE, $8E,
     $91, $A6, $DF, $60, $29, $64, $27, $9B,
     $A1, $2E, $8D, $33, $61, $DF, $68, $AE,
     $32, $B6, $87, $64, $2C, $8C, $97, $34,
     $85, $94, $15, $5F, $7C, $D2, $3A, $84,
     $21, $D4, $04, $3C, $99, $7A, $CF, $1A,
     $99, $3A, $64, $21, $31, $7E, $F9, $77
    ];

  // получение ключа согласования импортом открытого ключа отправителя
  // на закрытом ключе
  Win32Check(CryptImportKey(hProv, @abPublicKeyBlob[0], Length(abPublicKeyBlob), FPrivateKey, 0, @FAgreeKey));

  // установление PRO_EXPORT алгоритма ключа согласования
  algProExport := CALG_PRO_EXPORT;
  Win32Check(CryptSetKeyParam(FAgreeKey, KP_ALGID, @algProExport, 0));

  // сборка SessionKey BLOB из статической части и параметров сессионного ключа
  abSessionKeyBlob :=
  [
   $01, // bType = SIMPLEBLOB
   $20, // bVersion = 0x20
   $00,$00 ,
   $1E,$66 ,$00 ,$00, // KeyAlg = CALG_G28147
   $FD,$51 ,$4A ,$37, // Magic = G28147_MAGIC
   $1E,$66 ,$00 ,$00, // EncryptKeyAlgId = CALG_G28147
   //ASessionSV
   $CE, $F5, $56, $67, $BF, $BB, $15, $D2,
   //ASessionKey ,
   $31, $FD, $E9, $C5, $D3, $9A, $27, $46,
   $FF, $EB, $87, $9C, $B4, $7D, $68, $D4,
   $14, $77, $E6, $78, $DE, $D6, $E5, $FD,
   $FF, $08, $9A, $86, $82, $72, $E7, $2D,
   //ASessionMAC ,
   $9A, $5B, $67, $B7,
   // ASN.1 Sequence + OID Header
   $30 ,$09 ,$06 ,$07,
   // OID_GOST_R28147_89_CryptoPro_A_ParamSet 1.2.643.2.2.31.1
   $2A ,$85 ,$03 ,$02 ,$02 ,$1F ,$01
  ];

  // получение сессионного ключа импортом зашифрованного сессионного ключа
  // на ключе согласования
  Win32Check(CryptImportKey(hProv, @abSessionKeyBlob[0], Length(FSessionKeyBlob), FAgreeKey, CRYPT_EXPORTABLE, @FSessionKey));


На последнем вызове возникает ошибка "Плохие данные".
В чем может быть проблема?
Offline arte-tkolomiets  
#2 Оставлено : 4 июля 2018 г. 19:28:32(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
Не победил тему, выкладываю код плюс последовательность действий

1. Инициализируем крипто-провайдер

Код:

Win32Check(CryptAcquireContext(@hProv, 'MyContainer', '', PROV_GOST_2001_DH, 0));


2. Шифруем данные и ключ



2. Готовим запрос xml-envelope, отсылаем его в ФСС, получаем ответ шифрованный

3 Из ответа ФСС берем ASN и вырезаем из него: APublicKey, ASessionSV, ASessionKey, ASessionMAC

4 Полученные APublicKey, ASessionSV, ASessionKey, ASessionMAC передаем в код дешифровки



С ошибкой на последнем вызове - ПЛОХИЕ ДАННЫЕ - ничего не могу пока сделать.
Где может быть собака зарыта? То ли вручную неверно собираю, то ли что-то недоустанавливаю из параметров, то ли из ответа достаю неверные
APublicKey, ASessionSV, ASessionKey, ASessionMAC.. Для начала просто правильность кода проверьте, пожалуйста.

Отредактировано пользователем 4 июля 2018 г. 19:32:24(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#3 Оставлено : 4 июля 2018 г. 20:27:26(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,582
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 536 раз в 486 постах
Паскаль уже давольно давно не читал, но с виду нормально.
Рекомендую написать сначала код на С, выполняющий эту работу, а потом портировать.
Лучше вместе с экспортом сессионного ключа, поскольку я не уверен, что не перепутаны сертификаты и ключи отправителя\получателя.
Знания в базе знаний, поддержка в техподдержке
Offline arte-tkolomiets  
#4 Оставлено : 5 июля 2018 г. 9:53:52(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
А можно пока что проверить последовательностб действий концептуально. Цепочка: отправитель - Мы, получатель - ФСС, получатель ответа ФСС - МЫ
1. Получаем свой закрытый ключ + открытый ФСС из сертификата ФСС.
2. Для своего закрытого ключа так же получаем свой открытый ключ (для GostR3410-KeyTransport)
3. Формируем на паре (п.1) ключ согласования (CALG_PRO_EXPORT)
4. Генерируем сессионный CALG_G28147 и на ключе согласования (п.3) экспортируем его в BLOB сессионного ключа.
5. Из своего публичного ключа (п.2) и сессионного ключа, UKM, MAC, полученных из BLOB сессионного ключа (п.4). формируем GostR3410-KeyTransport ключа шифрования.
6. Упаковываем GostR3410-KeyTransport (п.5) в base64-envelope и отправляем ФСС.
7. Из base64-envelope ответа ФСС берем GostR3410-KeyTransport.
8. Из GostR3410-KeyTransport ФСС (п.7) берем публичный ключ, сессионный ключ, UKM, MAC.
9. Собираем BLOB из публичного ключа ФСС (п.8) и импортируем его на своем закрытом ключе, получая новый ключ согласования (CALG_PRO_EXPORT).
10. Собираем сессионный BLOB из сессионный ключ, UKM, MAC ФСС (п.8) и импортируем его на новом ключе согласования (п.9) получая сессионный ключ.

Принципиально - это все?
Никаких установок KP_IV для ключей согласования или еще чего-то?
Я сымитировал запрос - импорт - дшифровка по данной схеме просто для двух локальных контейнеров, все прошло нормально. Это был аналог - моего запроса и дешифровки его на стороне ФСС. Сейчас еще сымитирую запрос - ответ. Может какие-то нюансы будут.




Offline Максим Коллегин  
#5 Оставлено : 5 июля 2018 г. 10:14:10(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,582
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 536 раз в 486 постах
Похоже не правду.
Не думаю, что для ключа согласования используется личный закрытый ключ, скорее всего эфемерный, но принципально схема не меняется.
Знания в базе знаний, поддержка в техподдержке
Offline arte-tkolomiets  
#6 Оставлено : 5 июля 2018 г. 10:23:07(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
Автор: Максим Коллегин Перейти к цитате
Похоже не правду.
Не думаю, что для ключа согласования используется личный закрытый ключ, скорее всего эфемерный, но принципально схема не меняется.

я пробовал и на закрытых и на эфемерных, результат пока не дало
буду пробовать :)

Offline Fanbir  
#7 Оставлено : 9 июля 2018 г. 15:36:16(UTC)
Fanbir

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

Группы: Участники
Зарегистрирован: 09.07.2018(UTC)
Сообщений: 7
Беларусь
Откуда: Минск

Доброго времени суток!
Подскажите, пожалуйста, варианты решения вопроса.
Имеется уставновленный .cer на продукт и имеется на локальной машине файлик .pfx
Как можно средствами ЯП(Java, C#) установить файлик .pfx ?
Существует ли такой алгоритм ?

Отредактировано пользователем 9 июля 2018 г. 15:39:00(UTC)  | Причина: Не указана

Offline arte-tkolomiets  
#8 Оставлено : 17 июля 2018 г. 10:38:13(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
Кому интересно, выкладываю архив проекта Delphi с вызовом шифрованного сервиса ФСС.
Crypto.zip (984kb) загружен 80 раз(а).
thanks 4 пользователей поблагодарили arte-tkolomiets за этот пост.
LosPolos оставлено 03.12.2018(UTC), AlexAU оставлено 17.12.2018(UTC), Shuraken оставлено 22.12.2018(UTC), Alexcrool оставлено 25.01.2019(UTC)
Offline Shuraken  
#9 Оставлено : 13 августа 2018 г. 13:55:19(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Господа, такой вопрос по обозначению алгоритмов. Если я формирую ЭЦП с использованием сертификата
Криптопровайдер: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
Алгоритм ключа: ГОСТ Р 34.10-2001

то в блоке SignedInfo будут следующие строчки
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>

Если же используется сертификат
Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит

то в блоке SignedInfo появляются уже такие строчки
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>

Вопрос такой: как программно определить, что подставить в SignatureMethod Algorithm и DigestMethod Algorithm, в зависимости от алгоритмов, указанных в сертификате?

С уважением, Александр.
Offline Андрей Писарев  
#10 Оставлено : 13 августа 2018 г. 15:22:40(UTC)
Андрей Писарев

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

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

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

Цитата:

Если же используется сертификат
Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит

то в блоке SignedInfo появляются уже такие строчки
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>


Вот эти слова - перевести в код.

По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.

Техническую поддержку оказываем тут
Наша база знаний
Offline Shuraken  
#11 Оставлено : 13 августа 2018 г. 15:42:13(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Автор: Андрей Писарев Перейти к цитате
Здравствуйте.

Цитата:

Если же используется сертификат
Криптопровайдер: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Алгоритм ключа: ГОСТ Р 34.10-2012 256 бит

то в блоке SignedInfo появляются уже такие строчки
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>


Вот эти слова - перевести в код.

По алгоритму подписи - в сертификате\по контексту сертификата - узнать тип\имя провайдера и т.п.



Провайдера я определяю, тут вопросов нет, он заключается в другом. Как перевести "Crypto-Pro GOST R 34.10-2012" в "gostr34102012-gostr34112012-256"? Можно, конечно, тупо создать таблицу соответствий, но при этом понимаешь, что эта конструкция будет работать до первого неизвестного значения.
Offline Максим Коллегин  
#12 Оставлено : 13 августа 2018 г. 23:46:59(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 5,582
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 536 раз в 486 постах
К имени провайдера привязываться не стоит, а вот привязка к алгоритму открытого ключа сертификата подписи - правильный путь.
Знания в базе знаний, поддержка в техподдержке
Offline Shuraken  
#13 Оставлено : 17 августа 2018 г. 10:54:13(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Столкнулся с такой непонятной для меня ситуацией. Установил несколько тестовых сертификатов от КриптоПро, чтобы проверить корректность наложения ЭЦП. В одном сертификате такие параметры:
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 512 бит

В другом
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 256 бит

Я сперва посчитал, что раз в обоих случаях алгоритм подписи и хэш-алгоритм подписи одинаковы, то для формирования хэша будет использоваться один и тот же алгоритм - CALG_GR3411_2012_256 (32801). Ага, щаз. В случае использования второго сертификата с открытым ключом на 256 бит это было справедливо. А вот для сертификата с открытым ключом в 512 бит опытным путём удалось установить, что надо использовать другой алгоритм - CALG_GR3411_2012_512 (32802). Тогда всё накладывается корректно и запрос получается правильным.
И я сейчас пытаюсь понять, как программно вытащить информацию о правильном хэш-алгоритме. Пишу на Делфи, вот код


И я понимаю, что ищу не то, что надо искать данные именно для хэш-алгоритма, но при этом не могу понять, какими процедурами это можно сделать, используя контекст конкретного сертификата. Подскажите пожалуйста.
С уважением, Александр.
Offline Shuraken  
#14 Оставлено : 20 августа 2018 г. 17:11:28(UTC)
Shuraken

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Также столкнулся с ситуацией, что не работает формирование ЭЦП в Windows 10



На версиях ниже 10 всё работает нормально. Подскажите, в чём может быть дело?
Offline arte-tkolomiets  
#15 Оставлено : 20 февраля 2019 г. 12:55:27(UTC)
arte-tkolomiets

Статус: Участник

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

Поблагодарили: 4 раз в 1 постах
Коллеги, по просьбе в личке добавил c14n_TLB.pas в проект, чтобы не пришлось генерить его
Crypto.zip (957kb) загружен 31 раз(а).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.