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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline idzol  
#1 Оставлено : 6 марта 2020 г. 14:39:28(UTC)
idzol

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

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

Сказал(а) «Спасибо»: 2 раз
Доброго дня
Столкнулись с такой проблемой. Шифруем данные через jcp-2.0.40502 на сертификат получателя.
Алгоритм в сертификате 2012-256, но в нем указаны нестандартные параметры шифрования 1.2.643.2.2.35.1
Ключевая пара на нашей стороне создана с параметрами 1.2.643.2.2.36.0 (настройка по умолчанию в панели управления jcp)
В результате вылетает исключение
Код:
Caused by: java.security.InvalidKeyException: Parameters mismatch
	at ru.CryptoPro.JCP.Key.PrivateKeySpec.doDHPhase(Unknown Source)
	at ru.CryptoPro.Crypto.Key.KeyAgreement.engineDoPhase(Unknown Source)
	at javax.crypto.KeyAgreement.doPhase(KeyAgreement.java:567)

Если мы создаем нашу ключевую пару с параметрами такими же как в сертификате, то шифрует нормально.
Но тогда, как и следовало ожидать, перестает шифровать на все остальные сертификаты.

В связи с этим есть 2 вопроса
1) это был сертификат выпущен некорректно или это проблема в jcp при проверке на совпадение параметров?
2) если все же проверка работает как и задумано, то в принципе мы могли бы генерировать контейнер и с нужными параметрами,
но в таком случае непонятно как этот oid получить из сертификата. В примерах от jcp ничего похожего нет.
Offline Евгений Афанасьев  
#2 Оставлено : 11 марта 2020 г. 16:14:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Как шифруете в адрес получателя? С помощью эфемерного ключа?
Offline idzol  
#3 Оставлено : 11 марта 2020 г. 17:18:55(UTC)
idzol

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

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

Сказал(а) «Спасибо»: 2 раз
Доброго дня.

Автор: Евгений Афанасьев Перейти к цитате
Как шифруете в адрес получателя? С помощью эфемерного ключа?

да, именно так

Собственно вот кусок кода

Код:

    @Override
    public byte[] encrypt(byte[] data, X509Certificate recipientCert)
            throws EncryptionException {
        Log.info("Шифрование данных начато");

        try {
            PublicKey recipientPublicKey = recipientCert.getPublicKey();

далее мы читаем из HDImageStore заранее сгенерированную ключевую пару с нужным алгоритмом, но эта пара сгенерирована с параметрами по умолчанию в панели управления jcp
и они не такие же как в сертификате получателя
Код:

            KeyPair senderKeyPair = getEncryptSenderKeyPair(recipientPublicKey.getAlgorithm());

            Log.info("Загружена ключевая пара отправителя");

            // выработка ключа согласования отправителем
            KeyAgreement senderKeyAgreement = KeyAgreement.getInstance(senderKeyPair.getPublic().getAlgorithm(), CryptoProvider.PROVIDER_NAME);
            senderKeyAgreement.init(senderKeyPair.getPrivate(), new IvParameterSpec(sv), null);
            senderKeyAgreement.doPhase(recipientPublicKey, true);

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

            Log.info("Выработан ключ согласования");

            SecretKey senderSecret = senderKeyAgreement.generateSecret(CryptoProvider.GOST_CIPHER_NAME);

            KeyGenerator kg = KeyGenerator.getInstance(CryptoProvider.GOST_CIPHER_NAME, CryptoProvider.PROVIDER_NAME);

            SecretKey symmKey = kg.generateKey();

            Log.info("Выработан симметричный ключ");

            // Зашифрование текста на симметричном ключе.
            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
            cipher.init(Cipher.ENCRYPT_MODE, symmKey, (SecureRandom) null);
            final byte[] iv = cipher.getIV();
            final byte[] encryptedData = cipher.doFinal(data, 0, data.length);

            ...
    }

Offline Евгений Афанасьев  
#4 Оставлено : 11 марта 2020 г. 18:19:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
getEncryptSenderKeyPair(recipientPublicKey.getAlgorithm()) принимает всего лишь алгоритм, а надо ещё и параметры ключа получателя. То есть нужны все параметры ключа, чтобы сделать подобную пару, так как параметры сторон должны совпадать. В samples есть примеры, поищите по словам recipient или wrap unwrap в пакете cms_samples.

Отредактировано пользователем 11 марта 2020 г. 18:20:38(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
idzol оставлено 12.03.2020(UTC)
Offline idzol  
#5 Оставлено : 12 марта 2020 г. 18:55:24(UTC)
idzol

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

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

Сказал(а) «Спасибо»: 2 раз
Благодарю, нашел пример
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.