示例#1
0
        public override SymmetricAlgorithm Unwrap(byte[] wrapped,
                                                  GostKeyWrapMethod method)
        {
            GostWrappedKeyObject gwk = new GostWrappedKeyObject();

            gwk.SetByXmlWrappedKey(wrapped);
            if (method == GostKeyWrapMethod.CryptoProKeyWrap)
            {
                return(CryptoProUnwrap(wrapped, GostConstants.CALG_PRO_EXPORT));
            }
            else if (method == GostKeyWrapMethod.CryptoPro12KeyWrap)
            {
                // В случае с гостом 2012 мы не уверны, был ли экспорт на ProExport или ProExport12
                // из-за обратной совместимости (раньше шифровали на ProExport, теперь только на ProExport12). Попробуем оба варианата
                return(CryptoProUnwrap(wrapped));
            }
            else if (method == GostKeyWrapMethod.GostKeyWrap)
            {
                return(GostUnwrap(wrapped));
            }
            else
            {
                throw new ArgumentOutOfRangeException("method");
            }
        }
        /// <summary>
        /// Восстановления по данным обмена симметричного ключа
        /// на основе <a href="http://www.ietf.org/rfc/rfc4490">ГОСТ Р 34.10
        /// транспорта</a>.
        /// </summary>
        ///
        /// <param name="transport"> Зашифрованные данные обмена
        /// ключами.</param>
        /// <param name="keyWrapMethod">Алгоритм симметричного экспорта</param>
        ///
        /// <returns>Симметричный ключ.</returns>
        ///
        /// <argnull name="transport" />
        public SymmetricAlgorithm DecryptKeyExchange(
            GostKeyTransport transport,
            GostKeyWrapMethod keyWrapMethod = GostKeyWrapMethod.CryptoPro12KeyWrap)
        {
            GostSharedSecretAlgorithm agree;

            switch (_gostAlgorithmType)
            {
            case CspAlgorithmType.Gost2001:
            {
                agree = ((Gost3410)_gostKey).CreateAgree(transport.TransportParameters);
                break;
            }

            case CspAlgorithmType.Gost2012_256:
            {
                agree = ((Gost3410_2012_256)_gostKey).CreateAgree(transport.TransportParameters);
                break;
            }

            case CspAlgorithmType.Gost2012_512:
            {
                agree = ((Gost3410_2012_512)_gostKey).CreateAgree(transport.TransportParameters);
                break;
            }

            default:
            {
                throw new NotSupportedException();
            }
            }

            return(agree.Unwrap(transport.SessionEncryptedKey.GetXmlWrappedKey(),
                                keyWrapMethod));
        }
示例#3
0
        /// <summary>
        /// Вспомогательный метод, работающий для всех GOST3410
        /// </summary>
        /// <param name="createAgree"></param>
        /// <param name="exportParameters"></param>
        /// <param name="senderParameters"></param>
        /// <param name="alg"></param>
        /// <param name="keyWrapMethod"></param>
        /// <returns></returns>
        private GostKeyTransport GetGostTransport(
            Func <Gost3410Parameters, GostSharedSecretAlgorithm> createAgree,
            Func <bool, Gost3410Parameters> exportParameters,
            Gost3410Parameters senderParameters,
            SymmetricAlgorithm alg,
            GostKeyWrapMethod keyWrapMethod)
        {
            GostKeyTransportObject transport = new GostKeyTransportObject();

            byte[] wrapped_data;

            using (GostSharedSecretAlgorithm agree = createAgree(
                       senderParameters))
            {
                // Зашифровываем симметричный ключ.
                wrapped_data = agree.Wrap(alg,
                                          keyWrapMethod);
            }

            GostWrappedKeyObject wrapped = new GostWrappedKeyObject();

            wrapped.SetByXmlWrappedKey(wrapped_data);

            transport.sessionEncryptedKey_            = wrapped;
            transport.transportParameters_            = new Gost3410CspObject();
            transport.transportParameters_.Parameters = exportParameters(false);

            return(transport.Transport);
        }
        /// <summary>
        /// Импортирует (дешифрует) секретный ключ.
        /// </summary>
        /// <param name="wrapped">Зашифрованный секретный ключ.</param>
        /// <param name="method">Алгоритм экспорта ключа.</param>
        public override SymmetricAlgorithm Unwrap(byte[] wrapped, GostKeyWrapMethod method)
        {
            GostWrappedKeyObject gwk = new GostWrappedKeyObject();

            gwk.SetByXmlWrappedKey(wrapped);
            int calg = GostConstants.CALG_SIMPLE_EXPORT;

            if (method == GostKeyWrapMethod.CryptoProKeyWrap)
            {
                calg = GostConstants.CALG_PRO_EXPORT;
            }
            else if (method == GostKeyWrapMethod.CryptoPro12KeyWrap)
            {
                calg = GostConstants.CALG_PRO12_EXPORT;
            }
            else if (method != GostKeyWrapMethod.GostKeyWrap)
            {
                throw new ArgumentOutOfRangeException("method");
            }
            SymmetricAlgorithm ret = null;

            // Сохраняем состояние algid GOST12147
            using (SafeKeyHandle hExpKey = CapiHelper.DuplicateKey(SafeKeyHandle.DangerousGetHandle()))
            {
                CapiHelper.SetKeyParamDw(hExpKey, GostConstants.KP_ALGID, calg);
                SafeKeyHandle simmKey = SafeKeyHandle.InvalidHandle;
                CapiHelper.AcquireCsp(_parameters, out SafeProvHandle hProv);

                CapiHelper.ImportSessionWrappedKey(
                    hProv, CspProviderFlags.NoFlags,
                    gwk, hExpKey, ref simmKey);
                ret = new Gost28147CryptoServiceProvider(simmKey, hProv);
            }
            return(ret);
        }
示例#5
0
        /// <summary>
        /// Экспортирует (шифрует) секретный ключ.
        /// </summary>
        /// <param name="prov">Шифруемый ключ.</param>
        /// <param name="method">Алгоритм экспорта ключа.</param>
        /// <returns>Зашифрованный симметричный ключ</returns>
        public override byte[] Wrap(Gost28147 prov, GostKeyWrapMethod method)
        {
            SafeKeyHandle hSimmKey = ((Gost28147CryptoServiceProvider)prov).SafeKeyHandle;
            int           calg     = GostConstants.CALG_SIMPLE_EXPORT;

            if (method == GostKeyWrapMethod.CryptoProKeyWrap)
            {
                calg = GostConstants.CALG_PRO_EXPORT;
            }
            else if (method == GostKeyWrapMethod.CryptoPro12KeyWrap)
            {
                calg = GostConstants.CALG_PRO12_EXPORT;
            }
            else if (method != GostKeyWrapMethod.GostKeyWrap)
            {
                throw new ArgumentOutOfRangeException("method");
            }
            byte[] ret = null;
            // Сохраняем состояние algid GOST12147
            using (SafeKeyHandle hExpKey = CapiHelper.DuplicateKey(
                       SafeKeyHandle.DangerousGetHandle(),
                       SafeProvHandle))
            {
                CapiHelper.SetKeyParameter(hExpKey, GostConstants.KP_ALGID, calg);
                CapiHelper.SetKeyParameter(hExpKey, GostConstants.KP_IV, IV);

                GostWrappedKeyObject wrappedKey = new GostWrappedKeyObject();
                CapiHelper.ExportSessionWrapedKey(hSimmKey,
                                                  hExpKey, wrappedKey);

                ret = wrappedKey.GetXmlWrappedKey();
            }
            return(ret);
        }
示例#6
0
        /// <summary>
        /// Экспортирует (шифрует) секретный ключ.
        /// </summary>
        /// <param name="prov">Шифруемый ключ.</param>
        /// <param name="method">Алгоритм экспорта ключа.</param>
        /// <returns>Зашифрованный симметричный ключ</returns>
        public override byte[] Wrap(Gost28147 prov, GostKeyWrapMethod method)
        {
            throw new NotImplementedException();
            //SafeKeyHandle hSimmKey = ((Gost28147CryptoServiceProvider)prov).SafeKeyHandle;
            //int calg = GostConstants.CALG_SIMPLE_EXPORT;
            //if (method == GostKeyWrapMethod.CryptoProKeyWrap)
            //    calg = GostConstants.CALG_PRO_EXPORT;
            //else if (method == GostKeyWrapMethod.CryptoPro12KeyWrap)
            //    calg = GostConstants.CALG_PRO12_EXPORT;
            //else if (method != GostKeyWrapMethod.GostKeyWrap)
            //    throw new ArgumentOutOfRangeException("method");
            //byte[] ret = null;
            //// Сохраняем состояние algid GOST12147
            //using (SafeKeyHandle hExpKey = CapiHelper.DuplicateKey(SafeKeyHandle.DangerousGetHandle())
            //{
            //    CapiHelper.SetKeyParameter(hExpKey, GostConstants.KP_ALGID, calg);
            //    CapiHelper.SetKeyParameter(hExpKey, GostConstants.KP_IV, IV);

            //    GostWrappedKeyObject wrappedKey = new GostWrappedKeyObject();
            //    CapiHelper.ExportSessionWrapedKey(hSimmKey,
            //        hExpKey, wrappedKey);

            //    ret = wrappedKey.GetXmlWrappedKey();
            //}
            //return ret;
        }
示例#7
0
        private void TestKeyWrap(GostKeyWrapMethod keyWrapMethod)
        {
            using (Gost28147 gost = new Gost28147CryptoServiceProvider())
            {
                using (Gost28147 keyToWrap = new Gost28147CryptoServiceProvider())
                {
                    var data          = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1 };
                    var encryptedData = GostEncrypt(keyToWrap, data);

                    var wrappedKey   = gost.Wrap(keyToWrap, keyWrapMethod);
                    var unwrappedKey = gost.Unwrap(wrappedKey, keyWrapMethod) as Gost28147;
                    var iv           = keyToWrap.IV;

                    var decryptedData = GostDecrypt(unwrappedKey, encryptedData, iv);

                    Assert.Equal(data, decryptedData);
                }
            }
        }
        /// <summary>
        /// Формирование данных обмена, на основе симметричного
        /// ключа шифрования сообщения ГОСТ 28147.
        /// </summary>
        ///
        /// <param name="alg">Симметричный ключ ГОСТ 28147.</param>
        /// <param name="wrapMethod">Алгоритм экпорта</param>
        /// <returns>Зашифрованные данные для отправки стороне
        /// получателю.</returns>
        ///
        /// <argnull name="alg" />
        public GostKeyTransport CreateKeyExchange(SymmetricAlgorithm alg, GostKeyWrapMethod wrapMethod)
        {
            if (alg == null)
            {
                throw new ArgumentNullException("alg");
            }
            if (wrapMethod != GostKeyWrapMethod.CryptoProKeyWrap && wrapMethod != GostKeyWrapMethod.CryptoPro12KeyWrap)
            {
                throw new CryptographicException(
                          string.Format(Properties.Resources.Cryptography_UnsupportedWrapMethod, wrapMethod));
            }

            // Получаем параметры получателя.
            Gost3410Parameters senderParameters = gostKey_.ExportParameters(
                false);

            GostKeyTransportObject transport = new GostKeyTransportObject();

            // Создаем эфимерный ключ с параметрами получателя.
            using (Gost3410_2012_512EphemeralCryptoServiceProvider sender = new Gost3410_2012_512EphemeralCryptoServiceProvider(
                       senderParameters))
            {
                // Создаем распределенный секрет.
                byte[] wrapped_data;
                using (GostSharedSecretAlgorithm agree = sender.CreateAgree(
                           senderParameters))
                {
                    // Зашифровываем симметричный ключ.
                    wrapped_data = agree.Wrap(alg,
                                              wrapMethod);
                }

                GostWrappedKeyObject wrapped = new GostWrappedKeyObject();
                wrapped.SetByXmlWrappedKey(wrapped_data);

                transport.sessionEncryptedKey_            = wrapped;
                transport.transportParameters_            = new Gost3410CspObject();
                transport.transportParameters_.Parameters = sender.ExportParameters(false);
            }

            return(transport.Transport);
        }
示例#9
0
 /// <summary>
 /// Wrap ключа Gost28147CryptoServiceProvider на agree.
 /// </summary>
 ///
 /// <param name="prov">Шифруемый ключ</param>
 /// <param name="method">Метод зашифрования ключа.</param>
 ///
 /// <returns>Зашифрованный симметричный ключ</returns>
 private byte[] Wrap(Gost28147CryptoServiceProvider prov,
                     GostKeyWrapMethod method)
 {
     if (method == GostKeyWrapMethod.CryptoProKeyWrap)
     {
         return(CryptoProWrap(prov));
     }
     else if (method == GostKeyWrapMethod.CryptoPro12KeyWrap)
     {
         return(CryptoProWrap(prov, GostConstants.CALG_PRO12_EXPORT));
     }
     else if (method == GostKeyWrapMethod.GostKeyWrap)
     {
         return(GostWrap(prov));
     }
     else
     {
         throw new ArgumentOutOfRangeException("method");
     }
 }
示例#10
0
        /// <summary>
        /// Зашифрование (экспорт) симметричного ключа.
        /// </summary>
        ///
        /// <remarks><para>Формат зашифрованного ключа зависит от метода
        /// зашифрования; для <see cref="GostKeyWrapMethod.GostKeyWrap"/> и
        /// <see cref="GostKeyWrapMethod.CryptoProKeyWrap"/>
        /// формат зашифрованного ключа определяется функцией
        /// <see cref="GostWrappedKey.GetXmlWrappedKey"/>.</para>
        ///
        /// <para>При зашифровании ключа используется синхропосылка
        /// заданная <see cref="SymmetricAlgorithm.IV"/></para>
        /// </remarks>
        ///
        /// <param name="alg">Объект класса <see cref="SymmetricAlgorithm"/>,
        /// содержащий симметричный ключ.</param>
        /// <param name="method">Алгоритм экспорта ключа.</param>
        ///
        /// <returns>Зашифрованный симметричный ключ.</returns>
        ///
        /// <seealso cref="GostWrappedKey"/>
        /// <seealso cref="GostSharedSecretCryptoServiceProvider.Unwrap"/>
        public override byte[] Wrap(SymmetricAlgorithm alg,
                                    GostKeyWrapMethod method)
        {
            Gost28147 gost = alg as Gost28147;

            if (gost == null)
            {
                throw new ArgumentException(nameof(alg));
            }
            Gost28147CryptoServiceProvider prov = gost as
                                                  Gost28147CryptoServiceProvider;

            if (prov == null)
            {
                using (Gost28147CryptoServiceProvider p =
                           new Gost28147CryptoServiceProvider())
                {
                    return(p.Wrap(prov, method));
                }
            }
            return(Wrap(prov, method));
        }
示例#11
0
 public override byte[] Wrap(Gost28147 keyExchangeAlgorithm, GostKeyWrapMethod method)
 {
     throw null;
 }
示例#12
0
 /// <summary>
 /// Экспортирует (шифрует) секретный ключ.
 /// </summary>
 /// <param name="prov">Шифруемый ключ.</param>
 /// <param name="method">Алгоритм экспорта ключа.</param>
 /// <returns>Зашифрованный симметричный ключ</returns>
 public abstract byte[] Wrap(Gost28147 prov, GostKeyWrapMethod method);
示例#13
0
 public override SymmetricAlgorithm Unwrap(byte[] wrapped, GostKeyWrapMethod method)
 {
     throw null;
 }
示例#14
0
        /// <summary>
        /// Формирование данных обмена, на основе симметричного
        /// ключа шифрования сообщения ГОСТ 28147.
        /// </summary>
        ///
        /// <param name="alg">Симметричный ключ ГОСТ 28147.</param>
        /// <param name="wrapMethod">Алгоритм экпорта</param>
        /// <returns>Зашифрованные данные для отправки стороне
        /// получателю.</returns>
        ///
        /// <argnull name="alg" />
        public byte[] CreateKeyExchangeData(SymmetricAlgorithm alg, GostKeyWrapMethod wrapMethod)
        {
            GostKeyTransport transport = CreateKeyExchange(alg, wrapMethod);

            return(transport.Encode());
        }
示例#15
0
 /// <summary>
 /// Расшифровывает секретный ключ.
 /// </summary>
 ///
 /// <param name="wrapped">Зашифрованный ключ.</param>
 /// <param name="method">Метод зашифрования ключа.</param>
 ///
 /// <returns>Объкт класса <see cref="SymmetricAlgorithm"/>, содержащий
 /// секретный ключ.</returns>
 public abstract SymmetricAlgorithm Unwrap(byte[] wrapped,
                                           GostKeyWrapMethod method);
示例#16
0
 /// <summary>
 /// Шифрует секретный ключ.
 /// </summary>
 ///
 /// <param name="alg">Объект класса <see cref="SymmetricAlgorithm"/>,
 /// содержащий секретный ключ. </param>
 /// <param name="method">Метод зашифрования ключа.</param>
 ///
 /// <returns>Зашифрованный ключ.</returns>
 public abstract byte[] Wrap(SymmetricAlgorithm alg,
                             GostKeyWrapMethod method);
示例#17
0
        /// <summary>
        /// Формирование данных обмена, на основе симметричного
        /// ключа шифрования сообщения ГОСТ 28147.
        /// </summary>
        ///
        /// <param name="alg">Симметричный ключ ГОСТ 28147.</param>
        /// <param name="keyWrapMethod">Алгоритм симметричного экспорта</param>
        ///
        /// <returns>Зашифрованные данные для отправки стороне
        /// получателю.</returns>
        ///
        /// <argnull name="alg" />
        public GostKeyTransport CreateKeyExchange(
            SymmetricAlgorithm alg,
            GostKeyWrapMethod keyWrapMethod = GostKeyWrapMethod.CryptoPro12KeyWrap)
        {
            if (alg == null)
            {
                throw new ArgumentNullException("alg");
            }

            // Получаем параметры получателя.
            Gost3410Parameters senderParameters;

            switch (_gostAlgorithmType)
            {
            case CspAlgorithmType.Gost2001:
            {
                senderParameters = ((Gost3410)_gostKey).ExportParameters(false);
                using (Gost3410EphemeralCryptoServiceProvider sender =
                           new Gost3410EphemeralCryptoServiceProvider(senderParameters))
                {
                    return(GetGostTransport(
                               sender.CreateAgree,
                               sender.ExportParameters,
                               senderParameters,
                               alg,
                               keyWrapMethod));
                }
            }

            case CspAlgorithmType.Gost2012_256:
            {
                senderParameters = ((Gost3410_2012_256)_gostKey).ExportParameters(false);
                using (Gost3410_2012_256EphemeralCryptoServiceProvider sender =
                           new Gost3410_2012_256EphemeralCryptoServiceProvider(senderParameters))
                {
                    return(GetGostTransport(
                               sender.CreateAgree,
                               sender.ExportParameters,
                               senderParameters,
                               alg,
                               keyWrapMethod));
                }
            }

            case CspAlgorithmType.Gost2012_512:
            {
                senderParameters = ((Gost3410_2012_512)_gostKey).ExportParameters(false);
                using (Gost3410_2012_512EphemeralCryptoServiceProvider sender =
                           new Gost3410_2012_512EphemeralCryptoServiceProvider(senderParameters))
                {
                    return(GetGostTransport(
                               sender.CreateAgree,
                               sender.ExportParameters,
                               senderParameters,
                               alg,
                               keyWrapMethod));
                }
            }

            default:
            {
                throw new NotSupportedException();
            }
            }
        }
示例#18
0
 /// <summary>
 /// Импортирует (дешифрует) секретный ключ.
 /// </summary>
 /// <param name="wrapped">Зашифрованный секретный ключ.</param>
 /// <param name="method">Алгоритм экспорта ключа.</param>
 public override SymmetricAlgorithm Unwrap(byte[] wrapped, GostKeyWrapMethod method)
 {
     throw new NotImplementedException();
 }