Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
Добрый день. Тестирую расшифровку контейнера, зашифрованного cryptcp. Шифровался текст так: /opt/cprocsp/bin/amd64/cryptcp -encr -der -dn Alias ./test.txt ./test.enc Пытаюсь расшифровывать так: Код: public byte[] decryptCMS(final byte[] data, final String receiverKeyAlias) {
//Разворачиваем конверт
//разбор CMS-сообщения
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(data);
final ContentInfo all = new ContentInfo();
try {
all.decode(dbuf);
dbuf.reset();
} catch (Exception e) {
throw new RuntimeException("Couldn't read input enveloped data.");
}
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();
try {
encrKey.decode(dbuf);
dbuf.reset();
encrKey.sessionEncryptedKey.encode(ebuf);
} catch (Exception e) {
throw new RuntimeException("Couldn't read input enveloped data.");
}
final byte[] wrapKey = ebuf.getMsgCopy();
ebuf.reset();
try {
encrKey.transportParameters.ephemeralPublicKey.encode(ebuf);
} catch (Exception e) {
throw new RuntimeException("Couldn't read input enveloped data.");
}
final byte[] encodedPub = ebuf.getMsgCopy();
ebuf.reset();
final byte[] sv_d = encrKey.transportParameters.ukm.value;
final Gost28147_89_Parameters params = (Gost28147_89_Parameters) cms.encryptedContentInfo.contentEncryptionAlgorithm.parameters;
final byte[] iv_d = params.iv.value;
final OID cipherOID = new OID(params.encryptionParamSet.value);
final byte[] text = cms.encryptedContentInfo.encryptedContent.value;
//получатель - закрытый ключ
final PrivateKey responderKey;
try {
if (receiverKeyAlias != null)
responderKey = (PrivateKey) keyStore.getKey(receiverKeyAlias, RECIPIENT_PASSWORD);
else responderKey = (PrivateKey) keyStore.getKey(RECIPIENT_ALIAS, RECIPIENT_PASSWORD);
} catch (Exception e) {
throw new RuntimeException("Couldn't load private key from storage.");
}
//отправитель - открытый ключ из cms
final PublicKey senderPublic;
final X509EncodedKeySpec pspec = new X509EncodedKeySpec(encodedPub);
try {
final KeyFactory kf = KeyFactory.getInstance(responderKey.getAlgorithm(), PROVIDER_NAME);
senderPublic = kf.generatePublic(pspec);
} catch (Exception e) {
throw new RuntimeException("Couldn't get public key from the certificate.");
}
// выработка ключа согласования получателем
final KeyAgreement responderKeyAgree;
try {
responderKeyAgree = KeyAgreement.getInstance(responderKey.getAlgorithm(), CRYPT_PROVIDER_NAME);
responderKeyAgree.init(responderKey, new IvParameterSpec(sv_d), null);
responderKeyAgree.doPhase(senderPublic, true);
} catch (Exception e) {
throw new RuntimeException("Couldn't produce an agreement key.");
}
final SecretKey responderSecret;
try {
responderSecret = responderKeyAgree.generateSecret(CIPHER);
} catch (Exception e) {
throw new RuntimeException("Couldn't produce responder secret key, based on the agreement key.");
}
// Расшифрование симметричного ключа.
final Cipher cipher;
try {
cipher = getInstance(CIPHER_MODE, CRYPT_PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, responderSecret, (SecureRandom) null);
} catch (Exception e) {
throw new RuntimeException("Couldn't produce cipher.");
}
final SecretKey simmKey;
try {
simmKey = (SecretKey) cipher.unwrap(wrapKey, null, Cipher.SECRET_KEY);
} catch (Exception e) {
throw new RuntimeException("Couldn't produce symmetric key.");
}
// Расшифрование текста на симметричном ключе.
final GostCipherSpec spec = new GostCipherSpec(iv_d, cipherOID);
final byte[] result;
try {
cipher.init(DECRYPT_MODE, simmKey, spec, null);
result = cipher.doFinal(text, 0, text.length);
} catch (Exception e) {
throw new RuntimeException("Couldn't decrypt the payload.");
}
return result;
}
Падает на этапе: responderKeyAgree.doPhase(senderPublic, true); Что я делаю не так ?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
При отлдке публичный ключ, получаемый из контейнера имеет алгоритм GOST3410EL, а приватный GOST3410DH_2012_512. Это нормально ? Шифровал я 512 байтным ключем.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Алгоритм, переданный в KeyAgreement первым параметром, особого значения не имеет. Приведите полный стек ошибки. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
![](/forum2/Themes/soclean/icon_file.gif) 1111.png (59kb) загружен 6 раз(а).
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,005 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Возможно, параметры шифрования разные? В открытом ключе и закрытом. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.03.2018(UTC) Сообщений: 30 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Сказал(а) «Спасибо»: 3 раз
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close