Пример #1
0
        private static Gost3410AsymmetricAlgorithmBase FindPrivateKey(IEnumerable certificates)
        {
            // Какая-то логика поиска закрытого ключа

            Gost3410AsymmetricAlgorithmBase privateKey = null;

            var store = new X509Store(TestCertificates.CertStoreName, TestCertificates.CertStoreLocation);

            store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
            var storeCertificates = store.Certificates;

            store.Close();

            foreach (X509Certificate2 certificate in certificates)
            {
                var index = storeCertificates.IndexOf(certificate);

                if (index >= 0)
                {
                    privateKey = storeCertificates[index].GetPrivateKeyAlgorithm() as Gost3410AsymmetricAlgorithmBase;

                    if (privateKey != null)
                    {
                        break;
                    }
                }
            }

            return(privateKey);
        }
Пример #2
0
        private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, Gost3410AsymmetricAlgorithmBase signingKey)
        {
            // Создание подписчика XML-документа
            var signedXml = new GostSignedXml(xmlDocument);

            // Установка ключа для создания подписи
            signedXml.SigningKey = signingKey;

            // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
            var dataReference = new Reference {
                Uri = "#Id1", DigestMethod = GostSignedXml.XmlDsigGost3411Url
            };

            // Установка ссылки на узел
            signedXml.AddReference(dataReference);

            // Установка информации о ключе, который использовался для создания подписи
            var keyInfo = new KeyInfo();

            keyInfo.AddClause(new GostKeyValue(signingKey));
            signedXml.KeyInfo = keyInfo;

            // Вычисление подписи
            signedXml.ComputeSignature();

            // Получение XML-представления подписи
            var signatureXml = signedXml.GetXml();

            // Добавление подписи в исходный документ
            xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true));

            return(xmlDocument);
        }
Пример #3
0
        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));
        }
Пример #4
0
        private static byte[] CreateSignature(Gost3410AsymmetricAlgorithmBase privateKey, Stream dataStream)
        {
            byte[] hash;

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

            return(privateKey.CreateSignature(hash));
        }
Пример #5
0
        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);
        }
        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);
        }
Пример #8
0
        private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, Gost3410AsymmetricAlgorithmBase privateKey)
        {
            // Создание объекта для дешифрации XML
            var encryptedXml = new GostEncryptedXml(encryptedXmlDocument);

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

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

            return(encryptedXmlDocument);
        }
 /// <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));
 }
Пример #10
0
 /// <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));
 }