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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline yury.kerbitskov  
#1 Оставлено : 29 августа 2018 г. 11:15:04(UTC)
yury.kerbitskov

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

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

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

Есть задача: шифровать файлы и расшифровывать. Формат файла PKCS7. Файл должен разбираться КриптоАРМом

Шифрование реализовано у меня сейчас следующим образом:

Код:

public static void Encrypt(string certFileName, string inFileName, string outFileName)
{
    // Разбираем сертификат получателя
    X509Certificate2 cert = new X509Certificate2(certFileName);

    ContentInfo plainContent = new ContentInfo(File.ReadAllBytes(inFileName));

    EnvelopedCms encryptedData = new EnvelopedCms(
      SubjectIdentifierType.IssuerAndSerialNumber,
      plainContent,
      new AlgorithmIdentifier(new Oid("1.2.643.7.1.2.5.1.1")));

    CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, cert);

    encryptedData.Encrypt(recipient);

    byte[] encryptedBytes = encryptedData.Encode();
    File.WriteAllBytes(outFileName, encryptedBytes);
}


Дешифрование:

Код:

public static void Decrypt(string inFileName, string outFileName)
{
    EnvelopedCms encryptedData = new EnvelopedCms();

    encryptedData.Decode(File.ReadAllBytes(inFileName));
    encryptedData.Decrypt(encryptedData.RecipientInfos[1]);

    File.WriteAllBytes(outFileName, encryptedData.ContentInfo.Content);
}


Всё работает как надо, файлы получаются именно в том формате, в котором мне необходимо.
Но у данного кода два серьёзных недостатка:

  • Не потоковая работа. При большом объёме файла, он будет загружаться весь в память.
  • Пароль от контейнера мне приходится писать руками во всплывающем окне. А мне надо задавать его из кода.


Порывшись в гугле я пришёл к выводу, что это можно реализовать с помощью BouncyCastle. Начать я решил с дешифрования. Но я не понимаю как подружить Bouncy и КриптоПРО.
Сейчас я пришёл к такому коду:
Код:

public static void BouncyDecrypt(string inFileName, string outFileName)
{
    using (var inputFileStream = new FileStream(inFileName, FileMode.Open))
    { 
        CmsEnvelopedDataParser ep = new CmsEnvelopedDataParser(inputFileStream);
        var recInfo = GetSingleRecipient(ep);
              
        using (var outputFileStream = File.Create(outFileName))
        {
            recInfo.GetContentStream(GetPrivateKey()).ContentStream.CopyTo(outputFileStream);
        }
    }
}

private static RecipientInformation GetSingleRecipient(CmsEnvelopedDataParser parser)
{
    var recInfos = parser.GetRecipientInfos().GetRecipients();
    var enumerator = recInfos.GetEnumerator();
    enumerator.MoveNext();
    return (RecipientInformation)enumerator.Current;
}


GetPrivateKey() реализацию не привожу, так как там экспериментальный код, который всё равно не работает. В кратце я создаю инстанс Gost3410_2012_256CryptoServiceProvider, а дальше пытаюсь достать оттуда и сконвертировать в формат Bouncy приватный ключ.

Проблема у меня несколько в таким кодом:

  • Я не могу получить приватный ключ. КриптоПРО не даёт его экпортировать.
  • По всей видимости метод GetContentStream не умеет работать с ГОСТ3410_256. Это я выяснил забравшись в исходники. Он не может по Oid 1.2.643.7.1.2.5.1.1 получить алгоритм.


В связи с этим взываю к вашей помощи. Возможно кто-то уже сталкивался с подобными проблемами и знает как их решить или хотя бы в каком направлении двигаться. Я пока в тупике.
Offline Артём Макаров  
#2 Оставлено : 29 августа 2018 г. 13:32:18(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 54 раз в 53 постах
Приветствую.

КриптоПро .NET не позволяет экспорт секретных ключей в явном виде.

Насколько я знаю, полноценной поддержки ключей 2012 госта у BouncyCastle нет. Сертификаты так же не откроются.

Возможно и cms для 2012 госта не поддерживается.

Тут сделали что похожее для потоковой cms подписи через нативные вызовы. Можно попробовать переписать для шифрования.

Отредактировано пользователем 3 сентября 2018 г. 16:22:07(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
yury.kerbitskov оставлено 31.08.2018(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.