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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Илья 86  
#1 Оставлено : 23 декабря 2021 г. 11:26:18(UTC)
Илья 86

Статус: Участник

Группы: Участники
Зарегистрирован: 15.12.2021(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 4 раз
Помогите пожалуйста сделать Unwrap симметричного ключа на c++. У меня есть код на Java, но я не понимаю, как его повторить на с++.
Код на Java:

Cipher cipher = Cipher.getInstance(WRAP_ALGORITHM, PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, privateKey);
final SecretKey unwrappedSecretKey = (SecretKey) cipher
.unwrap(wrappedSecret, null, Cipher.SECRET_KEY);

Какой на C++ есть аналог класса Cipher?

Вот полный код метода:

package s.s.sce.crypto;

import ru.CryptoPro.JCP.JCP;
import ru.CryptoPro.JCP.Util.JCPInit;
import ru.CryptoPro.JCP.params.AlgIdSpec;
import ru.CryptoPro.JCP.spec.NameAlgIdSpec;
import ru.CryptoPro.JCP.tools.AlgorithmTools;
import ru.CryptoPro.JCPRequest.GostCertificateRequest;
import ru.CryptoPro.JCSP.JCSP;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Arrays;
import java.util.Base64;

public class GostCryptoService {

/**
* Алгоритм ключа шифрования.
*/
private static final String SECRET_KEY_ALGORITHM = JCP.GOST_K_CIPHER_NAME;

/**
* Алгоритм шифрования данных.
*/
private static final String CIPHER_ALGORITHM = SECRET_KEY_ALGORITHM + "/CFB/NoPadding";

/**
* Алгоритм экспорта/импорта секретного ключа.
*/
private static final String WRAP_ALGORITHM = JCSP.GOST_TRANSPORT_K;

/**
* Имя провайдера.
*/
private static final String PROVIDER_NAME = JCSP.PROVIDER_NAME;

private static final String CONTAINER_PATH = "\\\\.\\HDIMAGE\\";

private static final String CONTAINER_ALIAS = "secret-cloud";

public GostCryptoService() {
JCPInit.initProviders(true);
}


public void decrypt(String encFilePath) throws Exception {
try (FileInputStream encFis = new FileInputStream(encFilePath)) {
byte[] decodedSecret = new byte[277];
encFis.read(decodedSecret);
byte[] iv = Arrays.copyOfRange(decodedSecret, 261, decodedSecret.length);
byte[] wrappedSecret = Arrays.copyOfRange(decodedSecret, 0, 261);

KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME,
JCSP.PROVIDER_NAME);
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(CONTAINER_ALIAS, null);
if (privateKey == null) {
throw new Exception("Приватный ключ не сгенерирован.");
}
Cipher cipher = Cipher.getInstance(WRAP_ALGORITHM, PROVIDER_NAME);
cipher.init(Cipher.UNWRAP_MODE, privateKey);
final SecretKey unwrappedSecretKey = (SecretKey) cipher
.unwrap(wrappedSecret, null, Cipher.SECRET_KEY);

cipher = Cipher.getInstance(CIPHER_ALGORITHM, PROVIDER_NAME);
AlgorithmParameterSpec parameterSpec = new IvParameterSpec(iv);

cipher.init(Cipher.DECRYPT_MODE, unwrappedSecretKey, parameterSpec, null);

String decFileName = new File(encFilePath).getName().split(".enc")[0];
byte[] buffer = new byte[2048];
try (FileOutputStream decrFos = new FileOutputStream(decFileName)) {
int n;
while ((n = encFis.read(buffer)) > 0) {
decrFos.write(cipher.update(buffer), 0, n);
}
}
}
}


}
Offline Александр Лавник  
#2 Оставлено : 23 декабря 2021 г. 12:03:14(UTC)
Александр Лавник

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

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

Сказал «Спасибо»: 53 раз
Поблагодарили: 801 раз в 740 постах
Ответ здесь.
Техническую поддержку оказываем тут
Наша база знаний
Offline Илья 86  
#3 Оставлено : 23 декабря 2021 г. 12:09:36(UTC)
Илья 86

Статус: Участник

Группы: Участники
Зарегистрирован: 15.12.2021(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 4 раз
Автор: Александр Лавник Перейти к цитате
Ответ здесь.


Но какой аналог Cipher?
Offline Илья 86  
#4 Оставлено : 23 декабря 2021 г. 16:31:58(UTC)
Илья 86

Статус: Участник

Группы: Участники
Зарегистрирован: 15.12.2021(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 4 раз
Автор: Александр Лавник Перейти к цитате
Ответ здесь.


Там нет ничего похожего на unwrap ключа! Можете подсказать конкретнее?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.