public void TearDown() { try { _sharedKey.Dispose(); } finally { _sharedKey = null; } }
private static XmlDocument EncryptXmlDocument(XmlDocument xmlDocument, Gost28147SymmetricAlgorithmBase 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 static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost28147SymmetricAlgorithmBase sharedKey, GostKeyExchangeExportMethod exportMethod) { if (sessionKey == null) { throw ExceptionUtility.ArgumentNull("sessionKey"); } if (sharedKey == null) { throw ExceptionUtility.ArgumentNull("sharedKey"); } return(sharedKey.EncodePrivateKey(sessionKey, exportMethod)); }
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)); }
private static bool VerifyHmacDataStream(Gost28147SymmetricAlgorithmBase sharedKey, Stream imitDataStream) { // Создание объекта для вычисления HMAC using (var imitHash = new Gost3411Hmac(sharedKey)) { // Считывание HMAC из потока данных var imitHashValue = new byte[imitHash.HashSize / 8]; imitDataStream.Read(imitHashValue, 0, imitHashValue.Length); // Вычисление реального значения HMAC для потока данных var expectedImitHashValue = imitHash.ComputeHash(imitDataStream); // Сравнение исходного HMAC с ожидаемым return(imitHashValue.SequenceEqual(expectedImitHashValue)); } }
private static Stream CreateHmacDataStream(Gost28147SymmetricAlgorithmBase sharedKey, Stream dataStream) { // Создание объекта для вычисления HMAC using (var imitHash = new Gost3411Hmac(sharedKey)) { // Вычисление HMAC для потока данных var imitHashValue = imitHash.ComputeHash(dataStream); // Запись HMAC в начало выходного потока данных var imitDataStream = new MemoryStream(); imitDataStream.Write(imitHashValue, 0, imitHashValue.Length); // Копирование исходного потока данных в выходной поток dataStream.Position = 0; dataStream.CopyTo(imitDataStream); imitDataStream.Position = 0; return(imitDataStream); } }
public void SetUp() { _sharedKey = new Gost28147SymmetricAlgorithm(); }
private static XmlDocument DecryptXmlDocument(XmlDocument encryptedXmlDocument, Gost28147SymmetricAlgorithmBase sharedKey) { // Создание объекта для дешифрации XML var encryptedXml = new GostEncryptedXml(encryptedXmlDocument); // Добавление ссылки на общий симметричный ключ encryptedXml.AddKeyNameMapping("SharedKey1", sharedKey); // Расшифровка зашифрованных элементов документа encryptedXml.DecryptDocument(); return(encryptedXmlDocument); }
/// <summary> /// Шифрует сессионный ключ с помощью указанного симметричного ключа ГОСТ 28147. /// </summary> /// <param name="sessionKey">Шифруемый сессионный ключ.</param> /// <param name="sharedKey">Общий симметричный ключ ГОСТ 28147 для шифрования сессионного ключа.</param> /// <param name="exportMethod">Алгоритм экспорта сессионного ключа.</param> /// <returns>Массив байт, содержащий зашифрованный сессионный ключ.</returns> /// <remarks>Как правило сессионный ключ используется для шифрования данных и в свою очередь так же шифруется.</remarks> public static byte[] EncryptKey(Gost28147SymmetricAlgorithmBase sessionKey, Gost28147SymmetricAlgorithmBase sharedKey, GostKeyExchangeExportMethod exportMethod = GostKeyExchangeExportMethod.GostKeyExport) { return(GostEncryptedXmlImpl.EncryptKey(sessionKey, sharedKey, exportMethod)); }
/// <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)); }