AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
128 stars 41 forks source link

Проблема(?) с настройками по-умолчанию #17

Open Uriel6575 opened 5 years ago

Uriel6575 commented 5 years ago

И снова приветствую!

Не уверен, что это баг, но с виду выглядит, что так. Последовал данному в другом вопросе совету и убрал передачу типа провайдера в конструкторы алгоритмов. Использую соответствующие свойства GostCryptoConfig.

И тут вдруг выяснилось, что сломалось шифрование на сертификат ФСС, выпущенный по новым ГОСТам. Лечится это явной передачей CryptoPro_2012_512 в конструктор Gost_28147_89_SymmetricAlgorithm. Решил посмотреть, что происходит по-умолчанию и дошёл вот до этого куска:

protected GostSymmetricAlgorithm() : this(GostCryptoConfig.ProviderType)
{
}

Но ведь если шифрование идёт на новый ГОСТ, то надо брать значение не из ProviderType, а из ProviderType_2012_5121 или ProviderType_2012_1024. Не знаю, можно ли с этим что-то сделать, но поведение странное.

AlexMAS commented 5 years ago

Это странно, т.к. алгоритм симметричного шифрования не менялся и должен поддерживаться всеми криптопровпйдерами. Может, конечно, в новых версиях CryptoPro что-то изменилось. Можете сказать, какая у вас версия и привести пример кода.

AlexMAS commented 5 years ago

Да, есть ещё вариант, что от GostSymmetricAlgorithm.ProviderType зависит другой код, нужно посмотреть. Но пример использования был бы кстати. :)

Uriel6575 commented 5 years ago

Да всё просто, собственно. Или я что-то не так делаю?

using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using GostCryptography.Base;
using GostCryptography.Config;
using GostCryptography.Gost_28147_89;
using GostCryptography.Xml;

namespace CryptoSample {
    internal class Program {
        public static void Main() {
            var fssCertUri = new Uri("https://cabinets.fss.ru/FSS_PROD_CERT_2019_34.10-2012.cer");
            var fssCertBytes = new WebClient().DownloadData(fssCertUri);
            var fssCert = new X509Certificate2(fssCertBytes);

            GostCryptoConfig.ProviderType_2012_512 = ProviderType.CryptoPro_2012_512;

            var xml = new XmlDocument();
            xml.LoadXml("<Test />");

            using (var gost28147 = new Gost_28147_89_SymmetricAlgorithm())
                GostEncryptedXml.EncryptKey(gost28147, (GostAsymmetricAlgorithm)fssCert.GetPublicKeyAlgorithm());
        }
    }
}
Uriel6575 commented 5 years ago

Ах да, прошу прощения. КриптоПро CSP 4.0.9963 ViPNet CSP 4.2 (8.51670)