Example #1
0
        /// <summary>
        /// Дешифровка марканта с помошью KeyExchangeFormatter
        /// </summary>
        /// <param name="markant">Маркант для дешифровки</param>
        /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом получателя</param>
        /// <returns>Дешифрованный сессионный ключ</returns>
        public static Gost28147 DecryptMarkantWithKeyExchangeFormatter(Markant markant, ProviderInitData providerInitData)
        {
            //Готовим параметры контейнера
            CspParameters decrypt_cspParameters = new CspParameters
            {
                ProviderType     = (int)providerInitData.ProviderType,
                Flags            = CspProviderFlags.NoPrompt,
                KeyPassword      = providerInitData.ProviderPassword,
                KeyContainerName = providerInitData.ProviderContainerName
            };
            //Открываем контейнер
            Gost3410_2012_256CryptoServiceProvider decrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(decrypt_cspParameters);
            // Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
            Gost2012_256KeyExchangeDeformatter decrypt_gostKeyExchangeDeformatter = new Gost2012_256KeyExchangeDeformatter(decrypt_gost3410);
            // Получаем ГОСТ-овый ключ из GostKeyTransport.
            GostKeyTransport gostKeyTransport = new GostKeyTransport();

            gostKeyTransport.Decode(markant.SessionKey);
            Gost28147 decrypt_gost28147 = (Gost28147)decrypt_gostKeyExchangeDeformatter.DecryptKeyExchange(gostKeyTransport);

            if (decrypt_gost28147 == null)
            {
                throw new Exception("Invalid decrypted session key");
            }
            // Устанавливаем синхропосылку.
            decrypt_gost28147.IV = markant.IV;

            return(decrypt_gost28147);
        }
Example #2
0
        /// <summary>
        /// Создает маркант с помошью KeyExchangeFormatter
        /// </summary>
        /// <param name="gost28147">Сессионный ключ</param>
        /// <param name="certFileName">Путь к файлу сертификата с открытым ключом получателя</param>
        /// <returns>Сгенерированный маркант</returns>
        public static Markant CreateMarkantWithKeyExchangeFormatter(Gost28147 gost28147, string certFileName)
        {
            // Разбираем сертификат получателя
            X509Certificate2 cert = new X509Certificate2(certFileName);

            if (!(cert.PublicKey.Key is Gost3410_2012_256 gost3410))
            {
                throw new CryptographicException("Not a GOST certificate");
            }

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

            //Формируем маркант
            Markant m = new Markant
            {
                Version    = 1,
                SessionKey = gostKeyTransport.Encode(),
                IV         = gost28147.IV
            };

            return(m);
        }
Example #3
0
        /// <summary>
        /// Дешифровка марканта с помошью ключа согласования
        /// </summary>
        /// <param name="markant">Маркант для дешифровки</param>
        /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом получателя</param>
        /// <returns>Дешифрованный сессионный ключ</returns>
        public static Gost28147 DecryptMarkantWithKeyAgree(Markant markant, ProviderInitData providerInitData)
        {
            //Готовим параметры контейнера
            CspParameters decrypt_cspParameters = new CspParameters
            {
                ProviderType     = (int)providerInitData.ProviderType,
                Flags            = CspProviderFlags.NoPrompt,
                KeyPassword      = providerInitData.ProviderPassword,
                KeyContainerName = providerInitData.ProviderContainerName
            };
            //Открываем контейнер
            Gost3410_2012_256CryptoServiceProvider decrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(decrypt_cspParameters);
            // Читаем открытый ключ
            Gost3410Parameters decrypt_gost3410PublicKeyParameters = (Gost3410Parameters)Helper.ByteArrayToObject(markant.PublicKey);
            // Создаем agree ключ
            GostSharedSecretAlgorithm agree = decrypt_gost3410.CreateAgree(decrypt_gost3410PublicKeyParameters);
            // Расшифровываем симметричный ключ на agree
            Gost28147 decrypt_gost28147 = (Gost28147)agree.Unwrap(markant.SessionKey, GostKeyWrapMethod.CryptoProKeyWrap);

            decrypt_gost28147.IV = markant.IV;

            if (decrypt_gost28147 == null)
            {
                throw new Exception("Invalid decrypted session key");
            }
            // Устанавливаем синхропосылку.
            decrypt_gost28147.IV = markant.IV;

            return(decrypt_gost28147);
        }
Example #4
0
        private void bCreateMarkant_Click(object sender, EventArgs e)
        {
            currentMarkant = null;

            tbMarkantHex.Text     = "";
            tbMarkantASN1.Text    = "";
            tbCurrentMarkant.Text = "";

            if (currentGost28147 != null)
            {
                //Выбираем алгоритм и шифруем сессионный ключ
                if (rbKeyAgree.Checked)
                {
                    currentMarkant = MarkantManager.CreateMarkantWithKeyAgree(currentGost28147, tbCertFile.Text, new ProviderInitData(cbProviderNameSender.Text, cbProviderPasswordSender.Text));
                }
                else
                {
                    currentMarkant = MarkantManager.CreateMarkantWithKeyExchangeFormatter(currentGost28147, tbCertFile.Text);
                }


                tbCurrentMarkant.Text = currentMarkant.ToString();
                tbMarkantHex.Text     = Helper.ByteArrayToHexString(currentMarkant.EncodeToAsn1());
                tbMarkantASN1.Text    = Markant.PrintFromAsn1(currentMarkant.EncodeToAsn1());
            }
            else
            {
                MessageBox.Show("Отсутствует сессионный ключ!", "Создание марканта");
            }
        }
Example #5
0
 private void bMarkantClear_Click(object sender, EventArgs e)
 {
     tbMarkantHex.Text     = "";
     tbMarkantASN1.Text    = "";
     tbCurrentMarkant.Text = "";
     currentMarkant        = null;
 }
Example #6
0
        /// <summary>
        /// Создает маркант с помошью ключа согласования
        /// </summary>
        /// <param name="gost28147">Сессионный ключ</param>
        /// <param name="certFileName">Путь к файлу сертификата получателя</param>
        /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом отправителя</param>
        /// <returns>Сгенерированный маркант</returns>
        public static Markant CreateMarkantWithKeyAgree(Gost28147 gost28147, string certFileName, ProviderInitData providerInitData)
        {
            // Разбираем сертификат получателя
            X509Certificate2 cert = new X509Certificate2(certFileName);

            if (!(cert.PublicKey.Key is Gost3410_2012_256 gost3410))
            {
                throw new CryptographicException("Not a GOST certificate");
            }

            //Готовим параметры контейнера
            CspParameters cspParameters = new CspParameters
            {
                ProviderType     = (int)providerInitData.ProviderType,
                Flags            = CspProviderFlags.NoPrompt,
                KeyPassword      = providerInitData.ProviderPassword,
                KeyContainerName = providerInitData.ProviderContainerName
            };
            //Открываем контейнер
            Gost3410_2012_256CryptoServiceProvider encrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(cspParameters);
            Gost3410Parameters encrypt_gost3410PublicKeyParameters  = encrypt_gost3410.ExportParameters(false);
            // Создаем agree ключ
            GostSharedSecretAlgorithm agree = encrypt_gost3410.CreateAgree(gost3410.ExportParameters(false));

            // Зашифровываем симметричный ключ на agree ключе.
            byte[] wrappedKey = agree.Wrap(gost28147, GostKeyWrapMethod.CryptoProKeyWrap);

            //Формируем маркант
            Markant m = new Markant
            {
                Version    = 2,
                SessionKey = wrappedKey,
                IV         = gost28147.IV,
                PublicKey  = Helper.ObjectToByteArray(encrypt_gost3410PublicKeyParameters)
            };

            return(m);
        }