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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline coldplay  
#1 Оставлено : 5 июля 2018 г. 11:02:36(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Добрый день. Столкнулся с проблемой некорректного архива получаемого после метода расшифровки. Метод расшифровки взят из пакета CMS_samples.
Если прогнать любой архив в метод ecnrypt а потом через метод decrypt то я получаю валидный архив. Но архив полученный от заказчика на выходе битый (EOF при попытке распаковки).
Зашифрованный файл заказчика отлично расшифровался в криптоарме и архив получился целым и нормально распаковался, но через метод decrypt - он битый. То есть проблема все таки в методе.
Собственно сам метод:
Код:

byte[] decrypt(byte[] data, PrivateKey responderKey) throws Asn1Exception, IOException, NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        String pubKeyAlgorithm = JCP.GOST_DH_2012_256_NAME;
        //разбор CMS-сообщения
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
        final ContentInfo all = new ContentInfo();
        all.decode(dbuf);
        dbuf.reset();
        final EnvelopedData cms = (EnvelopedData) all.content;

        KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();
        if (cms.recipientInfos.elements[0].getChoiceID() == RecipientInfo._KTRI) {
            keytrans =
                    (KeyTransRecipientInfo) (cms.recipientInfos.elements[0].getElement());
        }
        final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
        dbuf = new Asn1BerDecodeBuffer(keytrans.encryptedKey.value);
        final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
        encrKey.decode(dbuf);
        dbuf.reset();
        encrKey.sessionEncryptedKey.encode(ebuf);
        final byte[] wrapKey = ebuf.getMsgCopy();
        ebuf.reset();
        encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
        final byte[] encodedPub = ebuf.getMsgCopy();
        ebuf.reset();
        final byte[] sv = encrKey.transportParameters.ukm.value;
        final Gost28147_89_Parameters params =
                (Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
        final byte[] iv = params.iv.value;
        final OID cipherOID = new OID(params.encryptionParamSet.value);
        final byte[] text = cms.encryptedContentInfo.encryptedContent.value;

        //отправитель - открытый ключ из cms
        final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
//        final KeyFactory kf = KeyFactory.getInstance(pubKeyAlgorithm, storeProviderName);
        final KeyFactory kf = KeyFactory.getInstance(pubKeyAlgorithm, "JCP");
        final PublicKey senderPublic = kf.generatePublic(pspec);

        // выработка ключа согласования получателем
        final KeyAgreement responderKeyAgree =
                KeyAgreement.getInstance(pubKeyAlgorithm, CryptoProvider.PROVIDER_NAME);
        responderKeyAgree.init(responderKey, new IvParameterSpec(sv), null);
        responderKeyAgree.doPhase(senderPublic, true);
        final SecretKey responderSecret = responderKeyAgree
                .generateSecret("GOST28147");

        // Расшифрование симметричного ключа.
        final Cipher cipher = Cipher.getInstance("GOST28147/CFB/NoPadding", CryptoProvider.PROVIDER_NAME);
        cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
        final SecretKey simmKey = (SecretKey) cipher
                .unwrap(wrapKey, null, Cipher.SECRET_KEY);

        // Расшифрование текста на симметричном ключе.
        final GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
        cipher.init(Cipher.DECRYPT_MODE, simmKey, spec, null);
        return cipher.doFinal(text, 0, text.length);
    }

Отредактировано пользователем 5 июля 2018 г. 11:48:34(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 5 июля 2018 г. 12:18:59(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
Не могли бы вы зашифровать подобный архив в адрес сертификата из тестового контейнера? Контейнер можно создать на сайте https://cryptopro.ru/certsrv и приложит вместе с архивом, чтобы можно было воспроизвести ситуацию. Спасибо.

P.S. Посмотрите https://www.cryptopro.ru...spx?g=posts&t=13422, вы не пробовали с последней версией JCP (JCP-916 в changelog: исправлена ошибка передачи параметров шифрования при экспорте/импорте сессионного ключа)?

Отредактировано пользователем 5 июля 2018 г. 12:31:47(UTC)  | Причина: Не указана

Offline coldplay  
#3 Оставлено : 5 июля 2018 г. 18:46:51(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Вообщем это не бага.
Ситуация такая. С двух сторон имеются два сертификата с алгоритмом 2012_256. Коллеги при шифровании выбирают тип криптопровайдера 2001 (как на скриншоте) и шифруют в пользу нашего сертификата.
image
В итоге мой метод выдает zip архив, у которого хидер валидный,первый файл я получаю, а следующий файл выдает EOF(как будто я не угадал режим чипера)

Чтобы получить такой проблемный файл нужно просто зашифровать архив с несколькими файлами, в пользу сертификата с алгоритмом 2012_256, но при выборе типа криптопровайдера выбрать ГОСТ 2001. В итоге метод из пакета CMS_samples работает некорректно.
Проблема в том, что скорее всего коллеги у себя ничего менять не будут, поэтому вопрос в том, как мне изменить этот метод, чтобы получить корректный архив ? Как-то это можно сделать, потому что Криптоарм при расшифровке получает валидный архив.
Просто смена pubKeyAlgorithm на String pubKeyAlgorithm = JCP.GOST_EL_DH_NAME; ничего не дала.

Отредактировано пользователем 5 июля 2018 г. 18:52:55(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 5 июля 2018 г. 19:25:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Если несложно, зашифруйте любой архив такого же размера в адрес какого-нибудь получателя (тестовый контейнер с сертификатом) и приложите его и контейнер.
Offline coldplay  
#5 Оставлено : 6 июля 2018 г. 9:53:04(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
По адресу https://cryptopro.ru/certsrv , есть только один тестовый сертификат с алгоритмом GOST3410EL. То есть с ним я не смогу воспроизвести проблемный шифрованный архив. Есть тестовый сертификат с GOST3410_2012_256 ?
Offline Евгений Афанасьев  
#6 Оставлено : 6 июля 2018 г. 10:10:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Не совсем понимаю, в списке же можно выбрать провайдер, например, CryptoPro GOST R 34.10-2012 Cryptographic Service Provider (это ГОСТ 2012 256). Более новую сборку не пробовали?

Отредактировано пользователем 6 июля 2018 г. 10:11:21(UTC)  | Причина: Не указана

Offline Александр Лавник  
#7 Оставлено : 6 июля 2018 г. 10:11:52(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 776 раз в 718 постах
Автор: coldplay Перейти к цитате
По адресу https://cryptopro.ru/certsrv , есть только один тестовый сертификат с алгоритмом GOST3410EL. То есть с ним я не смогу воспроизвести проблемный шифрованный архив. Есть тестовый сертификат с GOST3410_2012_256 ?


Добрый день.

Есть тестовый УЦ с ГОСТ 34.10-2012 256 бит - здесь.
Техническую поддержку оказываем тут
Наша база знаний
Offline coldplay  
#8 Оставлено : 6 июля 2018 г. 10:23:01(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Автор: afev Перейти к цитате
Не совсем понимаю, в списке же можно выбрать провайдер, например, CryptoPro GOST R 34.10-2012 Cryptographic Service Provider (это ГОСТ 2012 256). Более новую сборку не пробовали?


В том то и дело, что можно. Но заказчик не делает этого. Он оставляет GOST3410EL шифруя в пользу сертификата с GOST R 34.10-2012 (256). В итоге полученный шифрованный архив, не может быть корректно расшифрован методом из CMS_samples.

Александр дал ссылку на нужный тестовый сертификат (спасибо!) и я сейчас сделаю пример проблемного шифрованного архива.
Offline coldplay  
#9 Оставлено : 6 июля 2018 г. 13:26:11(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Так, возникли проблемы при попытке зашифровать в пользу тестового сертификата. Добавили его в личное хранилище, в корневые доверенные, везде куда только можно. Но в меню выбора сертификата при шифровании, его нет.
В списке только не самоподписанные сертификаты добавленные ранее. Как в криптоарме можно зашифровать в пользу самоподписанного сертификата ?

Отредактировано пользователем 6 июля 2018 г. 13:26:42(UTC)  | Причина: Не указана

Offline coldplay  
#10 Оставлено : 9 июля 2018 г. 14:24:24(UTC)
coldplay

Статус: Активный участник

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Хотел получить тестовый сертификат, но не очень понял почему по адресу http://testgost2012.cryp....ru/certsrv/certrqma.asp нельзя создать сертификат с ГОСТ 34.10-2012 ?
image
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.