Pull to refresh

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

Reading time 2 min
Views 3K
Здравствуйте! Все чаще встречаю вопросы друзей и коллег, да и просто запросов на тему «как же реализовать шифрование на языке С#». Так вот кому будет интересно расскажу как это можно реализовать.
Режим 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();
        }


Не забываем закрывать файлы после выполнения операций иначе будут сыпаться ошибки так как потоки не будут закрыты.
Tags:
Hubs:
-9
Comments 3
Comments Comments 3

Articles