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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Vadim.NET  
#1 Оставлено : 11 апреля 2018 г. 12:13:47(UTC)
Vadim.NET

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

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

Клиенту передан открытый ключ сертификата, установленного на машине, где производится расшифровка.
Клиент создал простенький файл для тестирования 111.txt

Клиент выполняет операцию зашифровки :
cryptcp -encr -dn "E=test@test.test.ru" -uMy -der -all 111.txt 111.txt.enc

Я использую вызов:
cryptcp -decr -dn "E=test@test.test.ru" -uMy -all 111.txt.enc 111_dec.txt

Полученный файл 111_dec.txt соответствует клиентскому.
Установил КриптоПро .NET SDK на компьютер разработки.
Смотрю примеры, не нахожу примера, который бы воспроизвел в .NET предыдущие запуски зашифровывания и расшифровывания через cryptcp.
Нашел пример KeyExchange2012_256.cs, где реализован асинхронный механизм шифрования, но как приблизится к расшифровке файла - не понимаю.
Помогите пожалуйста.

Отредактировано пользователем 11 апреля 2018 г. 14:03:30(UTC)  | Причина: Не указана

Offline Vadim.NET  
#2 Оставлено : 11 апреля 2018 г. 13:05:22(UTC)
Vadim.NET

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

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

объявил переменные, сертификат получил:
private X509Certificate2 _certificate;
private Gost3410_2012_256 AssymKey;
private byte[] IV;
переделал 2 функции из примеров:
//зашифровать
private void EncryptFile(GostKeyTransport encKey, string inFileName, string outFileName)
{
//Создаем потоки для входного и выходного файлов.
byte[] bin = new byte[100]; // Промежуточный буфер.
long rdlen = 0; // Общее число записанных байт.

FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);

long totlen = fin.Length; // Общий размер входного файла.
int len; // Число считанных за один раз байт.

// Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
Gost2012_256KeyExchangeDeformatter Deformatter = new Gost2012_256KeyExchangeDeformatter(AssymKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);
// Устанавливаем синхропосылку.
key.IV = IV;
// Создаем дешифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)key.CreateEncryptor();

// Создаем криптопоток для записи
CryptoStream encStream = new CryptoStream(fout, cryptoTransform, CryptoStreamMode.Write);

// Читаем из входного файла, шифруем и пишем в выходной.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}

encStream.Close();
fout.Close();
fin.Close();
}
//Расшифровать
private void DecryptFile(GostKeyTransport encKey, string EncryptedFileName, string DecryptedFileName)
{
// Открываем зашифрованный файл.
using (FileStream ifs = new FileStream(EncryptedFileName, FileMode.Open, FileAccess.Read))
{
// Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
Gost2012_256KeyExchangeDeformatter Deformatter = new Gost2012_256KeyExchangeDeformatter(AssymKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);
// Устанавливаем синхропосылку.
key.IV = IV;
// Создаем дешифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)key.CreateDecryptor();
// Создаем поток разшифрования из файла.
using (CryptoStream cs = new CryptoStream(ifs, cryptoTransform, CryptoStreamMode.Read))
{
// Открываем расшифрованный файл
using (FileStream ofs = new FileStream(DecryptedFileName, FileMode.Create))
{
byte[] data = new byte[4096];
// и переписываем содержимое в выходной поток.
int length = cs.Read(data, 0, data.Length);
while (length > 0)
{
ofs.Write(data, 0, length);
length = cs.Read(data, 0, data.Length);
}
}
}
}
}

Вызов в функции такой:
AsymmetricAlgorithm pk = _certificate.PrivateKey;
AssymKey = pk as Gost3410_2012_256CryptoServiceProvider;

// Создаем случайный секретный ключ, который необходимо передать.
Gost28147 key = new Gost28147CryptoServiceProvider();

IV = key.IV;

// Создаем форматтер, шифрующий на ассиметричном ключе получателя.
Gost2012_256KeyExchangeFormatter Formatter = new Gost2012_256KeyExchangeFormatter(AssymKey);
// GostKeyTransport - формат зашифрованной для безопасной передачи ключевой информации.
GostKeyTransport encKey = Formatter.CreateKeyExchange(key);

EncryptFile(encKey, BeginName, SourceName);
DecryptFile(encKey, SourceName, DestName);
---
BeginName, SourceName, DestName - имена файлов.
После выполнения у меня конечный файл соответсвовал исходному - но есть одно но, простой текстовый файл с строкой "123456789" равен 9 байт, зашифрованный с именем 111.txt.enc тоже имеет размер 9, расшифрованный полностью соответсвует начальному = 9, а вот зашифрованный файл, полученный через cryptcp имеет размер 548 байт.
В поп-меню виндовс встроен вызов КриптоАПМ, файл, сжатый через мою функцию не открывается с ошибкой неверный формат данных, подозреваю не хватает заголовка, подскажите, двигаюсь ли я в правильном направлении и где споткнулся в реализации?

Offline Максим Коллегин  
#3 Оставлено : 11 апреля 2018 г. 14:53:10(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Вы используете raw шифрование, cryptcp и АРМ - pkcs#7. В .NET такое тоже есть - смотрите примеры в папке CMS.
Знания в базе знаний, поддержка в техподдержке
Offline Vadim.NET  
#4 Оставлено : 11 апреля 2018 г. 16:12:42(UTC)
Vadim.NET

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

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

Извините, файлов в CMS немного, но я испытываю затруднения в поиске примера, большая просьба указать - как в примере CMS реализована расшифровка/зашифровка одного файла в другой.
Offline Vadim.NET  
#5 Оставлено : 11 апреля 2018 г. 17:02:39(UTC)
Vadim.NET

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

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

Единственный вариант, который нашел - работа с классом EnvelopedCms, при его использовании сразу вылетел по нехватке памяти.
В примере StreamVerify.cs есть заголовок о декодировании в поточном режиме, но как это сделать не понятно, сложно разобраться с примерами.
Offline Vadim.NET  
#6 Оставлено : 11 апреля 2018 г. 17:29:24(UTC)
Vadim.NET

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

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

Я так понимаю человек уже бьется 3 месяца - https://www.cryptopro.ru...aspx?g=posts&t=12842
есть пост с обещанием доработать примеры с шифрованием и расшифрованием.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.