Статус: Активный участник
Группы: Участники
Зарегистрирован: 16.02.2016(UTC) Сообщений: 60
Сказал(а) «Спасибо»: 18 раз Поблагодарили: 2 раз в 2 постах
|
Добрый день. Столкнулся с проблемой некорректного архива получаемого после метода расшифровки. Метод расшифровки взят из пакета CMS_samples. Если прогнать любой архив в метод ecnrypt а потом через метод decrypt то я получаю валидный архив. Но архив полученный от заказчика на выходе битый (EOF при попытке распаковки). Зашифрованный файл заказчика отлично расшифровался в криптоарме и архив получился целым и нормально распаковался, но через метод decrypt - он битый. То есть проблема все таки в методе. Собственно сам метод: Код:
byte[] decrypt(byte[] data, PrivateKey responderKey) throws Asn1Exception, IOException, NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
String pubKeyAlgorithm = JCP.GOST_DH_2012_256_NAME;
//разбор CMS-сообщения
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
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;
//отправитель - открытый ключ из cms
final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
// final KeyFactory kf = KeyFactory.getInstance(pubKeyAlgorithm, storeProviderName);
final KeyFactory kf = KeyFactory.getInstance(pubKeyAlgorithm, "JCP");
final PublicKey senderPublic = kf.generatePublic(pspec);
// выработка ключа согласования получателем
final KeyAgreement responderKeyAgree =
KeyAgreement.getInstance(pubKeyAlgorithm, CryptoProvider.PROVIDER_NAME);
responderKeyAgree.init(responderKey, new IvParameterSpec(sv), null);
responderKeyAgree.doPhase(senderPublic, true);
final SecretKey responderSecret = responderKeyAgree
.generateSecret("GOST28147");
// Расшифрование симметричного ключа.
final Cipher cipher = Cipher.getInstance("GOST28147/CFB/NoPadding", CryptoProvider.PROVIDER_NAME);
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);
return cipher.doFinal(text, 0, text.length);
}
Отредактировано пользователем 5 июля 2018 г. 11:48:34(UTC)
| Причина: Не указана
|