Как зашифровать и расшифровать данные на C#

Приветствую всех. В последнее время часто встречаю вопросы как реализовать в своем приложении шифрование данных, для хранения или передачи их по сети. А после можно было бы их расшифровать и получить оригинал. Алгоритмов шифрования очень много, но в данной статье я покажу очень простой и быстрый способ шифрования. Этот способ был применен еще в MicrosoftWorld 95 . Но и сейчас можно встретить похожие подходы применения шифрования. В коде который я приведу ниже, мы передаем строку в метод EncodeDecrypt, в ней строка разбивается на символы и передается в другой метод в котором производится шифрование данных, шифрованные буквы, а точнее символы  в методе TopSecret происходит вычисления XOR операции над каждым символом по ключу. И на выходе мы получаем зашифрованные данные, а в место привычных нам букв мы видим не понятные символы. Стоит заметить что в примере приведен ключ 16 битный и он будет подобран очень быстро, однако если вы ключ сделаете куда больше в 1000 раз к примеру, то такой ключ будет проблематично взломать, если это будет вообще возможно. По аналогии будет произведена расшифровка текста. И так посмотрим код программы.

Весь код я закомментировал, и не старался его сокращать, я привел его в таком виде, что бы вам было более понятна работы такой программы построчно. Не думаю что у вас возникнут проблемы в его понимании. Такой подход шифрования можно использовать как в сетевых технологиях, типо игр,чата, но и в десктопных приложениях, веб приложениях скорость шифрования и дешифровки довольно высока, что скажется на быстрой работе вашей программы.

Обновлено: 03.03.2018 — 19:47

9 комментариев

Оставить комментарий
  1. Это не C#, а бейсик какой то. Где вы видели var в C#?
    Вот на C#, проверил кодирует. Кстати спасибо за простой алгоритм =)

    using System.IO;

    class Program
    {
    static void Main(string[] args)
    {

    ushort secretKey = 0x0088; // Секретный ключ (длина — 16 bit).
    EncodeDecrypt(«D:\\file.txt», «D:\\cryptFile.txt», secretKey); // Кодируем
    EncodeDecrypt(«D:\\cryptFile.txt», «D:\\newFile.txt», secretKey); // Декодируем
    }

    public static void EncodeDecrypt(string FileRes, string FileDest, ushort secretKey)
    {
    FileStream fs = null; // исходный файл
    FileStream rs = null; // результат

    try
    {
    if (File.Exists(FileDest))
    File.Delete(FileDest);

    fs = new FileStream(FileRes, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    rs = new FileStream(FileDest, FileMode.CreateNew);

    List Bt = new List();

    while (fs.Position < fs.Length)
    {
    byte B = (byte)fs.ReadByte();
    B = (byte)(B ^ secretKey); // Не самая лучшая конструкция…
    Bt.Add(B);
    }
    rs.Write(Bt.ToArray(), 0, Bt.Count);
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }
    finally
    {
    if (fs != null) fs.Close();
    if (rs != null) rs.Close();
    }
    }
    }

    1. Вы ошибаетесь, об этом можете почитать на официальном сайте https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/var

      1. Хм. Согласен. В узко направленных случаях это прокатит, если пользователь использует современную версию Ms Framework.=))
        Хочу заметить, что тут не шла речь о версиях выше VS 3.0 и о нужных сборках Microsoft Framework. А просто, цитирую «Этот способ был применен еще в MicrosoftWorld 95», заголовок «Как зашифровать и расшифровать данные на C#», что в моём случае выдало ошибку «»string» не содержит определения для «ToArr1ay» и не был найден метод расширения «ToArray», принимающий тип «string» в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)» (22я стока по коду в примере)
        По этому штатный пользователь не поймёт что вообще делать…
        В широко использованной среде .NET версии 2.0 (не все современные компьютеры вообще поддерживают выше v2.0, я о фирмах, а не пользовательских ПК), нет понятий о Var в теле метода.
        Пространство имён LINQ доступно с версии Ms Framefork 3.5 (в моём случае)
        По этому следует указать в начале кода версию используемого Ms Framework, что бы не было притязаний.
        От себя.
        Сколько лет пишу программы на C# и не использую устаревших методов с Var, так как считал это пережитками прошло от Java. Замечал некоторые примеры кода с Var, но считал их некой переходной стадией от java-синтаксиса к c#-синтаксису и не воспринимал всерьёз.
        Благодарю за конструктивную критику=)

        1. Опять вы все не так поняли и ошибаетесь. Давайте все по порядку разложу 🙂 В Java var появился лишь в прошлом годy. Интересно что это за компании использующие win95? Да еще встречаются с XP но там поддержка framework 4.0 в SP3. Преобладающая часть компанию уже ушла от использования windows вообще, в сторону Linux. А по этому использовать этот пример в net Core так же возможно. Ошибку выдало вам потому что вы использовали не верный тип, полный код должен был выглядеть следующим образом.

          public static string EncodeDecrypt(string str, ushort secretKey)
          {
          char[] ch = str.ToArray(); //преобразуем строку в символы
          string newStr = ""; //переменная которая будет содержать зашифрованную строку
          foreach (char c in ch) //выбираем каждый элемент из массива символов нашей строки
          newStr += TopSecret(c, secretKey); //производим шифрование каждого отдельного элемента и сохраняем его в строку
          return newStr;
          }

          Я вам так скажу что все современные языки выстроены таким образом, что бы облегчить разработку. К вашему сведению var очень помогает в этом, так как является «синтаксическим сахаром». Позволяя не писать тип объекта длинной в несколько десятков символов, а сократить всего до 3. Потом это просто вызывает привычку и многие его используют везде где это возможно.

          1. Всё по порядку=)
            Есть фирмы, которые до сих пор используют WinXP SP1 (но чаще SP2) с установленным MS Fw 2.0
            И был случай, где мне пришлось усердно доказывать, что им просто жизненно необходимо установить хотя бы v2.0
            Но зачастую директор отвечал просто, «Я ничего дополнительного устанавливать не буду, не можете выполнить работу, так и скажите…»
            Вот почему важно, что бы всё работало на древности. (ну не все продвинутые)

            Больший интерес у меня вызвал ваш последний ответ со словами «потому что вы использовали не верный тип». Прошу прощения, не я =)
            Код был для теста взят как есть с примера. Если там введена ошибка, моя ли вина? Или то, что не указаны требуемые сборки для безошибочного компилирования?

            И самое главное заблуждение, это виденье простоты в сложности чтения кода. Согласен, что код из 30и строк читать легко, но стоит ли ради 35и строк сокращать его, усложнив коротким словом (var), и сэкономить пару-тройку строк кода? А если код из 40к строк, не дай бог запутаться в этих нестрого типизированных переменных.
            На просторах инэта много обсуждений о рациональности этого удобства в C#
            Я считаю, что лучше уделить немного времени для написания качественного кода, чем потом тратить часы на понимание своего же кода, через год, например.

          2. Хорошо, используете вы XP SP1 кто мешает установить FW 3.5 на него? Ошибка явно не моя, а с вашей стороны, код приведенного примера верный, а знания языка программирования и его тонкостей для вставки кода никто не отменял, вам лишь надо было объявить явный тип, а для чего вы туда string пихать начали я не в курсе. Применения var никак не ухудшает его читаемость, так как тип образуется из создаваемого объекта. Не понимание var лишь свидетельствует о низком знания языка, и практики. 20 лет назад вместо него использовали object используйте его, но я сомневаюсь что это было легче.

            IEnumerable<(char Initial, string LastName)> query = from name in names where name.StartsWith("A") select (Initial: name[0], LastName: name.Split(' ')[1]);

            Сильно вам тут помог явный тип в понимании кода?


            var names = new string[] {"Сергей", "Андрей", "Дима" };

            А тут у вас возникает затруднения в читаемости кода? Вам стоит подучить в таком случаи язык C#.
            А как вы тогда предлагаете работать с анонимными типами или методами?

            var names = new { name1 = "Сергей", name2="Андрей", name3="Дима" };

            Идти нужно в ногу со временем, иначе развития не было в ЯП, в ваше случаи вам тогда вообще не следовало переходить на C#, а использовать C++, тогда бы у вас никаких подобных проблем не возникало.

        2. Я var использую почти 6 лет и коллеги мои тоже)
          А кто-то в 2к19 пытается доказать, что это излишество не по времени)

          1. Человек просто застрял в 2.0 Net

  2. Вау, а я то думал такого больше нет, кроме как в универах )
    Спасибо — но для мессенджера сильно не производительно, даже если в отдельном потоке шифровать сообщение — получится очень медленно (

    А вот тут вопрос:
    IEnumerable query = from name in names where name.StartsWith(«A») select (Initial: name[0], LastName: name.Split(‘ ‘)[1]);

    Сильно вам тут помог явный тип в понимании кода?

    var names = new string[] {«Сергей», «Андрей», «Дима» };

    Вы взяли колекцию в которую положили ключ-значение — пару, а в примере через вар показали обычный массив. Как пара с огромным фукционалом родительского интерфейса всех коллекций стала убогим массивом да ещё и потеряв ключ. ( ну он будет — типа индекс, но в первом случае будет чар — а это круче, диапазон шире получается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.