Статус: Участник
Группы: Участники
Зарегистрирован: 23.08.2012(UTC) Сообщений: 20 Откуда: Кумертау
Сказал(а) «Спасибо»: 3 раз
|
Здравствуйте. Пытаюсь написать на криптопро JCP программу, выполняющую расшифровку того, что зашифровано с помощью "cryptcp -encr" Сначала с помощью JCP создал сертификат receiver и соответствующую ему ключевыую пару. Сертификат установил, чтобы cryptcp смог с ним работать. Шифрую сообщение с помощью cryptcp Цитата:C:\Users\admin>"C:\Program Files\Crypto Pro\CSP\cryptcp" -encr -dn "receiver" -der c:\source.txt c:\encr.txt Использую код из примеров для расшифровки Код:// cms-сообщение для расшифрования
final byte[] buffer = Array.readFile(input_file);
//разбор CMS-сообщения
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(buffer);
final ContentInfo all = new ContentInfo();
all.decode(dbuf);
dbuf.reset();
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();
encrKey.decode(dbuf);
dbuf.reset();
encrKey.sessionEncryptedKey.encode(ebuf);
final byte[] wrapKey = ebuf.getMsgCopy();
ebuf.reset();
encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
final byte[] encodedPub = ebuf.getMsgCopy();
ebuf.reset();
final byte[] sv = encrKey.transportParameters.ukm.value;
final Gost28147_89_Parameters params
= (Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
final byte[] iv = params.iv.value;
final OID cipherOID = new OID(params.encryptionParamSet.value);
final byte[] text = cms.encryptedContentInfo.encryptedContent.value;
//Загрузка хранилища
final KeyStore hdImageStore = KeyStore.getInstance("HDImageStore");
hdImageStore.load(null, null);
//получатель - закрытый ключ
final PrivateKey responderKey = (PrivateKey) hdImageStore.getKey(ALIAS, STORE_PASS);
//отправитель - открытый ключ из cms
final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
final KeyFactory kf = KeyFactory.getInstance(JCP.GOST_DH_NAME);
final PublicKey senderPublic = kf.generatePublic(pspec);
// выработка ключа согласования получателем
final KeyAgreement responderKeyAgree
= KeyAgreement.getInstance(JCP.GOST_DH_NAME);
responderKeyAgree.init(responderKey, new IvParameterSpec(sv), null);
responderKeyAgree.doPhase(senderPublic, true);
final SecretKey responderSecret = responderKeyAgree
.generateSecret("GOST28147");
// Расшифрование симметричного ключа.
final Cipher cipher = Cipher.getInstance(CIPHER_ALG);
cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
final SecretKey simmKey = (SecretKey) cipher
.unwrap(wrapKey, null, Cipher.SECRET_KEY);
// Расшифрование текста на симметричном ключе.
final GostCipherSpec spec = new GostCipherSpec(iv, cipherOID);
cipher.init(Cipher.DECRYPT_MODE, simmKey, spec, null);
final byte[] result = cipher.doFinal(text, 0, text.length);
// Выдергиваем именно текст
final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(result);
final ContentInfo cInfo = new ContentInfo();
cInfo.decode(asnBuf);
final SignedData cms2 = (SignedData) cInfo.content;
if (cms2.encapContentInfo.eContent != null) {
byte[] data = cms2.encapContentInfo.eContent.value;
System.out.println("OK");
Array.writeFile(output_file, data);
}
На строке Код:cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
вылетает исключение Цитата:Exception in thread "main" java.lang.UnsupportedOperationException at javax.crypto.CipherSpi.engineGetKeySize(CipherSpi.java:926) at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1052) at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1010) at javax.crypto.Cipher.implInit(Cipher.java:786) at javax.crypto.Cipher.chooseProvider(Cipher.java:849) at javax.crypto.Cipher.init(Cipher.java:1213) at sign.Sign.test_decrypt(Sign.java:449) at sign.Sign.main(Sign.java:179) Пожалуста, подскажите, то, что шифруется с помощью cryptcp нельзя расшифровать с помощью JCP? Или я не учитываю какие-то детали в алгоритме запаковки зашифрованного сообщения. PS Шифр должен быть на ключе согласования Отредактировано пользователем 29 января 2014 г. 11:22:27(UTC)
| Причина: Добавил подсветку кода
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.08.2012(UTC) Сообщений: 20 Откуда: Кумертау
Сказал(а) «Спасибо»: 3 раз
|
Спасибо, чуть помогло. Теперь на строке вылетает исключение Цитата:Exception in thread "main" com.objsys.asn1j.runtime.Asn1InvalidLengthException: Invalid length value. at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeLength(Asn1BerDecodeBuffer.java:120) at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.decodeTagAndLength(Asn1BerDecodeBuffer.java:294) at com.objsys.asn1j.runtime.Asn1BerDecodeBuffer.matchTag(Asn1BerDecodeBuffer.java:335) at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:444) at com.objsys.asn1j.runtime.Asn1Type.matchTag(Asn1Type.java:466) at ru.CryptoPro.JCP.ASN.CryptographicMessageSyntax.ContentInfo.decode(ContentInfo.java:55) at com.objsys.asn1j.runtime.Asn1Type.decode(Asn1Type.java:218) at sign.Sign.test_decrypt(Sign.java:461) at sign.Sign.main(Sign.java:179) Java Result: 1 Это только если пытаться расшифровать сообщение, зашифрованное с помощью cryptcp. Если сообщение зашифровано с помощью JCP, то рашифровка происходит без проблем
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Сохраните результат (result) в файл, попробуйте открыть в каком-нибудь asn1-декодировщике. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.08.2012(UTC) Сообщений: 20 Откуда: Кумертау
Сказал(а) «Спасибо»: 3 раз
|
Получилась интересная картина: Если шифровано с помощью JCP, то исходные текст сообщения нужно доставать из структуры Ans1. Если шифровано с помощью cryptcp, то исходный текст получается сразу же после расшифровки на ключе.
Какой вариант правильный по ГОСТ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Автор: Ensiferum Получилась интересная картина: Если шифровано с помощью JCP, то исходные текст сообщения нужно доставать из структуры Ans1. Если шифровано с помощью cryptcp, то исходный текст получается сразу же после расшифровки на ключе.
Какой вариант правильный по ГОСТ? В примере JCP предполагается, что была зашифрована CMS-подпись, потому используется ContentInfo. Если это не CMS (как выясняется), а plain text, то не декодируйте в ContentInfo, а сразу работайте с текстом. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 23.08.2012(UTC) Сообщений: 20 Откуда: Кумертау
Сказал(а) «Спасибо»: 3 раз
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2014(UTC) Сообщений: 4 Откуда: Ярославль
|
Здравствуйте, У меня аналогичная проблема. Мне необходимо расшифровать полученный .p7m файл. Использую код из того же примера с небольшим изменением. Хранилище ключей находится на Рутокен. Код:final KeyStore hdImageStore = KeyStore.getInstance("RutokenStore", "JCP");
Но как раз это не проблема. Ключ находится. Ошибка вылетает позже на строке: Код: final SecretKey simmKey = (SecretKey) cipher.unwrap(wrapKey, null, Cipher.SECRET_KEY);
Цитата:04.02.2014 10:21:56 ru.CryptoPro.JCP.tools.Starter check INFO: Loading JCP 1.0.54 36641 04.02.2014 10:21:56 ru.CryptoPro.JCP.tools.Starter check INFO: JCP loaded. Exception in thread "main" java.security.InvalidKeyException: Wrapped key is invalid at ru.CryptoPro.JCP.Key.SecretKeySpec.unwrap(Unknown Source) at ru.CryptoPro.Crypto.Cipher.GostCipher.engineUnwrap(Unknown Source) at ru.CryptoPro.Crypto.Cipher.Padding5Cipher.engineUnwrap(Unknown Source) at javax.crypto.Cipher.unwrap(DashoA13*..) at CMS_samples.CMSDecrypt.main(CMSDecrypt.java:121)
Еще отмечу, что файл корректно расшифровывается утилитой cryptcp: Цитата:Цепочки сертификатов проверены. Расшифрование данных... Сообщение успешно расшифровано. Открытие/запуск файла... [ReturnCode: 0]
Пожалуйста, подскажите, что я делаю не так. Спасибо.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Какой командой получаете зашифрованное сообщение с помощью cryptcp? Пробовали обратный вариант - зашифровать в jcp и проверить в cryptcp? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2014(UTC) Сообщений: 4 Откуда: Ярославль
|
Файл мне приходит от клиента. Могу только сказать, что используется КриптоПро. Файлы я не создавал, так что обратный вариант не пробовал.
Для проверки использовал следующую команду: cryptcp -decr -dn "E=vitek-n@yandex.ru" -pin 12345678 -start test.txt.p7s.p7m test2.txt
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close