Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ 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,510
Мужчина
Российская Федерация

Сказал «Спасибо»: 53 раз
Поблагодарили: 810 раз в 747 постах
Ответ здесь.
Техническую поддержку оказываем тут
Наша база знаний
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 (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.