private static byte[] CreateSignature(Gost3410AsymmetricAlgorithmBase privateKey, Stream dataStream)
        {
            byte[] hash;

            using (var hashAlg = new Gost3411HashAlgorithm())
            {
                hash = hashAlg.ComputeHash(dataStream);
            }

            return privateKey.CreateSignature(hash);
        }
        private static bool VerifySignature(Gost3410AsymmetricAlgorithmBase publicKey, Stream dataStream, byte[] signature)
        {
            byte[] hash;

            using (var hashAlg = new Gost3411HashAlgorithm())
            {
                hash = hashAlg.ComputeHash(dataStream);
            }

            return publicKey.VerifySignature(hash, signature);
        }
Beispiel #3
0
        /// <summary>
        /// Устанавливает открытый ключ для проверки цифрововй подписи.
        /// </summary>
        /// <param name="publicKey">Открытый ключ для проверки цифровой подписи.</param>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        public override void SetKey(AsymmetricAlgorithm publicKey)
        {
            if (publicKey == null)
            {
                throw ExceptionUtility.ArgumentNull("publicKey");
            }

            if (!(publicKey is Gost3410AsymmetricAlgorithmBase))
            {
                throw ExceptionUtility.ArgumentOutOfRange("publicKey", Resources.ShouldSupportGost3410);
            }

            _publicKey = (Gost3410AsymmetricAlgorithmBase)publicKey;
        }
        /// <summary>
        /// Устанавливает открытый ключ для проверки цифрововй подписи.
        /// </summary>
        /// <param name="publicKey">Открытый ключ для проверки цифровой подписи.</param>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        public override void SetKey(AsymmetricAlgorithm publicKey)
        {
            if (publicKey == null)
            {
                throw ExceptionUtility.ArgumentNull("publicKey");
            }

            if (!(publicKey is Gost3410AsymmetricAlgorithmBase))
            {
                throw ExceptionUtility.ArgumentOutOfRange("publicKey", Resources.ShouldSupportGost3410);
            }

            _publicKey = (Gost3410AsymmetricAlgorithmBase)publicKey;
        }
        public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost3410AsymmetricAlgorithmBase publicKey)
        {
            if (sessionKey == null)
            {
                throw ExceptionUtility.ArgumentNull("sessionKey");
            }

            if (publicKey == null)
            {
                throw ExceptionUtility.ArgumentNull("publicKey");
            }

            var formatter = new GostKeyExchangeFormatter(publicKey);
            return formatter.CreateKeyExchangeData(sessionKey);
        }
        public static SymmetricAlgorithm DecryptKeyClass(byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey)
        {
            if (keyData == null)
            {
                throw ExceptionUtility.ArgumentNull("keyData");
            }

            if (privateKey == null)
            {
                throw ExceptionUtility.ArgumentNull("privateKey");
            }

            var deformatter = new GostKeyExchangeDeformatter(privateKey);
            var decryptionKey = deformatter.DecryptKeyExchangeAlgorithm(keyData);

            return decryptionKey;
        }
        private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, Gost3410AsymmetricAlgorithmBase publicKey)
        {
            // Создание объекта для шифрации XML
            var encryptedXml = new GostEncryptedXml();

            // Поиск элементов для шифрации
            var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']");

            if (elements != null)
            {
                var elementIndex = 0;

                foreach (XmlElement element in elements)
                {
                    // Создание случайного сессионного ключа
                    using (var sessionKey = new Gost28147SymmetricAlgorithm())
                    {
                        // Шифрация элемента
                        var encryptedData = encryptedXml.EncryptData(element, sessionKey, false);

                        // Шифрация сессионного ключа с использованием публичного асимметричного ключа
                        var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, publicKey);

                        // Формирование элемента EncryptedData
                        var elementEncryptedData = new EncryptedData();
                        elementEncryptedData.Id = "EncryptedElement" + elementIndex++;
                        elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl;
                        elementEncryptedData.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGost28147Url);
                        elementEncryptedData.CipherData.CipherValue = encryptedData;
                        elementEncryptedData.KeyInfo = new KeyInfo();

                        // Формирование информации о зашифрованном сессионном ключе
                        var encryptedSessionKey = new EncryptedKey();
                        encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData);
                        encryptedSessionKey.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostKeyTransportUrl);
                        encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id });
                        encryptedSessionKey.KeyInfo.AddClause(new KeyInfoName { Value = "KeyName1" });

                        // Добавление ссылки на зашифрованный ключ, используемый при шифровании данных
                        elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey));

                        // Замена элемента его зашифрованным представлением
                        GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false);
                    }
                }
            }

            return xmlDocument;
        }
        private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, Gost3410AsymmetricAlgorithmBase privateKey)
        {
            // Создание объекта для дешифрации XML
            var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);

            // Добавление ссылки на приватный асимметричный ключ
            encryptedXml.AddKeyNameMapping("KeyName1", privateKey);

            // Расшифровка зашифрованных элементов документа
            encryptedXml.DecryptDocument();

            return encryptedXmlDocument;
        }
Beispiel #9
0
 public GostKeyValue(Gost3410AsymmetricAlgorithmBase key)
 {
     Key = key;
 }
 public GostKeyValue(Gost3410AsymmetricAlgorithmBase key)
 {
     Key = key;
 }
 /// <summary>
 /// Шифрует сессионный ключ с помощью указанного асимметричного ключа ГОСТ Р 34.10.
 /// </summary>
 /// <param name="sessionKey">Шифруемый сессионный ключ.</param>
 /// <param name="publicKey">Открытый ключ ГОСТ Р 34.10 для шифрования сессионного ключа.</param>
 /// <returns>Массив байт, содержащий зашифрованный сессионный ключ.</returns>
 /// <remarks>Как правило сессионный ключ используется для шифрования данных и в свою очередь так же шифруется.</remarks>
 public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost3410AsymmetricAlgorithmBase publicKey)
 {
     return GostEncryptedXmlImpl.EncryptKey(sessionKey, publicKey);
 }
 /// <summary>
 /// Расшифровывает сессионный ключ с помощью указанного асимметричного ключа ГОСТ Р 34.10.
 /// </summary>
 /// <param name="keyData">Массив байт, содержащий зашифрованный сессионный ключ.</param>
 /// <param name="privateKey">Закрытый ключ ГОСТ Р 34.10 для расшифровки сессионного ключа.</param>
 /// <returns>Сессионный ключ.</returns>
 /// <remarks>Как правило сессионный ключ используется для шифрования данных и в свою очередь так же шифруется.</remarks>
 public static SymmetricAlgorithm DecryptKey(byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey)
 {
     return GostEncryptedXmlImpl.DecryptKeyClass(keyData, privateKey);
 }