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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 4 раз
Когда выйдет Криптопро.NET с поддержкой ГОСТ 34.12-2015?
Offline Артём Макаров  
#2 Оставлено : 22 декабря 2021 г. 13:18:57(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 41 раз в 41 постах
ГОСТ Р 34.12-2015 определяет два блочных шифра Магма (размер блока 64 бита) и Кузнечик (размер блока 128 бит).

Алгоритм Магмы полностью эквивалентен алгоритму блочного шифрования из ГОСТ 28147-89 (фактически алгоритм был просто перенесён в новый ГОСТ).

Если есть требование шифровать данные на основе ГОСТ Р 34.12-2015 (Магма) в .NET необходимо воспользоваться классом Gost28147CryptoServiceProvider.

Алгоритма Кузнечик в данный момент в Криптопро.NET нет.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
Илья 86 оставлено 22.12.2021(UTC)
Offline Илья 86  
#3 Оставлено : 22 декабря 2021 г. 14:02:46(UTC)
Илья 86

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

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

Сказал(а) «Спасибо»: 4 раз
Нужен как раз кузнечик, а когда он появится в Криптопро.NET?
Offline Артём Макаров  
#4 Оставлено : 22 декабря 2021 г. 15:26:58(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 41 раз в 41 постах
В ближайшее время не планировали. Если необходимо использование сейчас - возможно только использование CryptoApi интерфейса CSP через P/Invoke.

Какая задача у вас стоит? Как именно планировалось использовать шифр?
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
Илья 86 оставлено 23.12.2021(UTC)
Offline Илья 86  
#5 Оставлено : 23 декабря 2021 г. 11:33:55(UTC)
Илья 86

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

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

Сказал(а) «Спасибо»: 4 раз
Автор: Артём Макаров Перейти к цитате
В ближайшее время не планировали. Если необходимо использование сейчас - возможно только использование CryptoApi интерфейса CSP через P/Invoke.

Какая задача у вас стоит? Как именно планировалось использовать шифр?


Нужно как-то сделать 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 Артём Макаров  
#6 Оставлено : 23 декабря 2021 г. 11:59:45(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 41 раз в 41 постах
Повторить на чистом C# не получится, так как поддержки Кузнечика на данный момент нет.

Про P/Invoke можно почитать на сайте docs.microsoft.com:
https://docs.microsoft.c...d/native-interop/pinvoke

Описание интерфейсов CSP - на сайте cpdn
https://cpdn.cryptopro.ru/
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.