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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Chemannnnn  
#1 Оставлено : 17 декабря 2024 г. 15:17:34(UTC)
Chemannnnn

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

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

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 2 раз в 1 постах
Здравствуйте!

Для шифрования данных сертификатом открытого ключа получателя зашифрованных данных использовали пример из файла: "..\jcp-2.0.41940-A\samples-sources\CMS_samples\PKCS7EnvEphTransport.java".
Теперь возникла потребность шифровать данные на несколько сертификатов открытого ключа.
Например, при смене сертификата открытого ключа (истекает срок действия) получателем зашифрованных данных, можно было бы некоторое время (период перехода на новый сертификат открытого ключа) шифровать обеими сертификатами открытого ключа получателя зашифрованных данных.

Подскажите пожалуйста пример такого кода (в "..\jcp-2.0.41940-A\samples-sources\" найти не удалось).
Или, если такого примера кода нет, подскажите как модифицировать пример шифрования из файла "..\jcp-2.0.41940-A\samples-sources\CMS_samples\PKCS7EnvEphTransport.java", таким образом чтобы была возможность зашифровать данные с использованием нескольких сертификатов открытого ключа. А расшифровать такие зашифрованные данные можно было бы любым из закрытых ключей, соответствующих этим открытым ключам.

Отредактировано пользователем 17 декабря 2024 г. 15:22:39(UTC)  | Причина: Не указана

Offline Chemannnnn  
#2 Оставлено : 20 декабря 2024 г. 13:21:43(UTC)
Chemannnnn

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

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

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 2 раз в 1 постах
Реализовано как в примере из Руководства разработчика на странице 70:
Код:
//Пример зашифрования сообщения в адрес получателя.
// Буфер для сохранения подписи Enveloped CMS
ByteArrayOutputStream envelopedByteArrayOutStream = new ByteArrayOutputStream();
// Создание объекта Enveloped CMS
EnvelopedSignature signature = new EnvelopedSignature();
// Добавление получателя (сертификат). При расшифровании получатель
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate); // структура key_trans,
// допускается только ключ обмена
// или
// signature.addKeyAgreeRecipient(recipientCertificate); // структура key_agree
// Инициализация Enveloped CMS буфером для сохранения подписи
signature.open(envelopedByteArrayOutStream);
// Подготовленные данные для зашифрования —строка или подпись,
// полученная с помощью CMSSign (samples.jar) или CAdES API
byte[] data = ...
// Зашифрование данных data
signature.update(data, 0, data.length);
// Формирование подписи Enveloped CMS
signature.close();
// Получение подписи в формате Enveloped CMS в буфер
byte[] envelopedByteData = envelopedByteArrayOutStream.toByteArray();
Пример расшифрования сообщения получателем.
// Буфер для сохранения расшифрованных данных
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
// Прочитанное в буфер сообщение формата Enveloped CMS
byte[] envelopedByteData = ...
// Создание объекта Enveloped CMS с передачей ему буфера подписи для расшифрования
signature = new EnvelopedSignature(new ByteArrayInputStream(envelopedByteData));
// Расшифрование подписи на закрытом ключе получателя с записью
// расшифрованных данных в буфер decryptedByteDataStream
signature.decrypt(recipientCertificate, recipientPrivateKey, decryptedByteDataStream);
// Получение расшифрованных данных — строки или подпись, которую можно
// далее проверить с помощью CMSVerify (samples.jar) или CAdES.jar
byte[] decryptedByteData = decryptedByteDataStream.toByteArray();


Множество сертификатов получателя (по одному) добавляется оператором:
Код:
...
// будет использовать закрытый ключ, соответствующий данному сертификату
signature.addKeyTransRecipient(recipientCertificate); // структура key_trans,
// допускается только ключ обмена
...


Подобный код можно посмотреть в примерах "..\jcp-2.0.41940-A\samples-sources.jar\CAdES\enveloped\EnvelopedDataAsStreamExample.java" и "..\jcp-2.0.41940-A\samples-sources.jar\CAdES\enveloped\EnvelopedDataAsByteArrayExample.java"

Важно, чтобы загрузка провайдеров
Код:
        // Добавляем провайдеры
        Security.addProvider(new JCP());
        Security.addProvider(new CryptoProvider());
        Security.addProvider(new RevCheck());

        JCPInit.initProviders(false);

        // Этот вызов делается автоматически при использовании
        // класса CAdESSignature, однако тут необходимо его выполнить
        // специально, т.к. начинаем работать с ГОСТ без упоминания
        // CAdESSignature.
        CAdESUtility.initJCPAlgorithms();

выполнялась раньше загрузки сертификатов открытого ключа (сертификаты получателя, на которых выполняется шифрование) из хранилища сертификатов.

Отредактировано пользователем 20 декабря 2024 г. 13:23:58(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#3 Оставлено : 20 декабря 2024 г. 23:10:26(UTC)
Санчир Момолдаев

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

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

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

...
            for (X509Certificate walk : certs)
                envelopedSignature.addKeyAgreeRecipient(walk);
...
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.