Статус: Участник
Группы: Участники
Зарегистрирован: 10.04.2014(UTC) Сообщений: 10 Откуда: Киев
Сказал(а) «Спасибо»: 1 раз
|
Помогите, пожалуйста, разобраться с шифрованием сообщения при помощи JCP. На вход получаю byte[], подаю его на шифрование используя метод: Код:
public byte[] Crypt(byte[] data, String Path_to_cert) throws Exception { // String Path_to_cert путь к сертификату получтаеля
//Загрузка хранилища
final KeyStore hdImageStore = KeyStore.getInstance(CMStools.STORE_TYPE);
hdImageStore.load(null, null);
final PrivateKey senderKey =
(PrivateKey) hdImageStore
.getKey(CMStools.SIGN_KEY_NAME, null);
final X509Certificate publicSenderCert =
(X509Certificate) hdImageStore
.getCertificate(CMStools.SIGN_KEY_NAME);
//ключ получателя
final X509Certificate publicCert =
(X509Certificate) CMStools.readCertificate(Path_to_cert);
/* Генерирование начальной синхропосылки для выработки ключа согласования*/
final byte[] sv = new byte[RND_LENGTH];
final SecureRandom random = SecureRandom.getInstance(Constants.RANDOM_ALG);
random.nextBytes(sv);
final IvParameterSpec ivspec = new IvParameterSpec(sv);
final PublicKey responderPublic = publicCert.getPublicKey();
/* Выработка ключа согласования алисы c SV*/
final KeyAgreement senderKeyAgree =
KeyAgreement.getInstance(CMStools.KEY_ALG_NAME);
senderKeyAgree.init(senderKey, new IvParameterSpec(sv), null);
senderKeyAgree.doPhase(responderPublic, true);
final SecretKey alisaSecret =
senderKeyAgree.generateSecret(CMStools.SEC_KEY_ALG_NAME);
final KeyGenerator kg = KeyGenerator.getInstance(CMStools.SEC_KEY_ALG_NAME);
final ParamsInterface paramss = AlgIdSpec.getDefaultCryptParams();
kg.init(paramss);
final SecretKey simm = kg.generateKey();
/*Зашифрование текста на ключе согласования алисы*/
Cipher cipher = Cipher.getInstance(CIPHER_ALG);
cipher.init(Cipher.ENCRYPT_MODE, simm, (SecureRandom) null);
// передача вектора инициализации бобу
final byte[] iv = cipher.getIV();
final byte[] encryptedtext = cipher.doFinal(data, 0, data.length);
//Зашифрование симметричного ключа на ключе согласования отправителя
cipher.init(Cipher.WRAP_MODE, alisaSecret, (SecureRandom) null);
final byte[] key = cipher.wrap(simm);
final ContentInfo all = new ContentInfo();
all.contentType =
new Asn1ObjectIdentifier(
new OID(CMStools.STR_CMS_OID_ENVELOPED).value);
final EnvelopedData cms = new EnvelopedData(); // возможно причина тут
all.content = cms;
cms.version = new CMSVersion(0);
cms.recipientInfos = new RecipientInfos(1);
cms.recipientInfos.elements = new RecipientInfo[1];
cms.recipientInfos.elements[0] = new RecipientInfo();
final KeyTransRecipientInfo keytrans = new KeyTransRecipientInfo();
keytrans.version = new CMSVersion(0);
final Asn1BerEncodeBuffer ebuf = new Asn1BerEncodeBuffer();
final SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo();
final Asn1BerDecodeBuffer dbuff = new Asn1BerDecodeBuffer(
publicSenderCert.getPublicKey().getEncoded());
spki.decode(dbuff);
dbuff.reset();
final AlgIdInterface algid = new AlgIdSpec(spki.algorithm);
final AlgorithmIdentifier id = (AlgorithmIdentifier) algid.getDecoded();
id.encode(ebuf);
Asn1BerDecodeBuffer dbuf = new Asn1BerDecodeBuffer(ebuf.getMsgCopy());
keytrans.keyEncryptionAlgorithm = new KeyEncryptionAlgorithmIdentifier();
keytrans.keyEncryptionAlgorithm.decode(dbuf);
ebuf.reset();
dbuf.reset();
keytrans.rid = new RecipientIdentifier();
final IssuerAndSerialNumber issuer = new IssuerAndSerialNumber();
final X500Principal issuerName = publicCert.getIssuerX500Principal();
dbuf = new Asn1BerDecodeBuffer(issuerName.getEncoded());
issuer.issuer = new Name();
final RDNSequence rnd = new RDNSequence();
rnd.decode(dbuf);
issuer.issuer.set_rdnSequence(rnd);
issuer.serialNumber = new CertificateSerialNumber(
publicCert.getSerialNumber());
keytrans.rid.set_issuerAndSerialNumber(issuer);
dbuf.reset();
final GostR3410_KeyTransport encrKey = new GostR3410_KeyTransport();
dbuf = new Asn1BerDecodeBuffer(key);
encrKey.sessionEncryptedKey = new Gost28147_89_EncryptedKey();
encrKey.sessionEncryptedKey.decode(dbuf);
dbuf.reset();
encrKey.transportParameters = new GostR3410_TransportParameters();
encrKey.transportParameters.encryptionParamSet =
new Gost28147_89_ParamSet(algid.getCryptParams()
.getOID().value);
encrKey.transportParameters.ephemeralPublicKey = new SubjectPublicKeyInfo();
dbuf = new Asn1BerDecodeBuffer(
publicSenderCert.getPublicKey().getEncoded());
encrKey.transportParameters.ephemeralPublicKey.decode(dbuf);
dbuf.reset();
encrKey.transportParameters.ukm = new Asn1OctetString(sv);
encrKey.encode(ebuf);
keytrans.encryptedKey = new EncryptedKey(ebuf.getMsgCopy());
ebuf.reset();
cms.recipientInfos.elements[0].set_ktri(keytrans);
cms.encryptedContentInfo = new EncryptedContentInfo();
final OID contentType = new OID(CMStools.STR_CMS_OID_DATA);
cms.encryptedContentInfo.contentType = new ContentType(contentType.value);
final Gost28147_89_Parameters params = new Gost28147_89_Parameters();
params.iv = new Gost28147_89_IV(iv);
params.encryptionParamSet =
new Gost28147_89_ParamSet(paramss.getOID().value);
cms.encryptedContentInfo.contentEncryptionAlgorithm =
new ContentEncryptionAlgorithmIdentifier(
_Gost28147_89_EncryptionSyntaxValues.id_Gost28147_89,
params);
cms.encryptedContentInfo.encryptedContent = new EncryptedContent(encryptedtext);
all.encode(ebuf);
//Array.writeFile(CMS_FILE_PATH, ebuf.getMsgCopy());
byte[] res = ebuf.getMsgCopy();
CMStools.logger.info("ok");
return res;
//return encryptedtext;
}
полученный результат записываю в файл, который пытаюсь расшифровать при помощи cryptcp, но получаю ошибку Цепочки сертификатов проверены. Расшифрование данных... Ошибка: Встречено неверное значение тега ASN1.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 713 раз в 673 постах
|
Здравствуйте. С помощью какой команды проверяете в cryptcp? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.04.2014(UTC) Сообщений: 10 Откуда: Киев
Сказал(а) «Спасибо»: 1 раз
|
Добрый день Цитата:Здравствуйте. С помощью какой команды проверяете в cryptcp? criptcp -decr -dn "Тут имя" -start file1.txt file2.txt аналогичную ошибку получаю и при отправке на сервер, который должен будет проводить расшифровку в продуктиве. Отредактировано пользователем 11 апреля 2014 г. 11:40:19(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 713 раз в 673 постах
|
А с помощью csptest пробовали? Примерно так: csptest -sfse -decrypt -in "in.enc" -out "result.out" |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.04.2014(UTC) Сообщений: 10 Откуда: Киев
Сказал(а) «Спасибо»: 1 раз
|
Цитата:csptest -sfse -decrypt -in "in.enc" -out "result.out" An error occurred in running the program. .\ctmsg.c:638:Failed. Error number 0x80093103 (2148086019). Данные ASN1 повреждены. Отредактировано пользователем 11 апреля 2014 г. 12:16:20(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 713 раз в 673 постах
|
А что после зашифрования с данными делаете? В файл сохраняете - в der-кодировке? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.04.2014(UTC) Сообщений: 10 Откуда: Киев
Сказал(а) «Спасибо»: 1 раз
|
сохраняю в файл: Код:public static void write(String fileName, String text) {
File file = new File(fileName);
try {
file.createNewFile();
}
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("fileName.txt")));
try {
out.write(text);
} finally {
out.close();
}
} catch(IOException e) {
throw new RuntimeException(e);
}
Отредактировано пользователем 11 апреля 2014 г. 13:07:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 713 раз в 673 постах
|
А почему String text? Подпись ведь byte[] |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.04.2014(UTC) Сообщений: 10 Откуда: Киев
Сказал(а) «Спасибо»: 1 раз
|
Автор: afev А почему String text? Подпись ведь byte[] Метод вызываю так : write("somename.txt", new String(res)); где res результат шифрования.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 713 раз в 673 постах
|
String дает строку в UTf-8, а вам надо бинарные данные. Например, Array.writeFile("my.file", bin_data), где Array - класс из ru.CryptoPro.JCP.tools. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
kvvn оставлено 11.04.2014(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close