Реализация ECB шифрования с помощью библиотеки Маршала в языке С#

Здравствуйте! Все чаще встречаю вопросы друзей и коллег, да и просто запросов на тему «как же реализовать шифрование на языке С#». Так вот кому будет интересно расскажу как это можно реализовать.
Режим ECB — метод применения блочного шифра, позволяющий преобразовать последовательность блоков открытых данных в последовательность блоков зашифрованных данных. Более точно вы сможете узнать на Википедии. Я же перейду сказу к сути вопроса.

К примеру у нас есть файл, который нужно зашифровать. Первое что приходит на ум: должна быть функция, которая в качестве аргумента принимает файл или путь к нему. Назовем эту функцию _CRYPTO:

 static void CRYPTO(string f)
        {
            string H = File.ReadAllText(f);
            FileStream FILE = File.Open(f, FileMode.Open);         

            byte[] Key = Encoding.Default.GetBytes("key12345678");

            Array.Resize(ref Key, 16);

            RijndaelManaged RMCrypto = new RijndaelManaged();
            RMCrypto.Mode = CipherMode.ECB;
            RMCrypto.Padding = PaddingMode.Zeros;
            RMCrypto.KeySize = 128;
            RMCrypto.Key = Key;

            ICryptoTransform Encryptor = RMCrypto.CreateEncryptor();
            CryptoStream Crypt = new CryptoStream(FILE, Encryptor, CryptoStreamMode.Write);
           
            using (StreamWriter sw = new StreamWriter(Crypt, Encoding.Unicode))
            {
                sw.Write(H);         
                sw.Flush();
            }
            Console.WriteLine(H);
            FILE.Close();
        }


На самом деле все просто! Переменная Key может принимать любые значения, какие вы пожелаете. Например я делал генератор, который выдавал случайную комбинацию и писал ее в файл. RMCrypto.Mode = CipherMode.ECB осуществляет тип шифрования. Самое интересное в этом коде, это параметр записи типа Encoding.Unicode. Тут мы меняем кодировку для шифрования.

Ну и функция реализующая расшифровку файла DERCYPTO:

static void DECRYPTO(string f)
        {
            FileStream FILE = File.Open(f, FileMode.Open);

            string S = FILE.ToString();
            string plaintext = null;

            byte[] Key = Encoding.Default.GetBytes("key12345678");

            Array.Resize(ref Key, 16);

            RijndaelManaged RMCrypto = new RijndaelManaged();
            RMCrypto.Mode = CipherMode.ECB;
            RMCrypto.Padding = PaddingMode.Zeros;
            RMCrypto.KeySize = 128;
            RMCrypto.Key = Key;

            ICryptoTransform Decryptor = RMCrypto.CreateDecryptor();
            CryptoStream Crypt = new CryptoStream(FILE, Decryptor, CryptoStreamMode.Read);

            using (StreamReader sw = new StreamReader(Crypt, Encoding.Unicode))
            {
             plaintext = sw.ReadToEnd();
            }
            File.WriteAllText(f, plaintext.ToString());
            Console.WriteLine(plaintext);
            FILE.Close();
        }


Не забываем закрывать файлы после выполнения операций иначе будут сыпаться ошибки так как потоки не будут закрыты.
  • –9
  • 1,4k
  • 3
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 3

    +6
    «Беги дядь Митя, беги» (С) Любовь и голуби
      –2
      А вот, собственно, для ленивых код кнопки для обработки сего действа.
      я сначала хотел спросить почему нет using'оов, но
      > RijndaelManaged RMCrypto = new RijndaelManaged();
      штатный .Net.
      на WinFroms надо добавить две кнопки и openFileDialog, во второй добавить буквы «de» для вызова функции декриптования.
      А по хорошему еще окошко для вопроса пароля и длины ключа (с проверкой на допустимую длину, да)

              private void button1_Click(object sender, EventArgs e)
              {
                  
                  DialogResult result = openFileDialog1.ShowDialog();
                  if (result == DialogResult.OK)
                  {
                      string f = openFileDialog1.FileName;
                      CRYPTO(f);
                  }
                  openFileDialog1.Dispose();
              }
      


      Вообще спасибо автору, да.
        –1
        Не обязательно использовать openFileDialog достаточно будет saveFileDialog.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое