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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Ensiferum  
#1 Оставлено : 29 января 2014 г. 11:21:09(UTC)
Ensiferum

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

Группы: Участники
Зарегистрирован: 23.08.2012(UTC)
Сообщений: 20
Откуда: Кумертау

Сказал(а) «Спасибо»: 3 раз
Здравствуйте. Пытаюсь написать на криптопро JCP программу, выполняющую расшифровку того, что зашифровано с помощью "cryptcp -encr"

Сначала с помощью JCP создал сертификат receiver и соответствующую ему ключевыую пару. Сертификат установил, чтобы cryptcp смог с ним работать. Шифрую сообщение с помощью cryptcp
Цитата:
C:\Users\admin>"C:\Program Files\Crypto Pro\CSP\cryptcp" -encr -dn "receiver" -der c:\source.txt c:\encr.txt


Использую код из примеров для расшифровки
Код:
// cms-сообщение для расшифрования
        final byte[] buffer = Array.readFile(input_file);

        //разбор CMS-сообщения
        Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(buffer);
        final ContentInfo all = new ContentInfo();
        all.decode(dbuf);
        dbuf.reset();
        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();
        encrKey.decode(dbuf);
        dbuf.reset();
        encrKey.sessionEncryptedKey.encode(ebuf);
        final byte[] wrapKey = ebuf.getMsgCopy();
        ebuf.reset();
        encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
        final byte[] encodedPub = ebuf.getMsgCopy();
        ebuf.reset();
        final byte[] sv = encrKey.transportParameters.ukm.value;
        final Gost28147_89_Parameters params
                = (Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
        final byte[] iv = params.iv.value;
        final OID cipherOID = new OID(params.encryptionParamSet.value);
        final byte[] text = cms.encryptedContentInfo.encryptedContent.value;

        //Загрузка хранилища
        final KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
        hdImageStore.load(null, null);

        //получатель - закрытый ключ
        final PrivateKey responderKey = (PrivateKey) hdImageStore.getKey(ALIAS, STORE_PASS);

        //отправитель - открытый ключ из cms
        final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
        final KeyFactory kf = KeyFactory.getInstance(JCP.GOST_DH_NAME);
        final PublicKey senderPublic = kf.generatePublic(pspec);

        // выработка ключа согласования получателем
        final KeyAgreement responderKeyAgree
                = KeyAgreement.getInstance(JCP.GOST_DH_NAME);
        responderKeyAgree.init(responderKey, new IvParameterSpec(sv), null);
        responderKeyAgree.doPhase(senderPublic, true);
        final SecretKey responderSecret = responderKeyAgree
                .generateSecret("GOST28147");

        // Расшифрование симметричного ключа.
        final Cipher cipher = Cipher.getInstance(CIPHER_ALG);
        cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
        final SecretKey simmKey = (SecretKey) cipher
                .unwrap(wrapKey, null, Cipher.SECRET_KEY);

        // Расшифрование текста на симметричном ключе.
        final GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
        cipher.init(Cipher.DECRYPT_MODE, simmKey, spec, null);
        final byte[] result = cipher.doFinal(text, 0, text.length);

        // Выдергиваем именно текст
        final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(result);
        final ContentInfo cInfo = new ContentInfo();
        cInfo.decode(asnBuf);
        final SignedData cms2 = (SignedData) cInfo.content;
        if (cms2.encapContentInfo.eContent != null) {
            byte[] data = cms2.encapContentInfo.eContent.value;
            System.out.println("OK");
            Array.writeFile(output_file, data);
        }


На строке
Код:
cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
вылетает исключение
Цитата:
Exception in thread "main" java.lang.UnsupportedOperationException
at javax.crypto.CipherSpi.engineGetKeySize(CipherSpi.java:926)
at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1052)
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1010)
at javax.crypto.Cipher.implInit(Cipher.java:786)
at javax.crypto.Cipher.chooseProvider(Cipher.java:849)
at javax.crypto.Cipher.init(Cipher.java:1213)
at sign.Sign.test_decrypt(Sign.java:449)
at sign.Sign.main(Sign.java:179)


Пожалуста, подскажите, то, что шифруется с помощью cryptcp нельзя расшифровать с помощью JCP? Или я не учитываю какие-то детали в алгоритме запаковки зашифрованного сообщения.

PS Шифр должен быть на ключе согласования

Отредактировано пользователем 29 января 2014 г. 11:22:27(UTC)  | Причина: Добавил подсветку кода

Offline Евгений Афанасьев  
#2 Оставлено : 29 января 2014 г. 11:35:56(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Offline Ensiferum  
#3 Оставлено : 29 января 2014 г. 11:50:40(UTC)
Ensiferum

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

Группы: Участники
Зарегистрирован: 23.08.2012(UTC)
Сообщений: 20
Откуда: Кумертау

Сказал(а) «Спасибо»: 3 раз
Спасибо, чуть помогло. Теперь на строке
Код:
cInfo.decode(asnBuf);
вылетает исключение
Цитата:
Exception in thread "main" com.objsys.asn1j.runtime.Asn1InvalidLengthException: Invalid length value.
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeLength(Asn1BerDecodeBuffer.java:120)
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeTagAndLength(Asn1BerDecodeBuffer.java:294)
at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.matchTag(Asn1BerDecodeBuffer.java:335)
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:444)
at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:466)
at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:55)
at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:218)
at sign.Sign.test_decrypt(Sign.java:461)
at sign.Sign.main(Sign.java:179)
Java Result: 1

Это только если пытаться расшифровать сообщение, зашифрованное с помощью cryptcp. Если сообщение зашифровано с помощью JCP, то рашифровка происходит без проблем
Offline Евгений Афанасьев  
#4 Оставлено : 29 января 2014 г. 12:04:02(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Сохраните результат (result) в файл, попробуйте открыть в каком-нибудь asn1-декодировщике.
Offline Ensiferum  
#5 Оставлено : 29 января 2014 г. 12:26:51(UTC)
Ensiferum

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

Группы: Участники
Зарегистрирован: 23.08.2012(UTC)
Сообщений: 20
Откуда: Кумертау

Сказал(а) «Спасибо»: 3 раз
Получилась интересная картина:
Если шифровано с помощью JCP, то исходные текст сообщения нужно доставать из структуры Ans1.
Если шифровано с помощью cryptcp, то исходный текст получается сразу же после расшифровки на ключе.

Какой вариант правильный по ГОСТ?
Offline Евгений Афанасьев  
#6 Оставлено : 29 января 2014 г. 12:46:45(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: Ensiferum Перейти к цитате
Получилась интересная картина:
Если шифровано с помощью JCP, то исходные текст сообщения нужно доставать из структуры Ans1.
Если шифровано с помощью cryptcp, то исходный текст получается сразу же после расшифровки на ключе.

Какой вариант правильный по ГОСТ?


В примере JCP предполагается, что была зашифрована CMS-подпись, потому используется ContentInfo. Если это не CMS (как выясняется), а plain text, то не декодируйте в ContentInfo, а сразу работайте с текстом.

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Ensiferum оставлено 29.01.2014(UTC)
Offline Ensiferum  
#7 Оставлено : 29 января 2014 г. 12:49:51(UTC)
Ensiferum

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

Группы: Участники
Зарегистрирован: 23.08.2012(UTC)
Сообщений: 20
Откуда: Кумертау

Сказал(а) «Спасибо»: 3 раз
Спасибо за консультацию!
Offline vitek-n  
#8 Оставлено : 4 февраля 2014 г. 10:26:55(UTC)
vitek-n

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

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

Здравствуйте,

У меня аналогичная проблема. Мне необходимо расшифровать полученный .p7m файл.
Использую код из того же примера с небольшим изменением. Хранилище ключей находится на Рутокен.
Код:
final KeyStore hdImageStore = KeyStore.getInstance("RutokenStore", "JCP"); 


Но как раз это не проблема. Ключ находится.

Ошибка вылетает позже на строке:
Код:
 final SecretKey simmKey = (SecretKey) cipher.unwrap(wrapKey, null, Cipher.SECRET_KEY);


Цитата:
04.02.2014 10:21:56 ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.54 36641
04.02.2014 10:21:56 ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
Exception in thread "main" java.security.InvalidKeyException: Wrapped key is invalid
at ru.CryptoPro.JCP.Key.SecretKeySpec.unwrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.GostCipher.engineUnwrap(Unknown Source)
at ru.CryptoPro.Crypto.Cipher.Padding5Cipher.engineUnwrap(Unknown Source)
at javax.crypto.Cipher.unwrap(DashoA13*..)
at CMS_samples.CMSDecrypt.main(CMSDecrypt.java:121)


Еще отмечу, что файл корректно расшифровывается утилитой cryptcp:
Цитата:
Цепочки сертификатов проверены.
Расшифрование данных...
Сообщение успешно расшифровано.
Открытие/запуск файла...
[ReturnCode: 0]


Пожалуйста, подскажите, что я делаю не так.

Спасибо.
Offline Евгений Афанасьев  
#9 Оставлено : 4 февраля 2014 г. 11:07:01(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Какой командой получаете зашифрованное сообщение с помощью cryptcp?
Пробовали обратный вариант - зашифровать в jcp и проверить в cryptcp?
Offline vitek-n  
#10 Оставлено : 4 февраля 2014 г. 11:49:27(UTC)
vitek-n

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

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

Файл мне приходит от клиента. Могу только сказать, что используется КриптоПро.
Файлы я не создавал, так что обратный вариант не пробовал.

Для проверки использовал следующую команду:
cryptcp -decr -dn "E=vitek-n@yandex.ru" -pin 12345678 -start test.txt.p7s.p7m test2.txt
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (5)
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.