< Summary

Class:SVETA.Api.Helpers.SymmetricCrypto
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Helpers/SymmetricCrypto.cs
Covered lines:32
Uncovered lines:2
Coverable lines:34
Total lines:68
Line coverage:94.1% (32 of 34)
Covered branches:2
Total branches:4
Branch coverage:50% (2 of 4)

Metrics

MethodLine coverage Branch coverage
get_ProtectKey()100%100%
CreateAlgorithm()77.77%50%
EncryptData(...)100%100%
DecryptData(...)100%100%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Helpers/SymmetricCrypto.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Security.Cryptography;
 5using System.IO;
 6using DocumentFormat.OpenXml.Office.CustomUI;
 7using System.Linq;
 8
 9namespace SVETA.Api.Helpers
 10{
 11    public static class SymmetricCrypto
 12    {
 13        /// <summary>
 14        /// Основной ключ шифрования
 15        /// </summary>
 3116        public static string ProtectKey { get; set; }
 17
 18        private static SymmetricAlgorithm CreateAlgorithm()
 319        {
 320            if (string.IsNullOrWhiteSpace(ProtectKey))
 021                throw new ArgumentException("Ключ шифрования не может быть пустым");
 322            if (ProtectKey.Length != 16)
 023                throw new ArgumentException("Длина ключа должна составлять 16 символов");
 24            //юзаем симметричный алгоритм Rijndael. Длина ключа 128,192,256. Шаг 64 бита. Шаг по идее можно сменить чере
 325            SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("Rijndael");
 326            algorithm.Key = Encoding.UTF8.GetBytes(ProtectKey);
 327            return algorithm;
 328        }
 29
 30        public static byte[] EncryptData(string data)
 231        {
 232            var algorithm = CreateAlgorithm();
 233            byte[] byteData = Encoding.UTF8.GetBytes(data);
 234            MemoryStream tagetStream = new MemoryStream();
 35
 36            // Генерируем случайный вектор инициализации (IV)
 37            // для использования с алгоритмом. Добавляется к общему массиву , дабы массив не был все время одинааковым, 
 238            algorithm.GenerateIV();
 239            tagetStream.Write(algorithm.IV, 0, algorithm.IV.Length);
 40
 41            // Шифруем данные. В итоге пишем данные в tagetStream, пропуская все через CryptoStream
 242            CryptoStream cs = new CryptoStream(tagetStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
 243            cs.Write(byteData, 0, byteData.Length);
 244            cs.FlushFinalBlock();
 45
 246            return tagetStream.ToArray();
 247        }
 48
 49        public static string DecryptData(byte[] data)
 150        {
 151            var algorithm = CreateAlgorithm();
 152            MemoryStream tagetStream = new MemoryStream();
 53
 54            // Читаем вектор инициализации (IV)
 155            int ReadPos = 0;
 156            byte[] IV = new byte[algorithm.IV.Length];
 157            Array.Copy(data, IV, IV.Length);
 158            algorithm.IV = IV;
 159            ReadPos += algorithm.IV.Length;
 60
 161            CryptoStream cs = new CryptoStream(tagetStream, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
 162            cs.Write(data, ReadPos, data.Length - ReadPos);
 163            cs.FlushFinalBlock();
 64
 165            return Encoding.UTF8.GetString(tagetStream.ToArray());
 166        }
 67    }
 68}