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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline oleg_vd  
#1 Оставлено : 19 января 2022 г. 14:52:58(UTC)
oleg_vd

Статус: Новичок

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

Сказал(а) «Спасибо»: 2 раз
Добрый день!
Возникли проблемы с шифрованием/расшифрованием сообщений с помощью JCP.

Исходные данные:
1) JDK 11
2) JCP 2.0.41940-A
3) Личный сертификат и соответствующий ему закрытый ключ
4) Сертификат ЦБ (с ними интегрируемся), https://www.cbr.ru/Conte...907/sert_vp_18082021.zip
5) Крипто АРМ для проверки

Файл с кодом JcpService.zip (3kb) загружен 8 раз(а)., сделан на основе примера jcp\samples-sources\CMS_samples\PKCS7EnvEphTransport.java

Результат:
1) Функция шифрования (encryptData) отрабатывает без ошибок, однако результат не поддается расшифровке ни через функцию decryptData (функция расшифрования), ни через Крипто АРМ. Ошибка при расшифровании: java.security.InvalidKeyException: Wrapped key is invalid на строке (SecretKey) cipher.unwrap(wrapped, null, Cipher.SECRET_KEY)
2) Файл, зашифрованный с помощью Крипто АРМ, удается расшифровать с помощью decryptData
3) В то же время файл, полученный от ЦБ не удается расшифровать с помощью decryptData (ошибка как в п.1), но удается расшифровать с помощью Крипто АРМ

Просьба помочь с ошибкой, возможно подсказать инструменты для более глубокого анализа проблемы.
Offline Евгений Афанасьев  
#2 Оставлено : 19 января 2022 г. 15:28:18(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Не пробовали с помощью EnvelopedSignature из CAdES.jar?
Примерный код:
Код:

import ru.CryptoPro.CAdES.EnvelopedSignature;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
byte[] enveloped = ...зашифрованные_данные_(binary)...
X509Certificate recipientCert = ...сертификат_получателя...
PrivateKey recipientKey = ...ключ_получателя...
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
EnvelopedSignature signature = new EnvelopedSignature(new ByteArrayInputStream(enveloped));
signature.decrypt(recipientCert, recipientKey, decryptedByteDataStream);
byte[] decrypted = decryptedByteDataStream.toByteArray();
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
oleg_vd оставлено 19.01.2022(UTC)
Offline oleg_vd  
#3 Оставлено : 19 января 2022 г. 16:04:03(UTC)
oleg_vd

Статус: Новичок

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

Сказал(а) «Спасибо»: 2 раз
Попробовал данный код для расшифрования, успешно расшифрован как собственный файл, зашифрованный через Крипто АРМ, так и файл от ЦБ. Спасибо!

Получается п.3 решен, однако файл, зашифрованный на JCP расшифрованию все равно не поддается. Ошибка та же. Видимо косяк с функцией зашифрования. Можете подсказать, где посмотреть корректный пример для шифрования данных?
Offline Евгений Афанасьев  
#4 Оставлено : 19 января 2022 г. 16:45:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Посмотрите PKCS7EnvEphTransport в последнем дистрибутиве JCP, если именно этот пример брался за основу, сравните с имеющимся. Может, он устарел и не учитывает работу, например, с новыми параметрами.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
oleg_vd оставлено 19.01.2022(UTC)
Offline oleg_vd  
#5 Оставлено : 19 января 2022 г. 17:18:00(UTC)
oleg_vd

Статус: Новичок

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

Сказал(а) «Спасибо»: 2 раз
Взял пример из более новой версии JCP, все заработало. Спасибо большое!
Offline nazgul256  
#6 Оставлено : 6 октября 2022 г. 10:44:20(UTC)
nazgul256

Статус: Новичок

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

Здравствуйте, столкнулся с аналогичной проблемой. Пытался реализовать дешифровку файла С помощью примера jcp\samples-sources\CMS_samples\PKCS7EnvEphTransport.java Получаю ошибку
Цитата:
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:2553)


Код примера

Код:
    public byte[] decryptPKCS7(String keyAlias, char[] keyPass, byte[] data) throws Exception {
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
        ContentInfo all = new ContentInfo();
        all.decode(dbuf);
        dbuf.reset();
        EnvelopedData cms = (EnvelopedData)all.content;
        new KeyTransRecipientInfo();
        if (cms.recipientInfos.elements[0].getChoiceID() == 1) {
            KeyTransRecipientInfo keyTrans = (KeyTransRecipientInfo)((KeyTransRecipientInfo)cms.recipientInfos.elements[0].getElement());
            byte[] wrapKey = keyTrans.encryptedKey.value;
            Gost28147_89_Parameters params = (Gost28147_89_Parameters)cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
            byte[] iv = params.iv.value;
            OID cipherOID = new OID(params.encryptionParamSet.value);
            byte[] text = cms.encryptedContentInfo.encryptedContent.value;
            PrivateKey recipientKey = (PrivateKey)keyStore.getKey(keyAlias, keyPass);
            SecretKey simmKey = unwrap(wrapKey, recipientKey);
            GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
            Cipher cipher = Cipher.getInstance(CIPHER_MODE, CRYPT_PROVIDER_NAME);
            cipher.init(2, simmKey, spec, (SecureRandom)null);
            byte[] result = cipher.doFinal(text, 0, text.length);
            return result;
        } else {
            throw new Exception("Unknown recipient info");
        }
    }

    private  SecretKey unwrap(byte[] wrappedKey, Key recipientKey) throws Exception {
        GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
        Asn1BerDecodeBuffer decoder = new Asn1BerDecodeBuffer(wrappedKey);
        keyTransport.decode(decoder);
        byte[] wrappedKeyBytes = keyTransport.sessionEncryptedKey.encryptedKey.value;
        byte[] imita = keyTransport.sessionEncryptedKey.macKey.value;
        Asn1BerEncodeBuffer encoder = new Asn1BerEncodeBuffer();
        Gost28147_89_EncryptedKey encryptedKey = new Gost28147_89_EncryptedKey(
                new Gost28147_89_Key(wrappedKeyBytes), (Gost28147_89_Key)null, new Gost28147_89_MAC(imita));
        encryptedKey.encode(encoder);
        byte[] wrapped = encoder.getMsgCopy();
        encoder.reset();

        keyTransport.transportParameters.ephemeralPublicKey.encode(encoder);

        byte[] encodedPublic = encoder.getMsgCopy();
        GostPublicKey publicKey = new GostPublicKey(encodedPublic, false);

        IvParameterSpec iv = new IvParameterSpec(keyTransport.transportParameters.ukm.value);

        OID oid = new OID(keyTransport.transportParameters.encryptionParamSet.value);
        CryptParamsSpec uz = CryptParamsSpec.getInstance(oid);
        GostCipherSpec params = new GostCipherSpec(iv, uz);

        KeyAgreement ka = KeyAgreement.getInstance(recipientKey.getAlgorithm(), CRYPT_PROVIDER_NAME);
        ka.init(recipientKey, iv);
        ka.doPhase(publicKey, true);
        SecretKey dh = ka.generateSecret(SEC_KEY_ALG_NAME);
        Cipher cipher = Cipher.getInstance(SEC_KEY_ALG_NAME, CRYPT_PROVIDER_NAME);
        cipher.init(Cipher.UNWRAP_MODE, dh, params);
        return (SecretKey)cipher.unwrap(wrapped, (String)null, Cipher.SECRET_KEY);
    }

Так же пытался реализовать с помощью EnvelopedSignature из CAdES.jar
ошибка следующая:
Цитата:

ru.CryptoPro.CAdES.exception.EnvelopedException: Decoding of encrypted context failed
at ru.CryptoPro.CAdES.EnvelopedSignature.a(Unknown Source)
at ru.CryptoPro.CAdES.EnvelopedSignature.decrypt(Unknown Source)


Исходные параметры:
Самоподписанный тестовый сертификат с ключом
JDK 8
jcp-2.0.40035

В проекте уже реализовано шифрование файла, пытаюсь расшифровать уже зашифрованный тестовый файл. Подскажите что может быть не так и где искать информацию для более углубленного изучения вопроса.

Отредактировано пользователем 6 октября 2022 г. 10:45:34(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#7 Оставлено : 6 октября 2022 г. 11:18:32(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Если jcp-2.0.40035, то обновите до актуального и JCP, и пример PKCS7EnvEphTransport и попробуйте снова.
Offline nazgul256  
#8 Оставлено : 12 октября 2022 г. 11:21:37(UTC)
nazgul256

Статус: Новичок

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

Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
Если jcp-2.0.40035, то обновите до актуального и JCP, и пример PKCS7EnvEphTransport и попробуйте снова.


Спасибо, а подскажите, где можно найти пример верифакации прикрепленной подписи в CMS?

Offline Евгений Афанасьев  
#9 Оставлено : 12 октября 2022 г. 12:41:57(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Низкоуровневые примеры есть в samples-sources.jar в папке дистрибутива, в пакете CMS_samples, пример CMSVerify.
Offline nazgul256  
#10 Оставлено : 12 октября 2022 г. 15:24:07(UTC)
nazgul256

Статус: Новичок

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

Автор: Евгений Афанасьев Перейти к цитате
Низкоуровневые примеры есть в samples-sources.jar в папке дистрибутива, в пакете CMS_samples, пример CMSVerify.


Извините за глупый вопрос, я немного плаваю в теории. Не совсем понятно, какой метод мне нужно использовать для моего случая. Как понимаю я у меня есть файл подписанный прикрепленной (attached) подписью который после этого зашифрован. Например test.txt.sig.enc Расшифровать мне его удалось, после этого у меня появился файл "test.txt.sig". Теперь мне нужно его верифицировать. Прикрепленная подпись предполагает, что после верификации у меня появится 2 файла test.txt.sig - с подписью и test.txt с данными. В примерах есть 2 метода
Код:
    /** @deprecated */
    public static void CMSVerify(byte[] var0, Certificate[] var1, byte[] var2) throws Exception {
        CMSVerifyEx(var0, var1, var2, "1.2.643.2.2.9", "GOST3411", "GOST3411withGOST3410EL", "JCP");
    }


и

Код:
private static boolean verifyOnCert(X509Certificate var0, SignerInfo var1, byte[] var2, OID var3, boolean var4, String var5, String var6, String var7) throws Exception {


В первом случае мы принимаем на вход 2 массива байт и вроде как оба должны быть контенты, непонятно что должно быть во втором массиве?
Во втором случае мы передаем один массив и на выходе только получаем признак boolean. Вопрос как получить test.txt с данными? Спасибо)

Отредактировано пользователем 12 октября 2022 г. 15:30:20(UTC)  | Причина: Не указана

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