Статус: Новичок
Группы: Участники
Зарегистрирован: 21.06.2019(UTC) Сообщений: 1
|
Здравствуйте! Пытаемся перенести реализованный функционал шифрования ЭЛН из Delphi на web-клиент. Этапы шифрования сообщения согласно спецификации ФСС:
1. Создание случайного сессионного ключа. При работе с ключами на алгоритме ГОСТ 2012 следует инициализировать генератор параметрами шифрования TK26Z (предоставляется провайдером). Алгоритм шифрования GOST28147. 2. Зашифрование сессионного ключа. 2.1. Создание шифратора для зашифрования ключа. Применяется алгоритм трансформации "urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001". Cоздается эфемерный ключ, который согласуется с открытым ключом получателя, и формируется ключ согласования (на котором будет зашифрован сессионный ключ); 2.2. Создание блока KeyInfo с сертификатом; 2.3. Шифрование сессионного ключа происходит с помощью указанного асимметричного ключа (ГОСТ Р 34.10). Cессионный ключ используется для шифрования данных и в свою очередь так же шифруется. CALG_DH_EL_EPHEM - идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2001. CALG_DH_GR3410_12_256_EPHEM - идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2012 (256 бит). CALG_DH_GR3410_12_512_EPHEM - идентификатор алгоритма обмена ключей по Диффи-Хеллману на базе закрытого ключа эфемерной пары. Открытый ключ получается по ГОСТ Р 34.10 2012 (512 бит). 3. Зашифрование документа. 3.1. Создание шифратора в режиме зашифрования. Применяется алгоритм "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147". Возможные параметры шифратора GostJCE/CBC/ISO10126Padding; 3.2. Добавление зашифрованного сессионного ключа, полученного ранее (добавление блока KeyInfo; 3.3. Зашифрование документа на сессионном ключе.
Возникло непонимание правильно ли мы получаем эфемерный и сессионный ключи методом, из которых впоследствии собираем структуру GostR3410 KeyTransport? В Delphi перед получением данных был шаг получения ключа согласования. Нужно ли в js его получать или это выполняется внутри метода? Код:ExportedKey = yield oSymAlgo.ExportKey(oCertificate);
Код:
//Константы для сборки GostR3410 KeyTransport
const
T1 = '30 81 A4 30 28 04 20',
T2 = '04 04',
T3 = 'A0 78 06 07 2A 85 03 02 02 1F 01 A0 63 30 1C 06 06 2A 85 03 02 02 13 30 12 06 07 ' +
'2A 85 03 02 02 24 00 06 07 2A 85 03 02 02 1E 01 03 43 00 04 40',
T4 = '04 08';
var
keyTransport,
sessionSV, sessionKey, sessionMAC, publicKey,
oSesKeyIV, EncryptedData, ExportedKey,
ExportedKeyArr, sessionKey, sessionKeyBlob;
try {
var oSymAlgo = yield cadesplugin.CreateObjectAsync("cadescom.symmetricalgorithm");
} catch (err) {
errormes = "Failed to create cadescom.symmetricalgorithm: " + err;
alert(errormes);
throw errormes;
}
yield oSymAlgo.GenerateKey();
//var oSesKey = yield oSymAlgo.DiversifyKey();
//var oSesKeyDiversData = yield oSymAlgo.DiversData;
oSesKeyIV = yield oSymAlgo.IV;
EncryptedData = yield oSymAlgo.Encrypt(Base64.encode(data), 1);
ExportedKey = yield oSymAlgo.ExportKey(oCertificate);
ExportedKeyArr = ExportedKey.replace(/ /g, '').split(':');
publicKey = ExportedKeyArr[1]. substr(-64 * 2);
sessionKeyBlob = ExportedKeyArr[2];
sessionSV = sessionKeyBlob.substr(16 2, 8 2);
sessionKey = sessionKeyBlob.substr(24 2, 32 2);
sessionMAC = sessionKeyBlob.substr(56 2, 4 2);
keyTransport = (T1 + sessionKey + T2 + sessionMAC + T3 + publicKey + T4 + sessionSV)
.replace(/ /g, '');
EncryptedData = oSesKeyIV.replace(/ /g, '') + EncryptedData;
Отредактировано пользователем 23 июня 2019 г. 22:30:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.08.2019(UTC) Сообщений: 2
|
Согласно API Метод ISymmetricAlgorithm::ExportKey - экспортирует симметричный ключ в зашифрованном виде.
Существует вообще метод получения через Browser plug-in симметричного ключа в незашифрованном виде? ФСС пишет "на базе закрытого ключа эфемерной пары", но через Browser plug-in нет возможности получить закрытый ключ эфемерной пары. ISymmetricAlgorithm::ExportKey - экспортирует Эфемерный открытый ключ.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Добрый день. Следите за логикой, у симметричного алгоритма нет разделения на открытый и закрытый ключ, так как они совпадают. У ассиметричного алгоритма согласно требованиям сертификации не должно быть способа экспорта закрытого ключа без защиты шифрованием. Отредактировано пользователем 21 ноября 2019 г. 10:45:52(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.01.2019(UTC) Сообщений: 3
|
Автор: it-for-bi Здравствуйте!
реализованный функционал шифрования ЭЛН из Delphi А можно посмотреть?)
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Если на Delphi с ручным формированием обвязки ключа гост-2001, то базовый пример тут. Для гост-2012 надо задать немного другое формирование ключа (указать парамсет TK26) и поправить обвязку (значения от Т1 до T4 выше с учетом другого парамсета и изменения длины). Схема PRO используется ФСС и для гост-2012, поэтому править на PRO12 нет необходимости. Также можно вызвать специальную функцию для автоматического формирования обвязки, не мучаться вручную. Это все есть фрагментарно на форуме, просто раскидано в разных темах. Есть также исходники на Джава и .NET, только поискать по форуму. Пока не видел полного текста через плагин или php. ЭЛН (ФСС) очень активно обсуждается на форуме, но почему-то все создают отдельные темы где придумают, вместо аккамулирования решений в одном месте. Отредактировано пользователем 27 января 2020 г. 15:13:07(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.06.2020(UTC) Сообщений: 4 Откуда: Москва
|
Добрый день. Удалось реализовать шифрование XML для отправки ЭЛН в ФСС через Крипто-Про browser plugin? Если да, не поделитесь решением?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 02.12.2014(UTC) Сообщений: 25 Откуда: Воронеж Сказал(а) «Спасибо»: 1 раз
|
Здравствуйте, тоже интересен вопрос, удалась ли реализация?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.01.2023(UTC) Сообщений: 18 Откуда: Москва Сказал «Спасибо»: 1 раз Поблагодарили: 15 раз в 9 постах
|
К сожалению, с помощью оригинального Browser plug-in зашифровать-расшифровать сообщение для ФСС или любого другого органа государственной власти в России невозможно
Для этой работы используется SymmetricAlgorithm. Но все параметры по обмену информацией программисты КриптоПро заложили внутрь и не дают настраивать. Мне пришлось дизассемблировать весь обмен весь обмен с помощью SymmetricAlgorithm что бы посмотреть что реально происходит - какие функции Windows API вызываются
Так например простейшее действие по расшифровке сообщения ФСС начинается со строк: SymmetricAlgorithm oSymAlgo = new SymmetricAlgorithm(); oSymAlgo.ImportKey(ExportedKey, cert);
Это порождает следующие вызовы Windows API: CryptGetUserKey CryptImportKey CryptSetKeyParam KP_ALGID 0x6621 CryptSetKeyParam KP_CIPHEROID '1.2.643.7.1.2.5.1.1 CryptImportKey
На первый взгляд все вроде правильно, но как говорится смотри детали. Если взять работающую расшифровку сообщения то она будет такая: CryptGetUserKey CryptImportKey CryptSetKeyParam KP_ALGID = 7 0x661F CryptSetKeyParam KP_CIPHEROID '1.2.643.7.1.2.5.1.1 CryptImportKey
Отличие в том, что в ImportKey программистами КриптоПро жестко заложено что KP_ALGID 0x6621 а для ФСС необходимо 0x661F. В результате второй CryptImportKey не может импортировать ключ и вылетает по ошибке. И таких моментов еще несколько (7 мест вызовов). Настроить это в высокоуровневом SymmetricAlgorithm невозможно (нет параметров).
Поэтому зашифровать-расшифровать сообщение для ФСС на данный момент с помощью Browser plug-in не представляется возможным. |
Выше только звезды |
2 пользователей поблагодарили SkySandy за этот пост.
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,432
Сказал(а) «Спасибо»: 37 раз Поблагодарили: 574 раз в 400 постах
|
Постараемся поправить. Запрос для ориентира - CADES-2472. |
|
2 пользователей поблагодарили Русев Андрей за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.01.2023(UTC) Сообщений: 18 Откуда: Москва Сказал «Спасибо»: 1 раз Поблагодарили: 15 раз в 9 постах
|
Автор: Андрей Русев Постараемся поправить. Запрос для ориентира - CADES-2472. Я так понимаю Вы должны ввести новое свойство для SymmetricAlgorithm? Иначе не смогут быть зашифрованы-расшифрованы старые сообщения. Да еще. Это будет несомненное движение вперед но проблему не решит, потому что кроме алгоритма шифрования есть и другие параметры которые не устанавливаются при шифровке-расшифровке информации (единственный параметр который у Вас есть это KP_IV) Мне пришлось дизассемблировать весь SymmetricAlgorithm, что бы понять что у вас с ней не так. Поэтому могу делать такое заявление )) |
Выше только звезды |
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close