Beispiel #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);
        }
Beispiel #2
0
        public void SetSymmetrKey(byte[] data)
        {
            Gost2012_256KeyExchangeDeformatter deformatter = new Gost2012_256KeyExchangeDeformatter(currentCertificate.PrivateKey);
            GostKeyTransport encKey = new GostKeyTransport();

            encKey.Decode(data);
            symKey = deformatter.DecryptKeyExchange(encKey) as Gost28147;
        }
        /// <summary>
        /// Восстановления по данным обмена симметричного ключа
        /// на основе <a href="http://www.ietf.org/rfc/rfc4490">ГОСТ Р 34.10
        /// транспорта</a>.
        /// </summary>
        ///
        /// <param name="data"> Зашифрованные данные обмена
        /// ключами.</param>
        ///
        /// <returns>Симметричный ключ.</returns>
        ///
        /// <argnull name="data" />
        public SymmetricAlgorithm DecryptKeyExchangeData(byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            GostKeyTransport transport = new GostKeyTransport();

            transport.Decode(data);
            return(DecryptKeyExchange(transport));
        }