Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Boris1980  
#1 Оставлено : 20 февраля 2018 г. 19:09:49(UTC)
Boris1980

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2018(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Добрый день!
Не удётся получить положительный результат выполнения Вашего примера ("jcp-2.0.39442\examples\userSamples\SessionEncrypt.java")
Для демонстрации проблемы сделан отдельный проект, во вложении с краткой инструкцией в READ.ME (https://1drv.ms/u/s!AsIDkB3Kz2LHdRptm9eqItNni6g).
При запуске получаем разницу в исходных данных с данными, которые были сначала зашифрованы, потом расшифрованы.
Цель – успешное ассиметричное зашифровывание данных открытым ключом получателя, и расшифрование закрытым ключом получателя.
Большая просьба помочь разобраться, что мы делаем не так.
Спасибо.

https://1drv.ms/u/s!AsIDkB3Kz2LHdRptm9eqItNni6g
Цитата:

package ru.okta;

import javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.SecureRandom;
import java.security.cert.Certificate;

public class Main {
/**
* текст
*/
private static final String SAMPLE_TEXT = "Classic encryption/decryption";
/**
* длина вектора
*/
private static final int RND_LENGTH = 8;
/**
* Алгоритм шифрования
*/
private static final String CIPHER_ALG = "GOST28147/CFB/NoPadding";
/**
* датчик случайных чисел: "CPRandom" или JCP.CP_RANDOM
*/
public static final String RANDOM_ALG = "CPRandom";
/**
* алгоритм ключа обмена: "GOST3410DH" или JCP.GOST_DH_NAME
*/
public static final String EXCH_KEY_PAIR_ALG = "GOST3410DH_2012_256";
/**
* алгоритм шифрования ГОСТ 28147-89: "GOST28147" или CryptoProvider.GOST_CIPHER_NAME
*/
public static final String CHIPHER_ALG = "GOST28147";

public static void main(String[] args) throws Exception {
final byte[] data = SAMPLE_TEXT.getBytes();
/**На каждой стороне должны присутствовать:
* - свой закрытый ключ
* - открытый ключ второй стороны (сертификат)**/

//Container store
KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
keyStore.load(null, null);

final PrivateKey alisaPrivate = (PrivateKey) keyStore.getKey("OktaTest", null);
final PrivateKey bobPrivate = (PrivateKey) keyStore.getKey("OktaTest2", null);
final Certificate alisaCert = keyStore.getCertificate("OktaTest");
final Certificate bobCert = keyStore.getCertificate("OktaTest2");


/* Генерирование начальной синхропосылки для выработки ключа согласования*/
final byte[] sv = new byte[RND_LENGTH];
final SecureRandom random = SecureRandom.getInstance(RANDOM_ALG);
random.nextBytes(sv);
final IvParameterSpec ivspec = new IvParameterSpec(sv);

/* Выработка ключа согласования алисы c SV*/
final KeyAgreement alisaKeyAgree =
KeyAgreement.getInstance(EXCH_KEY_PAIR_ALG);
alisaKeyAgree.init(alisaPrivate, ivspec, null);
alisaKeyAgree.doPhase(bobCert.getPublicKey(), true);
final SecretKey alisaAgree =
alisaKeyAgree.generateSecret(CHIPHER_ALG);

/* Генерирование симметричного ключа алисой с параметрами шифрования из контрольной панели*/
final KeyGenerator keyGen = KeyGenerator.getInstance(CHIPHER_ALG);
final SecretKey simm = keyGen.generateKey();

/* Зашифрование текста на симметричном ключе алисы*/
Cipher cipher = Cipher.getInstance(CIPHER_ALG);
cipher.init(Cipher.ENCRYPT_MODE, simm);
// передача вектора инициализации бобу
final byte[] iv = cipher.getIV();
final byte[] encryptedtext = cipher.doFinal(data, 0, data.length);

/*Зашифрование симметричного ключа на ключе согласования алисы*/
cipher.init(Cipher.WRAP_MODE, alisaAgree);
final byte[] wrappedKey = cipher.wrap(simm);

/* Выработка ключа согласования боба с тем же SV. */
final KeyAgreement bobKeyAgree =
KeyAgreement.getInstance(EXCH_KEY_PAIR_ALG);
bobKeyAgree.init(bobPrivate, ivspec, null);
bobKeyAgree.doPhase(alisaCert.getPublicKey(), true);
final SecretKey bobAgree =
bobKeyAgree.generateSecret(CHIPHER_ALG);

/* Расшифрование бобом симметричного ключа.*/
cipher.init(Cipher.UNWRAP_MODE, bobAgree);
final SecretKey simmKey = (SecretKey) cipher
.unwrap(wrappedKey, null, Cipher.SECRET_KEY);

/* Расшифрование бобом текста на расшифрованном симметричном ключе. IV передан от алисы*/
cipher = Cipher.getInstance(CIPHER_ALG);
cipher.init(Cipher.DECRYPT_MODE, simmKey, new IvParameterSpec(iv), null);
final byte[] decryptedtext = cipher
.doFinal(encryptedtext, 0, encryptedtext.length);

// проверка результата.
if (decryptedtext.length != data.length)
throw new Exception("Error in crypting");
for (int i = 0; i < decryptedtext.length; i++)
if (data[i] != decryptedtext[i]) {
throw new Exception(String.format("Error in crypting, enc: \"%s\" != decr: \"%s\"", new String(data), new String(decryptedtext)));
}

System.out.println("OK");
}
}


Проблема в том, что если зашифровать текст, потом расшифровать, то он "портится", и не совпадает с оригиналом.

Отредактировано пользователем 21 февраля 2018 г. 12:23:39(UTC)  | Причина: Не указана

Offline Igor P  
#2 Оставлено : 22 февраля 2018 г. 4:01:05(UTC)
Igor P

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.02.2018(UTC)
Сообщений: 3
Российская Федерация

Добрый день!

Проверьте, совпадают ли у Вас параметры алгоритма шифрования в исходном и расшифрованном симметричном ключе:
Цитата:
import ru.CryptoPro.Crypto.Key.GostSecretKey;

System.out.println("simm: " + ((GostSecretKey) simm).getSpec().getParams());
System.out.println("simmKey: " + ((GostSecretKey) simmKey).getSpec().getParams());


Если не совпадают, то скорее всего, дело именно в этом. Я столкнулся с аналогичной проблемой, но не на примере, а в боевом коде работающей системы после перехода на алгоритмы 2012 года (с алгоритмами 2001 года до этого все работало нормально).
Offline Boris1980  
#3 Оставлено : 22 февраля 2018 г. 10:49:22(UTC)
Boris1980

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2018(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Спасибо за ответ!

Действительно, после того, как ключи были пере-генерированы с учётом использования алгоритмов 2001 года (а не 2012), пример заработал.
Спасибо!
Offline Евгений Афанасьев  
#4 Оставлено : 22 февраля 2018 г. 15:09:21(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Данный пример проверим и устраним ошибку.
Offline Евгений Афанасьев  
#5 Оставлено : 27 февраля 2018 г. 16:20:31(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,924
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Идентификатор параметров шифрования нужно поместить сюда:
Код:

cipher = Cipher.getInstance(CIPHER_ALG);
CryptParamsSpec pp = CryptParamsSpec.getInstance(CryptParamsSpec.VERBAO); // требуемые параметры
GostCipherSpec ss = new GostCipherSpec(new IvParameterSpec(iv), pp);
cipher.init(Cipher.DECRYPT_MODE, simmKey, ss, null); <--
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Boris1980 оставлено 28.02.2018(UTC)
Offline Boris1980  
#6 Оставлено : 28 февраля 2018 г. 13:07:58(UTC)
Boris1980

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2018(UTC)
Сообщений: 3
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Спасибо!
Да, с этим изменением заработало также и с ключами, сгенерированными с использованием алгоритмов стандарта 2012г.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.