logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline m_sh_m  
#1 Оставлено : 3 июля 2019 г. 12:08:14(UTC)
m_sh_m

Статус: Участник

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

Добрый день!
При попытке шифрования файла с помощью CMSCipher.java из samples.jar, возникает ошибка ASNDecodeException: Unknown ASN tag: 12

Подскажите пожалуйста в чём может быть проблема.

Заранее спасибо!

Отредактировано пользователем 3 июля 2019 г. 12:57:35(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 3 июля 2019 г. 18:22:13(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Здравствуйте. Какая задача поставлена, какой формат сообщения должен быть получен?
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#3 Оставлено : 4 июля 2019 г. 15:20:10(UTC)
m_sh_m

Статус: Участник

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

Добрый день!

Задача зашифровать сообщение по ГОСТ-28147-89 использую сертификат получателя и упаковать это всё в контейнер PKCS#/CMS.

Offline Евгений Афанасьев  
#4 Оставлено : 4 июля 2019 г. 15:47:38(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Посмотрите пример PKCS7EnvEphTransport в samples-sources.jar/CMS_samples.
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#5 Оставлено : 4 июля 2019 г. 16:51:29(UTC)
m_sh_m

Статус: Участник

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

Да, забыл написать, использовали класс PKCS7EnvEphTransport: всё работало(был сертификат ГОСТ 2001).

Потом получающая сторона пристала новый сертификат(ГОСТ 2012) и у них перестало расшифровываться.
Может необходимо что-то поменять при шифровании или формировании контейнера?

P.S. Пробовали шифровать утилитой cryptcp.x64.exe - у клиента всё расшифровывается.
Offline Евгений Афанасьев  
#6 Оставлено : 4 июля 2019 г. 16:53:39(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Пример PKCS7EnvEphTransport был взят из последних сборок?
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#7 Оставлено : 4 июля 2019 г. 16:57:29(UTC)
m_sh_m

Статус: Участник

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

версия jcp-2.0.39014
Offline Евгений Афанасьев  
#8 Оставлено : 4 июля 2019 г. 17:00:42(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Посмотрите в последней сборке.
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#9 Оставлено : 5 июля 2019 г. 14:46:05(UTC)
m_sh_m

Статус: Участник

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

проверили на jcp-2.0.40035

Принимающей стороне не удалось расшифровать(

Также попробовали CMSCipher из cmsuil: получили ошибку cmsutil.asn1.ASNDecodeException: Unknown ASN tag: 12
Offline Евгений Афанасьев  
#10 Оставлено : 5 июля 2019 г. 14:48:37(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Если есть возможность, сделайте, пожалуйста, зашифрованное сообщение в адрес какого-нибудь тестового контейнера, который сможете предоставить, а потом приложите тут зашифрованное сообщение и ключевой контейнер, чтобы можно было проверить (расшифровать).
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#11 Оставлено : 10 июля 2019 г. 12:16:05(UTC)
m_sh_m

Статус: Участник

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

Добрый день!
извиняюсь за задержку...

Тестовый контейнер:
rnd-C-E3.000.zip (4kb) загружен 1 раз(а).

Данные по контейнеру:
alias: rnd-C-E340-13AE-7B71-858E-B6F2-127E-3A50
пароль не установлен

Архив с сертификатом, оригинальным и зашифрованным сообщениями:
files.zip (3kb) загружен 1 раз(а).

Текст ошибки:

java.security.InvalidKeyException: Wrapped key is invalid

at ru.CryptoPro.JCP.Key.SecretKeySpec.unwrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.GostCoreCipher.engineUnwrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.BaseGostCipher.engineUnwrap(Unknown Source)
at javax.crypto.Cipher.unwrap(Cipher.java:2549)


Offline Евгений Афанасьев  
#12 Оставлено : 11 июля 2019 г. 10:21:05(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Здравствуйте.
Приведите код, с помощью которого шифруете.
Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#13 Оставлено : 11 июля 2019 г. 12:51:51(UTC)
m_sh_m

Статус: Участник

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

Шифруем сообщения с помощью класса: PKCS7EnvEphTransport из пакета samples

Ниже методы, которые непосредственно используются. Добавился только метод, который загружает сертификат из файловой системы.

Код:

    /**
     * Зашифрование PKCS7 (Enveloped).
     * <p>
     * //     * @param recipientAlias - алиас получателя (сертификат).
     *
     * @param fileToEncrypt - файл для шифрования
     * @return зашифрованное PKCS7 (Enveloped).
     * @throws Exception
     */
    public Path EncryptPKCS7(Path fileToEncrypt) throws Exception {
        final byte[] pkcs7Data = FileUtils.readFileToByteArray(fileToEncrypt.toFile());
        final X509Certificate recipientCert = loadCert(clientCertPath);

        byte[] encryptedData = EncryptPKCS7(recipientCert, pkcs7Data);

        Path encryptedFile = fileToEncrypt.resolveSibling(fileToEncrypt.getFileName() + FileStoreService.ENC_EXT);
        Array.writeFile(encryptedFile.toFile(), encryptedData);
        return encryptedFile;
    }

    public static byte[] EncryptPKCS7(X509Certificate recipientCert, byte[] pkcs7) throws Exception {

        final PublicKey recipientPublic = recipientCert.getPublicKey();

        // Генерирование симметричного ключа с параметрами
        // шифрования из контрольной панели.

        final KeyGenerator kg = KeyGenerator.getInstance(CMStools.SEC_KEY_ALG_NAME, CRYPT_PROVIDER_NAME);
        final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();

        kg.init(paramss);
        final SecretKey simm = kg.generateKey();

        // Зашифрование текста на симметричном ключе.

        Cipher cipher = Cipher.getInstance(CIPHER_MODE, CRYPT_PROVIDER_NAME);
        cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);

        final byte[] iv = cipher.getIV();
        final byte[] text = cipher.doFinal(pkcs7, 0, pkcs7.length);

        // Зашифрование симметричного ключа.

        final byte[] keyTransport = wrap(simm, recipientPublic);

        // Формирование CMS-сообщения.

        final ContentInfo all = new ContentInfo();
        all.contentType = new Asn1ObjectIdentifier(new OID(CMStools.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 AlgIdInterface algid = new AlgIdSpec(JCP.GOST_EL_KEY_OID);
        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 = recipientCert.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(recipientCert.getSerialNumber());

        keytrans.rid.set_issuerAndSerialNumber(issuer);
        dbuf.reset();

        keytrans.encryptedKey = new EncryptedKey(keyTransport);
        ebuf.reset();

        cms.recipientInfos.elements[0].set_ktri(keytrans);
        cms.encryptedContentInfo = new EncryptedContentInfo();

        final OID contentType = new OID(CMStools.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.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();
    }

    private static byte[] wrap(SecretKey secretKey, Key recipientKey) throws Exception {

        // Генерация эфемерной пары.

        KeyPairGenerator kgp = KeyPairGenerator.getInstance(
                JCP.GOST_EL_DH_EPH_NAME,
                CRYPT_PROVIDER_NAME
        );

        // Устанавливаем нужные параметры, как у получателя.

        kgp.initialize(new X509PublicKeySpec(recipientKey.getEncoded()));

        // Генерируем эфемерную пару.

        KeyPair ephPair = kgp.generateKeyPair();

        PrivateKey privateKey = ephPair.getPrivate();
        PublicKey publicKey = ephPair.getPublic();

        byte[] syncro = new byte[8];
        SecureRandom random = SecureRandom.getInstance(JCP.CP_RANDOM, PROVIDER_NAME);
        random.nextBytes(syncro);

        IvParameterSpec iv = new IvParameterSpec(syncro);
        OID oid = CryptParamsSpec.OID_Crypt_VerbaO;

        // Выработка ключа согласования.

        KeyAgreement ka = KeyAgreement.getInstance(privateKey.getAlgorithm(), CRYPT_PROVIDER_NAME);
        ka.init(privateKey, iv);

        ka.doPhase(recipientKey, true);
        Key dh = ka.generateSecret(CIPHER);

        //Зашифрование симметричного ключа на ключе согласования
        // отправителя.

        final Cipher cipher = Cipher.getInstance(CIPHER, CRYPT_PROVIDER_NAME);
        cipher.init(Cipher.WRAP_MODE, dh, (SecureRandom) null);

        final byte[] wrappedKey = cipher.wrap(secretKey);

        // Упаковка параметров и ключа.

        Gost28147_89_EncryptedKey encryptedKey = new Gost28147_89_EncryptedKey();
        Asn1BerDecodeBuffer decoder = new Asn1BerDecodeBuffer(wrappedKey);
        encryptedKey.decode(decoder);

        byte[] imita = encryptedKey.macKey.value;
        byte[] wrapperKeyBytes = encryptedKey.encryptedKey.value;

        // Кодирование открытого ключа в SubjectPublicKeyInfo.

        byte[] publicKeyBytes = publicKey.getEncoded();
        SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo();

        decoder = new Asn1BerDecodeBuffer(publicKeyBytes);
        publicKeyInfo.decode(decoder);

        // Кодирование GostR3410_KeyTransport.

        GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
        Asn1BerEncodeBuffer encoder = new Asn1BerEncodeBuffer();

        keyTransport.sessionEncryptedKey = new Gost28147_89_EncryptedKey(wrapperKeyBytes, imita);
        keyTransport.transportParameters = new GostR3410_TransportParameters(
                new Gost28147_89_ParamSet(oid.value),
                publicKeyInfo,
                new Asn1OctetString(iv.getIV()));

        keyTransport.encode(encoder);
        return encoder.getMsgCopy();

    }
Offline Евгений Афанасьев  
#14 Оставлено : 11 июля 2019 г. 12:57:59(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 376 раз в 372 постах
Автор: m_sh_m Перейти к цитате

OID oid = CryptParamsSpec.OID_Crypt_VerbaO;

Посмотрите пример шифрования PKCS7EnvEphTransport (метод wrap и т.д.) из последней сборки, сейчас параметры задаются иначе (раньше они совпадали у ключа шифрования и согласования, сейчас могут быть разные, проблема, скорее всего, в том, что в параметрах для импорта ключа лежат не те, что использовались при экспорте).

Техническую поддержку оказываем тут
Наша база знаний
Offline m_sh_m  
#15 Оставлено : 11 июля 2019 г. 14:47:22(UTC)
m_sh_m

Статус: Участник

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

Спасибо!
Заработало в последней сборке!

заменили на:
Код:
OID oid = CryptParamsSpec.OID_Gost28147_89_Rosstandart_TC26_Z_ParamSet

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