Статус: Активный участник
Группы: Участники
Зарегистрирован: 03.04.2019(UTC) Сообщений: 45 Поблагодарили: 1 раз в 1 постах
|
Добрый день! Подскажите, пожалуйста, кто знает. Использую jcp-2.0.39014. Все бьюсь с расшифровкой сообщения от ФСС. Использую ключи тестовой компании 2001 и транспорт 2001. Свое зашифрованное сообщение благополучно расшифровываю, но сообщение от ФСС получаю при расшифровке ошибку: Код:
Exception was java.security.InvalidKeyException
at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1422)
......
java.security.InvalidKeyException
at ru.CryptoPro.Crypto.Cipher.TransportCipher.engineUnwrap(Unknown Source)
at javax.crypto.Cipher.unwrap(Cipher.java:2466)
at org.apache.xml.security.encryption.XMLCipher.decryptKey(XMLCipher.java:1420)
.............
Caused by: 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:2466)
Привожу пример кода: Код:
System.setProperty(Consts.PROPERTY_NAME,Consts.CONFIG);
if(!XmlInit.isInitialized()) XmlInit.init();
if(!org.apache.xml.security.Init.isInitialized()) org.apache.xml.security.Init.init();
db=new DocumentBuilder();
Document doc=db.createResponseDocument(value); //Здесь полное SOAP сообщение
XMLCipher c1=XMLCipher.getInstance(Consts.URI_GOST_CIPHER);
c1.init(XMLCipher.DECRYPT_MODE,null);
Element encKeyElem=(Element)doc.getElementsByTagName("xenc:EncryptedKey").item(0);
Element encryptedDataElement=(Element)doc.getElementsByTagNameNS(EncryptionConstants.EncryptionSpecNS,EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
EncryptedKey encKey=c1.loadEncryptedKey(doc,encKeyElem);
System.out.println("encKey.getCipherData().getCipherValue().getValue()="+encKey.getCipherData().getCipherValue().getValue());//Здесь есть значение ключа
EncryptedData encData=c1.loadEncryptedData(doc,encryptedDataElement);
System.out.println("encData.getCipherData().getCipherValue().getValue()="+encData.getCipherData().getCipherValue().getValue());//Здесь есть данные
XMLCipher c2=XMLCipher.getInstance(Consts.URI_GOST_TRANSPORT);
c2.init(XMLCipher.UNWRAP_MODE,jcpStoreApi.getPrivateKey());
Key sk=c2.decryptKey(encKey,encData.getEncryptionMethod().getAlgorithm());//Здесь возникает ошибка!
c1.init(XMLCipher.DECRYPT_MODE,sk);
c1.doFinal(doc,encryptedDataElement);
На всякий случай значение ключа в ASN.1 Код:SEQUENCE (2 elem)
SEQUENCE (2 elem)
OCTET STRING (32 byte) AEA894E0A34344C6B47D212B00681357C9F90E50520B6A8E6C7838772160249B
OCTET STRING (4 byte) F5B3B5BF
[0] (3 elem)
OBJECT IDENTIFIER 1.2.643.2.2.31.1 cryptoProCipherA (CryptoPro params A (default, variant 'Verba-O') for GOST 28147-89)
[0] (2 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.643.2.2.19 gostPublicKey (GOST R 34.10-2001 (ECC) public key)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.643.2.2.36.0 cryptoProSignXA (CryptoPro ell.curve XA for GOST R 34.10-2001)
OBJECT IDENTIFIER 1.2.643.2.2.30.1 cryptoProDigestA (CryptoPro digest params A (default, variant 'Verba-O') for GOST R 34.11-94)
BIT STRING (1 elem)
OCTET STRING (64 byte) 2139EDCD66F122FE9486DA2487C44574FC61743B6C69FD92DEA1C00DD216511CE6CC3B…
OCTET STRING (8 byte) AEEF8E66D5255B35
Отредактировано пользователем 29 апреля 2019 г. 19:41:01(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 03.04.2019(UTC) Сообщений: 45 Поблагодарили: 1 раз в 1 постах
|
Наконец-то разобрался :).
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.02.2016(UTC) Сообщений: 60
Сказал(а) «Спасибо»: 18 раз Поблагодарили: 2 раз в 2 постах
|
Автор: JfbYtd-7900 Наконец-то разобрался :). Очень рад за вас! Но по правилам хорошего тона, неплохо бы опубликовать решение. Столкнулся с такой же проблемой, хотелось бы узнать как вы ее решили.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 03.04.2019(UTC) Сообщений: 45 Поблагодарили: 1 раз в 1 постах
|
Конечно, там сущий пустяк, о котором наверное знают все :).
Шифрование идет на сертификате ФСС. После того как сообщение зашифровали, нужно ФСС-ный сертификат подменить на свой. Ответ ФСС шифрует на том сертификате, который в зашифрованном сообщении запроса.
|
1 пользователь поблагодарил JfbYtd-7900 за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close