Статус: Новичок
Группы: Участники
Зарегистрирован: 06.07.2016(UTC) Сообщений: 1 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва
|
Работаю с JCP 2.0.38830 Есть рабочий пакет, который работает без ошибок. Файлы расшифровывает.
Код:package org.moscombank.checkjcp;
import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.tools.Array;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.File;
import java.io.IOException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
import ru.CryptoPro.CAdES.EnvelopedSignature;
import ru.CryptoPro.CAdES.exception.EnvelopedException;
import ru.CryptoPro.CAdES.exception.EnvelopedInvalidRecipientException;
/**
*
* @author xxl
*/
public class OrgMoscombankCheckJCP {
/**
* @param args the command line arguments
* @throws java.security.KeyStoreException
* @throws java.io.IOException
* @throws java.security.NoSuchAlgorithmException
* @throws java.security.cert.CertificateException
* @throws java.security.UnrecoverableKeyException
* @throws javax.crypto.NoSuchPaddingException
* @throws java.security.InvalidKeyException
* @throws java.security.InvalidAlgorithmParameterException
* @throws javax.crypto.IllegalBlockSizeException
* @throws javax.crypto.BadPaddingException
* @throws java.security.NoSuchProviderException
* @throws ru.CryptoPro.CAdES.exception.EnvelopedInvalidRecipientException
* @throws ru.CryptoPro.CAdES.exception.EnvelopedException
*/
static String KEY_ALIAS = "nbki";
static String CERT_ALIAS = "nbki";
public static void main(String[] args) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, EnvelopedInvalidRecipientException, EnvelopedException {
Decrypt ("C:\\tmp\\003\\4N01BB000002_20160705_150021_ticket.zip.enc");
}
public static void Decrypt (String FileIn) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, EnvelopedException, EnvelopedInvalidRecipientException, NoSuchProviderException {
String FileNameOut = FileIn.substring(0,FileIn.length()-4);
//Инициализируем хранилище
final KeyStore ks = KeyStore.getInstance(JCP.HD_STORE_NAME,"JCP");
ks.load(null, null);
//Загружаем ключ шифрования
final PrivateKey responderKey = (PrivateKey) ks.getKey(KEY_ALIAS, null);
//Загружаем сертификат
Certificate Cert = (Certificate) ks.getCertificate(CERT_ALIAS);
//Загружаем шифрованный файл
final byte[] EncyptedBytes = Array.readFile(new File(FileIn));
//Поток для вывода
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
//Расшифровываем через ru.CryptoPro.CAdES.EnvelopedSignature
EnvelopedSignature signature = new EnvelopedSignature(new ByteArrayInputStream(EncyptedBytes));
signature.decrypt((X509Certificate) Cert, responderKey, decryptedByteDataStream);
//Пишем в расшифрованный файл
OutputStream decryptedFileStream = (OutputStream) new FileOutputStream (FileNameOut);
decryptedByteDataStream.writeTo(decryptedFileStream);
}
}
Пытаюсь встроить этот же код в шину Apache Camel:
Код:package org.apache.servicemix.examples.camel;
import java.util.logging.Logger;
import ru.CryptoPro.JCP.JCP;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.UnrecoverableKeyException;
import ru.CryptoPro.CAdES.EnvelopedSignature;
import ru.CryptoPro.CAdES.exception.EnvelopedException;
import ru.CryptoPro.CAdES.exception.EnvelopedInvalidRecipientException;
import org.apache.camel.component.file.GenericFile;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
public class MyTransform {
private static final transient Logger logger = Logger.getLogger(MyTransform.class.getName());
private boolean verbose = false;
private String prefix = "MyTransform";
static String KEY_ALIAS = "nbki";
static String CERT_ALIAS = "nbki";
public Object transform(Exchange exchange) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, EnvelopedInvalidRecipientException, EnvelopedException,KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, EnvelopedException, EnvelopedInvalidRecipientException {
//Инициализируем хранилище
final KeyStore ks = KeyStore.getInstance(JCP.HD_STORE_NAME);
ks.load(null, null);
//Загружаем ключ шифрования
final PrivateKey responderKey = (PrivateKey) ks.getKey(KEY_ALIAS, null);
//Загружаем сертификат
Certificate Cert = (Certificate) ks.getCertificate(CERT_ALIAS);
//Получаем тело файла
Message message = exchange.getIn();
byte[] EncyptedBytes = message.getBody(byte[].class);
//Поток для вывода
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
//Расшифровываем через ru.CryptoPro.CAdES.EnvelopedSignature
EnvelopedSignature signature = new EnvelopedSignature(new ByteArrayInputStream(EncyptedBytes));
signature.decrypt((X509Certificate) Cert, responderKey, decryptedByteDataStream);
return decryptedByteDataStream.toByteArray();
}
public boolean isVerbose() {
return verbose;
}
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
Получаю ошибку:
Код:Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
ru.CryptoPro.CAdES.exception.EnvelopedException: Decoding of encrypted context failed
at ru.CryptoPro.CAdES.EnvelopedSignature.a(Unknown Source)[240:ru.CryptoPro.CAdES.jar:0.0.0]
at ru.CryptoPro.CAdES.EnvelopedSignature.decrypt(Unknown Source)[240:ru.CryptoPro.CAdES.jar:0.0.0]
at org.apache.servicemix.examples.camel.MyTransform.transform(MyTransform.java:87)[246:camel-blueprint:7.0.0.M2]
at sun.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_31]
at java.lang.reflect.Method.invoke(Method.java:483)[:1.8.0_31]
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:177)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:442)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:214)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:178)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)[43:org.apache.camel.camel-core:2.16.3]
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)[43:org.apache.camel.camel-core:2.16.3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)[:1.8.0_31]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)[:1.8.0_31]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)[:1.8.0_31]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)[:1.8.0_31]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_31]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_31]
at java.lang.Thread.run(Thread.java:745)[:1.8.0_31]
Caused by: ru.CryptoPro.CAdES.exception.EnvelopedException: Input cipher initiation failed
at ru.CryptoPro.CAdES.b.a.b.<init>(Unknown Source)[240:ru.CryptoPro.CAdES.jar:0.0.0]
at ru.CryptoPro.CAdES.b.a.c.getRecipientOperator(Unknown Source)[240:ru.CryptoPro.CAdES.jar:0.0.0]
at org.bouncycastle.cms.KeyTransRecipientInformation.getRecipientOperator(Unknown Source)[232:bcpkix:1.50.0]
at org.bouncycastle.cms.RecipientInformation.getContentStream(Unknown Source)[232:bcpkix:1.50.0]
at org.bouncycastle.cms.RecipientInformation.getContent(Unknown Source)[232:bcpkix:1.50.0]
... 28 more
Caused by: java.lang.ClassCastException: ru.CryptoPro.Crypto.Key.GostSecretKey cannot be cast to ru.CryptoPro.JCP.Key.SpecKey
... 33 more
Почему-то метод ru.CryptoPro.CAdES.EnvelopedSignature.decrypt начинает воспринимать секретный ключ как ru.CryptoPro.Crypto.Key.GostSecretKey. Хотя проверка после загрузки ключа показывает, что он ru.CryptoPro.JCP.Key.GostExchPrivateKey. Помогите, пожалуйста, разобраться. Спасибо. Отредактировано пользователем 15 июля 2016 г. 9:19:28(UTC)
| Причина: Не указана
|