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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline eugene.lenkevich  
#1 Оставлено : 19 августа 2021 г. 13:25:22(UTC)
eugene.lenkevich

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

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

Коллеги, добрый день!

Помогите, пожалуйста, разобраться со следующей проблемой.

Дано
приложение на SpringBoot, jdk11
версия JCP: jcp-2.0.41940-A

Библиотеки JCP засунул в classpath

Сертификат добавлен в хранилище, закрытый ключ на флешке, все это в коде доступно. Плюс обращаюсь к вэб-сервису по ГОСТовскому SSL(другой сертификат, соответственно) так же через JCP и подключение работает.

Далее получаю некоторую зашифрованную строку и ее надо расшифровать закрытым ключом с флешки. Смотрел примеры кода в библиотеке, но они какие то совсем мудреные, вроде как подобная задача должна проще решаться..

Попробовал взять библиотеку bouncycastle (версия 1.69, но пробовал и некоторые более старые - поведение аналогично), получаю исключение о том, что библиотека не подхватила ГОСТовские алгоритмы (вроде как должна, насколько понимаю)

Код:

org.bouncycastle.cms.CMSException: exception unwrapping key: cannot create key agreement: Algorithm 1.2.643.7.1.1.1.1 not available
	at org.bouncycastle.cms.jcajce.JceKeyTransRecipient.extractSecretKey(Unknown Source) ~[bcpkix-jdk15on-1.69.jar:1.69.00.0]
	at org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient.getRecipientOperator(Unknown Source) ~[bcpkix-jdk15on-1.69.jar:1.69.00.0]
	at org.bouncycastle.cms.KeyTransRecipientInformation.getRecipientOperator(Unknown Source) ~[bcpkix-jdk15on-1.69.jar:1.69.00.0]
	at org.bouncycastle.cms.RecipientInformation.getContentStream(Unknown Source) ~[bcpkix-jdk15on-1.69.jar:1.69.00.0]
	at su.meo.emk.ws.CwClient.test(CwClient.java:133) ~[classes/:na]
	at su.meo.emk.EmkApplication.lambda$checkCwVersion$1(EmkApplication.java:54) ~[classes/:na]
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791) ~[spring-boot-2.5.3.jar:2.5.3]
	at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775) ~[spring-boot-2.5.3.jar:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:345) ~[spring-boot-2.5.3.jar:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.3.jar:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.3.jar:2.5.3]
	at su.meo.emk.EmkApplication.main(EmkApplication.java:17) ~[classes/:na]
Caused by: org.bouncycastle.cms.CMSException: cannot create key agreement: Algorithm 1.2.643.7.1.1.1.1 not available
	at org.bouncycastle.cms.jcajce.EnvelopedDataHelper.createKeyAgreement(Unknown Source) ~[bcpkix-jdk15on-1.69.jar:1.69.00.0]
	... 12 common frames omitted
Caused by: java.security.NoSuchAlgorithmException: Algorithm 1.2.643.7.1.1.1.1 not available
	at java.base/javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:192) ~[na:na]
	at org.bouncycastle.jcajce.util.DefaultJcaJceHelper.createKeyAgreement(Unknown Source) ~[bcprov-jdk15on-1.69.jar:1.69.0]
	... 13 common frames omitted


Мой код

Код:

        Security.addProvider(new JCP());
        Security.addProvider(new RevCheck());
        Security.addProvider(new CryptoProvider());
        Security.addProvider(new ru.CryptoPro.ssl.Provider());

        ServiceLoader.load(java.security.Provider.class).stream().forEach(provider -> {
            log.info("Зарегистрирован провайдер {}", provider.get().getName());
        }); //для отладки вывожу все провайдеры

        KeyStore keyStore = KeyStore.getInstance(JCP.FLOPPY_STORE_NAME);
        keyStore.load(null, null);

        var certificate = (X509Certificate) keyStore.getCertificate(alias);
        var key = (PrivateKey) keyStore.getKey(alias, keystorePassword.toCharArray()); // сертификат и закрытый ключ, все на месте

        var authResponse = this.authenticate(...); //некоторая зашифрованная строка

        CMSEnvelopedDataParser parser = new CMSEnvelopedDataParser(authResponse.getAuthenticateResult());
        RecipientInformation recInfo = getSingleRecipient(parser);
        Recipient recipient = new JceKeyTransEnvelopedRecipient(key);

        var decryptedStream = recInfo.getContentStream(recipient).getContentStream(); //<<< Исключение падает вот здесь
...
    private static RecipientInformation getSingleRecipient(CMSEnvelopedDataParser parser) {
        var recInfos = parser.getRecipientInfos().getRecipients();
        var recipientIterator = recInfos.iterator();
        if (!recipientIterator.hasNext()) {
            throw new RuntimeException("Could not find recipient");
        }
        return (RecipientInformation) recipientIterator.next();
    }


У меня такой вопрос
1. Уместно ли вообще использование bouncycastle для работы с JCP и если да, то как подружить ее с ГОСТОвскими алгоритмами?
2. Возможно есть другой способ расшифровки данных закрытым ключом, просьба подсказать куда смотреть, я смотрел документацию, но не нашел там ответа - она достаточно низкого уровня, то же самое с примерами. В частности Decrypt.java. Неужели тут все так сложно делается :)

Требуется ли какая то дополнительная информация?

Спасибо!

Лог запуска

Отредактировано пользователем 19 августа 2021 г. 13:38:52(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 19 августа 2021 г. 15:01:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте. Примеры зашифрования и расшифрования cms есть в папке cades/enveloped, с помощью класса EnvelopedSignature (из модуля Cades.jar).
Offline eugene.lenkevich  
#3 Оставлено : 20 августа 2021 г. 9:39:59(UTC)
eugene.lenkevich

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

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

Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте. Примеры зашифрования и расшифрования cms есть в папке cades/enveloped, с помощью класса EnvelopedSignature (из модуля Cades.jar).


Спасибо большое за подсказку, все заработало! Оставлю кусочек кода, может кому-то еще пригодится

Код:

            ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
            EnvelopedSignature signature = new EnvelopedSignature(new ByteArrayInputStream(authResponse.getAuthenticateResult()));

            signature.decrypt(certificate, privateKey, decryptedByteDataStream);
            byte[] decryptedToken = decryptedByteDataStream.toByteArray();
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.