Статус: Активный участник
Группы: Участники
Зарегистрирован: 03.04.2019(UTC) Сообщений: 45  Поблагодарили: 1 раз в 1 постах
|
Автор: Евгений Афанасьев  Здравствуйте. Какой алгоритм открытого ключа у получателя сообщения, у ФСС? ГОСТ 2001? Когда вы шифровали сообщение в их адрес, то шифратор GostTransport, используя сертификат получателя (ФСС), создавал эфемерный ключ с параметрами открытого ключа получателя, т.е. ГОСТ 2001. На своей стороне они потом расшифровали, используя закрытый ключ ГОСТ 2001, которому соответствует сертификат. Далее они вам ответили, используя, видимо, тот ваш сертификат, который вы вложили ранее. Возьмите сообщения CipherValue в документе, сохраните в файлы, декодируйте из base64 в asn1, можно это сделать, например, на сайте lapo.it, и посмотрите, какие параметры в транспортном блоке. они соответствуют параметрам вашего ключа? Добрый день! Да, при отправке ФСС-у 2001. В полученном ответе в тегах то же 2001, но сертификат приложили 2012. Как уверяет ФСС это ни на что не влияет. Что самое забавное если я убираю keyCipher22.init(XMLCipher.UNWRAP_MODE, <здесь мой закрытый ключ>); то возникает та же ошибка в том же самом месте ( java.security.InvalidKeyException: Несоответствие параметров at ru.CryptoPro.JCP.Key.PrivateKeySpec.doDHPhase). А по сути по декомпиленному коду в классе ru.CryptoPro.JCP.Key должно быть if (this.b.getSignParams() == null) {throw new InvalidKeyException(GostPrivateKey.resource.getString("NullParam"));}. Тем самым получается, что переменная this.b пришедшая от GostPrivateKey в классе ru.CryptoPro.Crypto.Key там она как this.a берется черт знает откуда. Выходит что keyCipher22.init(XMLCipher.UNWRAP_MODE, <здесь мой закрытый ключ>); ни на что не влияет. Привожу полностью код, может есть фича, которую я не знаю? Код:
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);
EncryptedData encData=c1.loadEncryptedData(doc,encryptedDataElement);
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);
|