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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline coldplay  
#1 Оставлено : 2 апреля 2018 г. 19:18:04(UTC)
coldplay

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

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Для шифрования данных использовал пример из пакета Crypt_samples. Заказчик сменил сертификат на новый в котором из key usage пропал KeyAgreement. В примерах шифрование идет как раз таки с использованием KeyAgreement . Есть ли пример шифрования без использования ключа согласования ?
Offline Евгений Афанасьев  
#2 Оставлено : 3 апреля 2018 г. 11:50:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 715 раз в 675 постах
Какой пример использовали?
Offline coldplay  
#3 Оставлено : 3 апреля 2018 г. 15:45:13(UTC)
coldplay

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

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Пример взят из CMS_samples.

Код:
public byte[] encrypt(byte[] data, X509Certificate responderPublicCert, KeyPair keyPair) {

        try {
            KeyPair kp = keyPair;
            PrivateKey senderKey = kp.getPrivate();
            // выработка ключа согласования отправителем
            final KeyAgreement senderKeyAgree =
                    KeyAgreement.getInstance(responderPublicCert.getPublicKey().getAlgorithm());
            senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
            senderKeyAgree.doPhase(responderPublicCert.getPublicKey(), true);

            final SecretKey secretKey =
                    senderKeyAgree.generateSecret("GOST28147");

            // Генерирование симметричного ключа с параметрами шифрования из контрольной панели.
            final KeyGenerator kg = KeyGenerator.getInstance("GOST28147");
            //final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
            kg.init(AlgIdSpec.getDefaultCryptParams());
            final SecretKey simm = kg.generateKey();

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

            //Зашифрование симметричного ключа на ключе согласования отправителя
            cipher.init(Cipher.WRAP_MODE, secretKey, (SecureRandom) null);
            final byte[] key = cipher.wrap(simm);

            //формирование CMS-сообщения
            final ContentInfo all = new ContentInfo();

            all.contentType =
                    new Asn1ObjectIdentifier(
                            new OID(STR_CMS_OID_ENVELOPED).value);
            final EnvelopedData cms = new EnvelopedData();
            all.content = cms;

            cms.version = new CMSVersion(0);

            cms.recipientInfos = new RecipientInfos(1);
            cms.recipientInfos.elements = new RecipientInfo[1];
            cms.recipientInfos.elements[0] = new RecipientInfo();

            final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();

            keytrans.version = new CMSVersion(0);

            final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
            final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
            final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
                    kp.getPublic().getEncoded());
            spki.decode(dbuff);
            dbuff.reset();
            final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
            final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
            id.encode(ebuf);
            Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
            keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
            keytrans.keyEncryptionAlgorithm.decode(dbuf);
            ebuf.reset();
            dbuf.reset();
            keytrans.rid = new RecipientIdentifier();
            final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
            final X500Principal issuerName = responderPublicCert.getIssuerX500Principal();
            dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
            issuer.issuer = new Name();
            final RDNSequence rnd = new RDNSequence();
            rnd.decode(dbuf);
            issuer.issuer.set_rdnSequence(rnd);
            issuer.serialNumber = new CertificateSerialNumber(
                    responderPublicCert.getSerialNumber());
            keytrans.rid.set_issuerAndSerialNumber(issuer);
            dbuf.reset();
            final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
            dbuf = new Asn1BerDecodeBuffer(key);
            encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
            encrKey.sessionEncryptedKey.decode(dbuf);
            dbuf.reset();
            encrKey.transportParameters = new GostR3410_TransportParameters();
            encrKey.transportParameters.encryptionParamSet =
                    new Gost28147_89_ParamSet(AlgIdSpec.getDefaultCryptParams().getOID().value);
            encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
            dbuf = new Asn1BerDecodeBuffer(
                    kp.getPublic().getEncoded());
            encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
            dbuf.reset();
            encrKey.transportParameters.ukm = new Asn1OctetString(sv);
            encrKey.encode(ebuf);
            keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
            ebuf.reset();
            cms.recipientInfos.elements[0].set_ktri(keytrans);
            cms.encryptedContentInfo = new EncryptedContentInfo();

            final OID contentType = new OID(STR_CMS_OID_DATA);
            cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
            final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
            params.iv = new Gost28147_89_IV(iv);
            params.encryptionParamSet =
                    new Gost28147_89_ParamSet(AlgIdSpec.getDefaultCryptParams().getOID().value);
            cms.encryptedContentInfo.contentEncryptionAlgorithm =
                    new ContentEncryptionAlgorithmIdentifier(
                            _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                            params);
            cms.encryptedContentInfo.encryptedContent = new EncryptedContent(text);
            all.encode(ebuf);
            return ebuf.getMsgCopy();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


Алгоритм для генерации пары ключей берется из публичного ключа получателя. Раньше там был GOST3410EL. К нему прибавляли префикс EPH и генерили пару для шифрования. Все работало. Потом получатель перевыпустил сертификат. В новом алгоритм GOST3410_2012_512 и в нем отсутсвует разрешение на Key Agreement.
Использовал алгоритм с префиксами dh и eth (GOST3410DHEPH_2012_512). Метод стал работать и шифровать сообщение. Но получатель не смог его расшифровать. Теперь не очень понятно, что делать дальше.

UPD использовал пример поактуальнее, с более корректным использованием CryptParamsSpec

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

Offline coldplay  
#4 Оставлено : 3 апреля 2018 г. 17:53:06(UTC)
coldplay

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

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

Сказал(а) «Спасибо»: 18 раз
Поблагодарили: 2 раз в 2 постах
Актуальный пример помог. Ниже для ключа с алгоритмом GOST3410_2012_512

Код:
 static byte[] encrypt2(byte[] buffer, X509Certificate publicCert, KeyPair keyPair) throws Exception {
        CryptParamsSpec crp_params = CryptParamsSpec.getInstance(CryptParamsSpec.Rosstandart_TC26_Z);
        PrivateKey senderKey = keyPair.getPrivate();
        final PublicKey responderPublic = publicCert.getPublicKey();
        // выработка ключа согласования отправителем
        final KeyAgreement senderKeyAgree =
                KeyAgreement.getInstance(publicCert.getPublicKey().getAlgorithm());
        senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
        senderKeyAgree.doPhase(responderPublic, true);
        final SecretKey alisaSecret =
                senderKeyAgree.generateSecret("GOST28147");

        // Генерирование симметричного ключа с параметрами шифрования из контрольной панели.
        final KeyGenerator kg = KeyGenerator.getInstance("GOST28147");
        //final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
        kg.init(/*paramss*/ crp_params);
        final SecretKey simm = kg.generateKey();

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

        //Зашифрование симметричного ключа на ключе согласования отправителя
        cipher.init(Cipher.WRAP_MODE, alisaSecret, (SecureRandom) null);
        final byte[] key = cipher.wrap(simm);

        //формирование CMS-сообщения
        final ContentInfo all = new ContentInfo();
        all.contentType =
                new Asn1ObjectIdentifier(
                        new OID(STR_CMS_OID_ENVELOPED).value);
        final EnvelopedData cms = new EnvelopedData();
        all.content = cms;

        cms.version = new CMSVersion(0);

        cms.recipientInfos = new RecipientInfos(1);
        cms.recipientInfos.elements = new RecipientInfo[1];
        cms.recipientInfos.elements[0] = new RecipientInfo();

        final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();

        keytrans.version = new CMSVersion(0);

        final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
        final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
        final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
                keyPair.getPublic().getEncoded());
        spki.decode(dbuff);
        dbuff.reset();
        final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
        final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
        id.encode(ebuf);
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
        keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
        keytrans.keyEncryptionAlgorithm.decode(dbuf);
        ebuf.reset();
        dbuf.reset();
        keytrans.rid = new RecipientIdentifier();
        final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
        final X500Principal issuerName = publicCert.getIssuerX500Principal();
        dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
        issuer.issuer = new Name();
        final RDNSequence rnd = new RDNSequence();
        rnd.decode(dbuf);
        issuer.issuer.set_rdnSequence(rnd);
        issuer.serialNumber = new CertificateSerialNumber(
                publicCert.getSerialNumber());
        keytrans.rid.set_issuerAndSerialNumber(issuer);
        dbuf.reset();
        final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
        dbuf = new Asn1BerDecodeBuffer(key);
        encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
        encrKey.sessionEncryptedKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters = new GostR3410_TransportParameters();
        encrKey.transportParameters.encryptionParamSet =
                new Gost28147_89_ParamSet(algid.getCryptParams()
                        .getOID().value);
        encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
        dbuf = new Asn1BerDecodeBuffer(
                keyPair.getPublic().getEncoded());
        encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
        dbuf.reset();
        encrKey.transportParameters.ukm = new Asn1OctetString(sv);
        encrKey.encode(ebuf);
        keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
        ebuf.reset();
        cms.recipientInfos.elements[0].set_ktri(keytrans);

        cms.encryptedContentInfo = new EncryptedContentInfo();
        final OID contentType = new OID(STR_CMS_OID_DATA);
        cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
        final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
        params.iv = new Gost28147_89_IV(iv);
        params.encryptionParamSet =
                new Gost28147_89_ParamSet(/*paramss*/crp_params.getOID().value);
        cms.encryptedContentInfo.contentEncryptionAlgorithm =
                new ContentEncryptionAlgorithmIdentifier(
                        _Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
                        params);
        cms.encryptedContentInfo.encryptedContent = new EncryptedContent(text);

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