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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline YuriyI  
#1 Оставлено : 17 мая 2018 г. 9:58:25(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
Добрый день.
Тестирую расшифровку контейнера, зашифрованного cryptcp.
Шифровался текст так:
/opt/cprocsp/bin/amd64/cryptcp -encr -der -dn Alias ./test.txt ./test.enc
Пытаюсь расшифровывать так:
Код:
    public byte[] decryptCMS(final byte[] data, final String receiverKeyAlias) {
        //Разворачиваем конверт
        //разбор 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 (receiverKeyAlias != null)
                responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, RECIPIENT_PASSWORD);
            else responderKey = (PrivateKey) keyStore.getKey(RECIPIENT_ALIAS, RECIPIENT_PASSWORD);
        } 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(responderKey.getAlgorithm(), 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(responderKey.getAlgorithm(), 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 = 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;
    }

Падает на этапе: responderKeyAgree.doPhase(senderPublic, true);
Что я делаю не так ?
Offline YuriyI  
#2 Оставлено : 17 мая 2018 г. 11:13:16(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
При отлдке публичный ключ, получаемый из контейнера имеет алгоритм GOST3410EL, а приватный GOST3410DH_2012_512. Это нормально ? Шифровал я 512 байтным ключем.
Offline Евгений Афанасьев  
#3 Оставлено : 17 мая 2018 г. 13:21:09(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Здравствуйте.
Алгоритм, переданный в KeyAgreement первым параметром, особого значения не имеет. Приведите полный стек ошибки.
Offline YuriyI  
#4 Оставлено : 17 мая 2018 г. 13:48:44(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
1111.png (59kb) загружен 6 раз(а).
Offline Евгений Афанасьев  
#5 Оставлено : 17 мая 2018 г. 15:35:19(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Возможно, параметры шифрования разные? В открытом ключе и закрытом.
Offline YuriyI  
#6 Оставлено : 17 мая 2018 г. 16:17:59(UTC)
YuriyI

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

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

Сказал(а) «Спасибо»: 3 раз
Проблема была в CSP:
https://www.cryptopro.ru...aspx?g=posts&t=13852

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

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