Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
В Вашей терминологии сертификат = ключевая пара ? Потому что для формирования подписи нужен лишь приватный ключ, судя по коду. Вложение сертификата из ключевой пары опционально.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Ключевой контейнер - закрытый ключ + сертификат. В этом сообщении ошибка еще раньше, в самом начале сообщения: Код:
>dumpasn1 sign_data.txt
0 30 4713: SEQUENCE {
4 06 9: OBJECT IDENTIFIER '1 2 840 113549 1 7 2'
15 A0 4698: [0] {
19 30 4694: SEQUENCE {
23 02 1: INTEGER 1
26 31 14: SET {
28 30 12: SEQUENCE {
30 06 8: OBJECT IDENTIFIER '1 2 643 7 1 1 2 2'
40 05 0: NULL
: }
: }
42 30 2639: SEQUENCE {
46 06 9: OBJECT IDENTIFIER '1 2 840 113549 1 7 1'
57 A0 2624: [0] {
61 04 2620: OCTET STRING
: 73 75 6D 2C 38 30 30 34 2C 32 30 31 38 30 35 31
: 34 2C 31 34 2E 30 35 2E 32 30 31 38 20 30 3A 30
: 30 2C 31 34 2E 30 35 2E 32 30 31 38 20 32 33 3A
: 35 39 2C 32 38 2C 31 38 33 35 30 30 2E 30 30 2C
: 31 38 33 35 30 30 2E 30 30 2C 2C 0A 70 61 79 2C
: 31 34 2E 30 35 2E 32 30 31 38 20 31 31 3A 34 37
: 2C 54 49 4E 4B 4F 46 46 4D 42 2C 33 35 34 32 37
: 38 38 35 32 2C 34 32 31 39 36 31 30 2C 31 35 30
: [ Another 2492 bytes skipped ]
: }
: }
Error: Object length field 81 too large.
Ваше приложение однопоточное? Версия JCP точно 2.0 39442 (обычно выводится в лог)? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
Цитата:Ваше приложение однопоточное? Тесты проходят в однопоточном приложении. Цитата:Версия JCP точно 2.0 39442 (обычно выводится в лог)? Оттуда и взял. Цитата:мая 25, 2018 3:44:31 PM ru.CryptoPro.JCP.tools.Starter check INFO: Loading JCP 2.0 39442 мая 25, 2018 3:44:31 PM ru.CryptoPro.JCP.tools.Starter check INFO: JCP loaded. В этом варианте сертификат вложен. Ранее был прислан вариант без вложенного сертификата. Поэксперементировал еще немного и выяснил, что шифрование каким то образом ломает подписанный контейнер. То есть если просто подписать данные и отвалидировать их - то все хорошо, даже с вложенным сертификатом. Но как только подписанный контейнер прошел этапы шифровки расшифровки - все ломается. Отредактировано пользователем 25 мая 2018 г. 18:48:21(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
Еще более сузил проблему: Шифрую простой текст с помощью cryptcp. При расшифровке получаю кусок оригинального текста + кучу мусора. Пример получаемого файла: ![](/forum2/Themes/soclean/icon_file.gif) test_cryptcp.txt (26kb) загружен 2 раз(а).Шифровал так:cryptcp -encr -der -f ./testik_2012.crt ./test.txt ./test_cryptcp.enc Код расшифровки: Код: //Разворачиваем конверт
//разбор 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 (!StringUtils.isEmpty(receiverKeyPassword)) {
responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, receiverKeyPassword.toCharArray());
} else {
responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, null);
}
} 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(KEY_ALG_NAME, 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(KEY_ALG_NAME, 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 = 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;
Отредактировано пользователем 25 мая 2018 г. 19:17:24(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
Через CAdES расшифровывется нормально. Все остальное работает из исходников работы с CMS.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close