Статус: Новичок
Группы: Участники
Зарегистрирован: 19.01.2022(UTC) Сообщений: 5 Сказал(а) «Спасибо»: 2 раз
|
Добрый день! Возникли проблемы с шифрованием/расшифрованием сообщений с помощью JCP. Исходные данные: 1) JDK 11 2) JCP 2.0.41940-A 3) Личный сертификат и соответствующий ему закрытый ключ 4) Сертификат ЦБ (с ними интегрируемся), https://www.cbr.ru/Conte...907/sert_vp_18082021.zip5) Крипто АРМ для проверки Файл с кодом JcpService.zip (3kb) загружен 9 раз(а)., сделан на основе примера jcp\samples-sources\CMS_samples\PKCS7EnvEphTransport.java Результат: 1) Функция шифрования (encryptData) отрабатывает без ошибок, однако результат не поддается расшифровке ни через функцию decryptData (функция расшифрования), ни через Крипто АРМ. Ошибка при расшифровании: java.security.InvalidKeyException: Wrapped key is invalid на строке (SecretKey) cipher.unwrap(wrapped, null, Cipher.SECRET_KEY) 2) Файл, зашифрованный с помощью Крипто АРМ, удается расшифровать с помощью decryptData 3) В то же время файл, полученный от ЦБ не удается расшифровать с помощью decryptData (ошибка как в п.1), но удается расшифровать с помощью Крипто АРМ Просьба помочь с ошибкой, возможно подсказать инструменты для более глубокого анализа проблемы.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. Не пробовали с помощью EnvelopedSignature из CAdES.jar? Примерный код: Код:
import ru.CryptoPro.CAdES.EnvelopedSignature;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
byte[] enveloped = ...зашифрованные_данные_(binary)...
X509Certificate recipientCert = ...сертификат_получателя...
PrivateKey recipientKey = ...ключ_получателя...
ByteArrayOutputStream decryptedByteDataStream = new ByteArrayOutputStream();
EnvelopedSignature signature = new EnvelopedSignature(new ByteArrayInputStream(enveloped));
signature.decrypt(recipientCert, recipientKey, decryptedByteDataStream);
byte[] decrypted = decryptedByteDataStream.toByteArray();
|
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.01.2022(UTC) Сообщений: 5 Сказал(а) «Спасибо»: 2 раз
|
Попробовал данный код для расшифрования, успешно расшифрован как собственный файл, зашифрованный через Крипто АРМ, так и файл от ЦБ. Спасибо!
Получается п.3 решен, однако файл, зашифрованный на JCP расшифрованию все равно не поддается. Ошибка та же. Видимо косяк с функцией зашифрования. Можете подсказать, где посмотреть корректный пример для шифрования данных?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Посмотрите PKCS7EnvEphTransport в последнем дистрибутиве JCP, если именно этот пример брался за основу, сравните с имеющимся. Может, он устарел и не учитывает работу, например, с новыми параметрами. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 19.01.2022(UTC) Сообщений: 5 Сказал(а) «Спасибо»: 2 раз
|
Взял пример из более новой версии JCP, все заработало. Спасибо большое!
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.10.2022(UTC) Сообщений: 3
|
Здравствуйте, столкнулся с аналогичной проблемой. Пытался реализовать дешифровку файла С помощью примера jcp\samples-sources\CMS_samples\PKCS7EnvEphTransport.java Получаю ошибку Цитата: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:2553) Код примера Код: public byte[] decryptPKCS7(String keyAlias, char[] keyPass, byte[] data) throws Exception {
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
ContentInfo all = new ContentInfo();
all.decode(dbuf);
dbuf.reset();
EnvelopedData cms = (EnvelopedData)all.content;
new KeyTransRecipientInfo();
if (cms.recipientInfos.elements[0].getChoiceID() == 1) {
KeyTransRecipientInfo keyTrans = (KeyTransRecipientInfo)((KeyTransRecipientInfo)cms.recipientInfos.elements[0].getElement());
byte[] wrapKey = keyTrans.encryptedKey.value;
Gost28147_89_Parameters params = (Gost28147_89_Parameters)cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
byte[] iv = params.iv.value;
OID cipherOID = new OID(params.encryptionParamSet.value);
byte[] text = cms.encryptedContentInfo.encryptedContent.value;
PrivateKey recipientKey = (PrivateKey)keyStore.getKey(keyAlias, keyPass);
SecretKey simmKey = unwrap(wrapKey, recipientKey);
GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
Cipher cipher = Cipher.getInstance(CIPHER_MODE, CRYPT_PROVIDER_NAME);
cipher.init(2, simmKey, spec, (SecureRandom)null);
byte[] result = cipher.doFinal(text, 0, text.length);
return result;
} else {
throw new Exception("Unknown recipient info");
}
}
private SecretKey unwrap(byte[] wrappedKey, Key recipientKey) throws Exception {
GostR3410_KeyTransport keyTransport = new GostR3410_KeyTransport();
Asn1BerDecodeBuffer decoder = new Asn1BerDecodeBuffer(wrappedKey);
keyTransport.decode(decoder);
byte[] wrappedKeyBytes = keyTransport.sessionEncryptedKey.encryptedKey.value;
byte[] imita = keyTransport.sessionEncryptedKey.macKey.value;
Asn1BerEncodeBuffer encoder = new Asn1BerEncodeBuffer();
Gost28147_89_EncryptedKey encryptedKey = new Gost28147_89_EncryptedKey(
new Gost28147_89_Key(wrappedKeyBytes), (Gost28147_89_Key)null, new Gost28147_89_MAC(imita));
encryptedKey.encode(encoder);
byte[] wrapped = encoder.getMsgCopy();
encoder.reset();
keyTransport.transportParameters.ephemeralPublicKey.encode(encoder);
byte[] encodedPublic = encoder.getMsgCopy();
GostPublicKey publicKey = new GostPublicKey(encodedPublic, false);
IvParameterSpec iv = new IvParameterSpec(keyTransport.transportParameters.ukm.value);
OID oid = new OID(keyTransport.transportParameters.encryptionParamSet.value);
CryptParamsSpec uz = CryptParamsSpec.getInstance(oid);
GostCipherSpec params = new GostCipherSpec(iv, uz);
KeyAgreement ka = KeyAgreement.getInstance(recipientKey.getAlgorithm(), CRYPT_PROVIDER_NAME);
ka.init(recipientKey, iv);
ka.doPhase(publicKey, true);
SecretKey dh = ka.generateSecret(SEC_KEY_ALG_NAME);
Cipher cipher = Cipher.getInstance(SEC_KEY_ALG_NAME, CRYPT_PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, dh, params);
return (SecretKey)cipher.unwrap(wrapped, (String)null, Cipher.SECRET_KEY);
}
Так же пытался реализовать с помощью EnvelopedSignature из CAdES.jar ошибка следующая: Цитата: ru.CryptoPro.CAdES.exception.EnvelopedException: Decoding of encrypted context failed at ru.CryptoPro.CAdES.EnvelopedSignature.a(Unknown Source) at ru.CryptoPro.CAdES.EnvelopedSignature.decrypt(Unknown Source)
Исходные параметры: Самоподписанный тестовый сертификат с ключом JDK 8 jcp-2.0.40035 В проекте уже реализовано шифрование файла, пытаюсь расшифровать уже зашифрованный тестовый файл. Подскажите что может быть не так и где искать информацию для более углубленного изучения вопроса. Отредактировано пользователем 6 октября 2022 г. 10:45:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. Если jcp-2.0.40035, то обновите до актуального и JCP, и пример PKCS7EnvEphTransport и попробуйте снова. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.10.2022(UTC) Сообщений: 3
|
Автор: Евгений Афанасьев Здравствуйте. Если jcp-2.0.40035, то обновите до актуального и JCP, и пример PKCS7EnvEphTransport и попробуйте снова. Спасибо, а подскажите, где можно найти пример верифакации прикрепленной подписи в CMS?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Низкоуровневые примеры есть в samples-sources.jar в папке дистрибутива, в пакете CMS_samples, пример CMSVerify. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.10.2022(UTC) Сообщений: 3
|
Автор: Евгений Афанасьев Низкоуровневые примеры есть в samples-sources.jar в папке дистрибутива, в пакете CMS_samples, пример CMSVerify. Извините за глупый вопрос, я немного плаваю в теории. Не совсем понятно, какой метод мне нужно использовать для моего случая. Как понимаю я у меня есть файл подписанный прикрепленной (attached) подписью который после этого зашифрован. Например test.txt.sig.enc Расшифровать мне его удалось, после этого у меня появился файл "test.txt.sig". Теперь мне нужно его верифицировать. Прикрепленная подпись предполагает, что после верификации у меня появится 2 файла test.txt.sig - с подписью и test.txt с данными. В примерах есть 2 метода Код: /** @deprecated */
public static void CMSVerify(byte[] var0, Certificate[] var1, byte[] var2) throws Exception {
CMSVerifyEx(var0, var1, var2, "1.2.643.2.2.9", "GOST3411", "GOST3411withGOST3410EL", "JCP");
}
и Код:private static boolean verifyOnCert(X509Certificate var0, SignerInfo var1, byte[] var2, OID var3, boolean var4, String var5, String var6, String var7) throws Exception {
В первом случае мы принимаем на вход 2 массива байт и вроде как оба должны быть контенты, непонятно что должно быть во втором массиве? Во втором случае мы передаем один массив и на выходе только получаем признак boolean. Вопрос как получить test.txt с данными? Спасибо) Отредактировано пользователем 12 октября 2022 г. 15:30:20(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close