AlexMAS / GostCryptography

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

Создание сессионного ключа. Ошибка плохой ключ. #22

Closed AndrewIva closed 5 years ago

AndrewIva commented 5 years ago

Добрый день. Пишу такой код

static void Main(string[] args)
        {

            X509Store x509CertificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            X509Certificate2Collection x509Certificate2Collection = null;
            X509Certificate2 fssCertificate;

            x509CertificateStore.Open(OpenFlags.ReadOnly);
            x509Certificate2Collection = x509CertificateStore.Certificates.Find(X509FindType.FindBySerialNumber, "00c4750d5b11e4db80e811f4cab74fa01e", false);
            if (x509Certificate2Collection.Count == 1)
            {
                fssCertificate = new X509Certificate2(x509Certificate2Collection[0]);
            }
            else
            {
                fssCertificate = null;
            }
            try
            {
                using (var sessionKey = new Gost_28147_89_SymmetricAlgorithm(ProviderType.CryptoPro_2012_512))
                {
                    var publicKey = (GostAsymmetricAlgorithm)fssCertificate.GetPublicKeyAlgorithm();

                    byte[] encryptedKey = GostEncryptedXml.EncryptKey(sessionKey, publicKey);
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.ReadKey();
        }

Получаю ошибку System.Security.Cryptography.CryptographicException: "Плохой ключ." Сертификат беру отсюда https://lk.fss.ru/FSS_PROD_CERT_2019_34.10-2012.cer

Использую алгоритм ГОСТ 34.10.2012 Крипртопровайдер крипто про CSP 4.0.9963

Подскажите, что я делаю неправильно. Спасибо за помощь.

AlexMAS commented 5 years ago

Здравствуйте. На машине установлен только один криптопровайдер?

AndrewIva commented 5 years ago

Добрый день. Проверил сервер. Да действительно стоит 2 криптопровайдера. Крипто-про CSP и VipNet CSP. Можно ли при такой конфигурации работать или нужно удалить один из провайдеров. Спасибо.

AlexMAS commented 5 years ago

В текущей версии по умолчанию осуществляется автоматическое определение предустановленного криптопровайдера, ViPNet в приоритете. Можно установить желаемый тип криптопровайдера, который будет использоваться по умолчанию, явно:

GostCryptoConfig.ProviderType = <VipNet или CryptoPro>;
GostCryptoConfig.ProviderType_2012_512 = <VipNet_2012_512 или CryptoPro_2012_512>;
GostCryptoConfig.ProviderType_2012_1024 = <VipNet_2012_1024 или CryptoPro_2012_1024>;

В вашем случае можно сделать так где-нибудь при инициализации приложения:

GostCryptoConfig.ProviderType = GostCryptoConfig.CryptoPro;
GostCryptoConfig.ProviderType_2012_512 = GostCryptoConfig.CryptoPro_2012_512;
GostCryptoConfig.ProviderType_2012_1024 = GostCryptoConfig.CryptoPro_2012_1024;

Если есть необходимость одновременно работать с двумя криптопровайдерами, то желаемый нужно будет передать явно в конструкторы. Если работаете всегда с одним криптопровайдером (предустановленным на машине и неважно каким, либо явно сконфигурированным, как указано выше), то передача типа криптопровайдера в конструкторы нигде не требуется.

AndrewIva commented 5 years ago

Спасибо, решение работает ошибка ушла.