private static Stream SendEncryptedDataStream(AsymmetricAlgorithm publicKey, Stream dataStream, out byte[] iv, out byte[] sessionKey) { var encryptedDataStream = new MemoryStream(); // Отправитель создает случайный сессионный ключ для шифрации данных using (var senderSessionKey = new Gost28147SymmetricAlgorithm()) { // Отправитель передает получателю вектор инициализации iv = senderSessionKey.IV; // Отправитель шифрует сессионный ключ и передает его получателю var formatter = new GostKeyExchangeFormatter(publicKey); sessionKey = formatter.CreateKeyExchangeData(senderSessionKey); // Отправитель шифрует данные с использованием сессионного ключа using (var encryptor = senderSessionKey.CreateEncryptor()) { var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write); dataStream.CopyTo(cryptoStream); } } encryptedDataStream.Position = 0; return(encryptedDataStream); }
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, IEnumerable <X509Certificate2> certificates) { // Создание объекта для шифрации XML var encryptedXml = new GostEncryptedXml(); // Поиск элементов для шифрации var elements = xmlDocument.SelectNodes("//SomeElement[@Encrypt='true']"); if (elements != null) { var elementIndex = 0; foreach (XmlElement element in elements) { // Формирование элемента EncryptedData var elementEncryptedData = new EncryptedData(); elementEncryptedData.Id = "EncryptedElement" + elementIndex++; elementEncryptedData.Type = EncryptedXml.XmlEncElementUrl; elementEncryptedData.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGost28147Url); elementEncryptedData.KeyInfo = new KeyInfo(); using (var sessionKey = new Gost28147SymmetricAlgorithm()) { // Шифрация элемента с использованием симметричного ключа var encryptedElement = encryptedXml.EncryptData(element, sessionKey, false); foreach (var certificate in certificates) { // Шифрация сессионного ключа с использованием открытого ключа сертификата var encryptedSessionKeyData = GostEncryptedXml.EncryptKey(sessionKey, (Gost3410AsymmetricAlgorithmBase)certificate.GetPublicKeyAlgorithm()); // Формирование информации о зашифрованном сессионном ключе var encryptedSessionKey = new EncryptedKey(); encryptedSessionKey.CipherData = new CipherData(encryptedSessionKeyData); encryptedSessionKey.EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostCryptoProKeyExportUrl); encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id }); encryptedSessionKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate)); // Добавление ссылки на зашифрованный ключ, используемый при шифровании данных elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey)); } // Установка зашифрованных данных у объекта EncryptedData elementEncryptedData.CipherData.CipherValue = encryptedElement; } // Замена элемента его зашифрованным представлением GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false); } } return(xmlDocument); }
public void TearDown() { try { _sharedKey.Dispose(); } finally { _sharedKey = null; } }
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, Gost28147 sharedKey) { // Создание объекта для шифрации 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, sharedKey, GostKeyExchangeExportMethod.CryptoProKeyExport); // Формирование элемента 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.XmlEncGostCryptoProKeyExportUrl); encryptedSessionKey.AddReference(new DataReference { Uri = "#" + elementEncryptedData.Id }); encryptedSessionKey.KeyInfo.AddClause(new KeyInfoName { Value = "SharedKey1" }); // Добавление ссылки на зашифрованный ключ, используемый при шифровании данных elementEncryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedSessionKey)); // Замена элемента его зашифрованным представлением GostEncryptedXml.ReplaceElement(element, elementEncryptedData, false); } } } return(xmlDocument); }
public new EncryptedData Encrypt(XmlElement element, X509Certificate certificate) { if (element == null) { return(base.Encrypt(element, certificate)); } if (certificate == null) { return(base.Encrypt(element, certificate)); } var oid = certificate.PublicKey.Oid.Value; if (!string.Equals(oid, Constants.OID_GR3410_2001, StringComparison.OrdinalIgnoreCase) && !string.Equals(oid, Constants.OID_GR3410_12_256, StringComparison.OrdinalIgnoreCase) && !string.Equals(oid, Constants.OID_GR3410_12_512, StringComparison.OrdinalIgnoreCase)) { return(base.Encrypt(element, certificate)); } var encryptedKey = new EncryptedKey { EncryptionMethod = new EncryptionMethod(oid == Constants.OID_GR3410_12_256 ? GostEncryptedXml.XmlEncGost2012_256KeyTransportUrl : oid == Constants.OID_GR3410_12_512 ? GostEncryptedXml.XmlEncGost2012_512KeyTransportUrl : GostEncryptedXml.XmlEncGostKeyTransportUrl) }; encryptedKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate)); var encriptionKey = new Gost28147SymmetricAlgorithm(); var publicKey = certificate.PublicKey.Key; encryptedKey.CipherData.CipherValue = EncryptKey(encriptionKey, publicKey as Gost3410); var encryptedData = new EncryptedData { Type = XmlEncElementUrl, EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGost28147Url) }; encryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedKey)); encryptedData.CipherData.CipherValue = EncryptData(element, encriptionKey, false); return(encryptedData); }
public new EncryptedData Encrypt(XmlElement element, X509Certificate2 certificate) { if (element == null) { return(base.Encrypt(element, certificate)); } if (certificate == null) { return(base.Encrypt(element, certificate)); } if (!string.Equals(certificate.PublicKey.Oid.Value, GostCryptoConfig.DefaultSignOid, StringComparison.OrdinalIgnoreCase)) { return(base.Encrypt(element, certificate)); } var encryptedKey = new EncryptedKey { EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGostKeyTransportUrl) }; encryptedKey.KeyInfo.AddClause(new KeyInfoX509Data(certificate)); var encriptionKey = new Gost28147SymmetricAlgorithm(); var publicKey = certificate.GetPublicKeyAlgorithm(); encryptedKey.CipherData.CipherValue = EncryptKey(encriptionKey, publicKey as Gost3410AsymmetricAlgorithmBase); var encryptedData = new EncryptedData { Type = XmlEncElementUrl, EncryptionMethod = new EncryptionMethod(GostEncryptedXml.XmlEncGost28147Url) }; encryptedData.KeyInfo.AddClause(new KeyInfoEncryptedKey(encryptedKey)); encryptedData.CipherData.CipherValue = EncryptData(element, encriptionKey, false); return(encryptedData); }
public void SetUp() { _sharedKey = new Gost28147SymmetricAlgorithm(); }