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

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Offline YuriyI  
#21 Оставлено : 25 мая 2018 г. 15:24:52(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
В Вашей терминологии сертификат = ключевая пара ?
Потому что для формирования подписи нужен лишь приватный ключ, судя по коду. Вложение сертификата из ключевой пары опционально.
Offline Евгений Афанасьев  
#22 Оставлено : 25 мая 2018 г. 15:44:18(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Ключевой контейнер - закрытый ключ + сертификат. В этом сообщении ошибка еще раньше, в самом начале сообщения:
Код:

>dumpasn1 sign_data.txt
   0 30 4713: SEQUENCE {
   4 06    9:   OBJECT IDENTIFIER '1 2 840 113549 1 7 2'
  15 A0 4698:   [0] {
  19 30 4694:     SEQUENCE {
  23 02    1:       INTEGER 1
  26 31   14:       SET {
  28 30   12:         SEQUENCE {
  30 06    8:           OBJECT IDENTIFIER '1 2 643 7 1 1 2 2'
  40 05    0:           NULL
            :           }
            :         }
  42 30 2639:       SEQUENCE {
  46 06    9:         OBJECT IDENTIFIER '1 2 840 113549 1 7 1'
  57 A0 2624:         [0] {
  61 04 2620:           OCTET STRING
            :             73 75 6D 2C 38 30 30 34 2C 32 30 31 38 30 35 31
            :             34 2C 31 34 2E 30 35 2E 32 30 31 38 20 30 3A 30
            :             30 2C 31 34 2E 30 35 2E 32 30 31 38 20 32 33 3A
            :             35 39 2C 32 38 2C 31 38 33 35 30 30 2E 30 30 2C
            :             31 38 33 35 30 30 2E 30 30 2C 2C 0A 70 61 79 2C
            :             31 34 2E 30 35 2E 32 30 31 38 20 31 31 3A 34 37
            :             2C 54 49 4E 4B 4F 46 46 4D 42 2C 33 35 34 32 37
            :             38 38 35 32 2C 34 32 31 39 36 31 30 2C 31 35 30
            :                     [ Another 2492 bytes skipped ]
            :           }
            :         }

Error: Object length field 81 too large.

Ваше приложение однопоточное? Версия JCP точно 2.0 39442 (обычно выводится в лог)?
Offline YuriyI  
#23 Оставлено : 25 мая 2018 г. 15:50:09(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
Цитата:
Ваше приложение однопоточное?

Тесты проходят в однопоточном приложении.
Цитата:
Версия JCP точно 2.0 39442 (обычно выводится в лог)?

Оттуда и взял.
Цитата:
мая 25, 2018 3:44:31 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 39442
мая 25, 2018 3:44:31 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.

В этом варианте сертификат вложен. Ранее был прислан вариант без вложенного сертификата.

Поэксперементировал еще немного и выяснил, что шифрование каким то образом ломает подписанный контейнер.
То есть если просто подписать данные и отвалидировать их - то все хорошо, даже с вложенным сертификатом. Но как только подписанный контейнер прошел этапы шифровки расшифровки - все ломается.

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

Offline YuriyI  
#24 Оставлено : 25 мая 2018 г. 17:07:35(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
Еще более сузил проблему:
Шифрую простой текст с помощью cryptcp.
При расшифровке получаю кусок оригинального текста + кучу мусора.
Пример получаемого файла: test_cryptcp.txt (26kb) загружен 2 раз(а).
Шифровал так:cryptcp -encr -der -f ./testik_2012.crt ./test.txt ./test_cryptcp.enc
Код расшифровки:
Код:
      //Разворачиваем конверт
        //разбор CMS-сообщения
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
        final ContentInfo all = new ContentInfo();
        try {
            all.decode(dbuf);
            dbuf.reset();
        } catch (Exception e) {
            throw new RuntimeException("Couldn't read input enveloped data.");
        }
        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();
        try {
            encrKey.decode(dbuf);
            dbuf.reset();
            encrKey.sessionEncryptedKey.encode(ebuf);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't read input enveloped data.");
        }
        final byte[] wrapKey = ebuf.getMsgCopy();
        ebuf.reset();
        try {
            encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't read input enveloped data.");
        }
        final byte[] encodedPub = ebuf.getMsgCopy();
        ebuf.reset();

        final byte[] sv_d = encrKey.transportParameters.ukm.value;
        final Gost28147_89_Parameters params = (Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
        final byte[] iv_d = params.iv.value;
        final OID cipherOID = new OID(params.encryptionParamSet.value);
        final byte[] text = cms.encryptedContentInfo.encryptedContent.value;

        //получатель - закрытый ключ
        final PrivateKey responderKey;
        try {
            if (!StringUtils.isEmpty(receiverKeyPassword)) {
                responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, receiverKeyPassword.toCharArray());
            } else {
                responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, null);
            }
        } catch (Exception e) {
            throw new RuntimeException("Couldn't load private key from storage.");
        }

        //отправитель - открытый ключ из cms
        final PublicKey senderPublic;
        final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
        try {
            final KeyFactory kf = KeyFactory.getInstance(KEY_ALG_NAME, PROVIDER_NAME);
            senderPublic = kf.generatePublic(pspec);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't get public key from the certificate.");
        }

        // выработка ключа согласования получателем
        final KeyAgreement responderKeyAgree;
        try {
            responderKeyAgree = KeyAgreement.getInstance(KEY_ALG_NAME, CRYPT_PROVIDER_NAME);
            responderKeyAgree.init(responderKey, new IvParameterSpec(sv_d), null);
            responderKeyAgree.doPhase(senderPublic, true);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't produce an agreement key.");
        }
        final SecretKey responderSecret;
        try {
            responderSecret = responderKeyAgree.generateSecret(CIPHER);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't produce responder secret key, based on the agreement key.");
        }

        // Расшифрование симметричного ключа.
        final Cipher cipher;
        try {
            cipher = Cipher.getInstance(CIPHER_MODE, CRYPT_PROVIDER_NAME);
            cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't produce cipher.");
        }
        final SecretKey simmKey;
        try {
            simmKey = (SecretKey) cipher.unwrap(wrapKey, null, Cipher.SECRET_KEY);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't produce symmetric key.");
        }
        // Расшифрование текста на симметричном ключе.
        final GostCipherSpec spec = new GostCipherSpec(iv_d, cipherOID);
        final byte[] result;
        try {
            cipher.init(DECRYPT_MODE, simmKey, spec, null);
            result = cipher.doFinal(text, 0, text.length);
        } catch (Exception e) {
            throw new RuntimeException("Couldn't decrypt the payload.");
        }

        return result;

Отредактировано пользователем 25 мая 2018 г. 19:17:24(UTC)  | Причина: Не указана

Offline YuriyI  
#25 Оставлено : 28 мая 2018 г. 10:58:04(UTC)
YuriyI

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

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

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