Немного о идее

Сегодня исходники по C# скачать бесплатно практически не возможно. Но мне пришла идея разместить исходники программ, что я делал в универе, здесь на сайте. Скачать можно с файлообменника, просто нужно подождать минуту - и вуааля - скачивайте и сдавайте вашему преподавателю, или эксперементируйте с исходниками... Оставляйте комментарии или давайте идеи - буду пробовать написать и выложить исходники. Также планирую в дальнейшем выложить для скачивания исходники по C++. Вообщем пожелайте мне удачи. :)

пятница, января 08, 2010

TripleDES. Часть вторая

Нашел таки время на продолжение статьи. На тему кодирование TripleDES.

Итак у нас есть готовая форма с контролами, осталось только "прицепить" к кнопкам обработчики событий. Но это еще не все. В моей программе я использую отдельный файл - CryptText.cs - для методов шифрования и дешифрования.

"Шифрование"

Програмный код для обработчиков событий:

- button1

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
ofd.ShowDialog();
if (ofd.FileName != "")
{
    tbText.Text = new FileInfo(ofd.FileName).OpenText().ReadToEnd();
}

Заметки:
Здесь мы вместо использования контрола OpenFileDialog напрямую создаем экземпляр класса OpenFileDialog. Также используем свойство Filter для открытия только текстовых файлов. Содержимое окна OpenFileDialog отфильтровывается так, что будут показаны только папки и текстовые файлы. Далее мы одной строчкой открываем текстовый файл и читаем его с начала в конец. Здесь я использовал слабую ссылку на обьект FileInfo.

- button2

SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = "C:\\";
sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
sfd.ShowDialog();
tbPath.Text = sfd.FileName;

Тот же код, но для сохранения.


- button3

try
            {
                // Создаем новый TripleDESCryptoServiceProvider обьект
                // для генерирования вектора инициализации (IV).
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                // Для наглядности выводим значение вектора инициализации
                string temp = null;
                for (int i = 0; i < tDESalg.IV.Length; i++)
                {
                    temp += tDESalg.IV[i].ToString();
                }
                textBox4.Text = temp;
                label9.Text = temp;

                // Запоминаем вектор в локальной переменной IVector
                IVector = tDESalg.IV;

                // Строка для шифрования
                string sData = textBox1.Text;

                // Получаем ключ, преобразовываем в массив байтов и
                // дополняем до длинны 24. Не больше и не меньше.
                string strKey = textBox2.Text;
                byte[] bKey = new byte[24];
                for (int i = 0, j = 0; i < 24; i++, j++)
                {
                    if (j == strKey.Length)
                        j = 0;
                    bKey[i] = (byte)strKey[j];
                }

                // Указываем файл, куда будем шифровать
                string FileName = textBox3.Text;

                // Шифруем текст в файл.
                // При этом указываем имя файла, ключ и вектор инициализации.
                CryptText.EncryptTextToFile(sData, FileName, bKey, tDESalg.IV);

                // Сообщаем о результате
                MessageBox.Show("Текст успешно зашифрован !!!");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

Заметки: Для использования класса TripleDESCryptoServiceProvider нужно подключит пространство имен

using System.Security.Cryptography;

Для хранения вектора инициализации я использовал переменную IVector. Обьявляется она сразу после

protected byte[] IVector = null;

Здесь как вы видете используется метод EncryptTextToFile() из класса CryptText. Как я уже говорил, этот клас находится в отдельном модуле (или отдельном файле). Также используется конструкция try - catch для обработки исключений и их вывода на екран в виде MessageBox.

"Дешифрование"

Програмный код для обработчиков событий:

- button4

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
            ofd.ShowDialog();
            if (ofd.FileName != "")
            {
                textBox5.Text = new FileInfo(ofd.FileName).FullName;
            }


- button5


try
            {
                // Создаем новый TripleDESCryptoServiceProvider обьект
                // для генерирования вектора инициализации (IV).
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                // Получаем ключ, преобразовываем в массив байтов и
                // дополняем до длинны 24. Не больше и не меньше.
                string strKey = textBox6.Text;
                byte[] bKey = new byte[24];
                for (int i = 0, j = 0; i < 24; i++, j++)
                {
                    if (j == strKey.Length)
                        j = 0;
                    bKey[i] = (byte)strKey[j];
                }

                // Указываем файл для дешифрования
                string FileName = textBox5.Text;

                // Дешифруем текст из файла.
                // При этом указываем имя файла, ключ и вектор инициализации IVector.
                textBox7.Clear();
                textBox7.Text += CryptText.DecryptTextFromFile(FileName, bKey, IVector);

                // Сообщаем о результате
                MessageBox.Show("Текст успешно дешифрован !!!");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

Теперь добавляем в проект класс таким образом: открываем SolutionExplorer, клацаем по MyTripleDES правой

кнопкой мышки и жмем добавить-класс (Add-Class). Называем его CryptText.

 


Не забываем подключить в наш только что созданный класс

using System.Security.Cryptography;
using System.IO;
using System.Windows.Forms;

Далее в класс вставляем код:

// Конструктор
        public CryptText() { }

        ///
        /// Метод шифрует текст в файл
        ///
        ///
Текст для шифрования
        ///
Полный путь к файлу
        ///
Ключ (пароль)
        ///
Вектор инициализации
        public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
        {
            try
            {
                // Create or open the specified file.
                FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

                // Create a CryptoStream using the FileStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(fStream,
                    new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                    CryptoStreamMode.Write);

                // Create a StreamWriter using the CryptoStream.
                StreamWriter sWriter = new StreamWriter(cStream);

                // Write the data to the stream
                // to encrypt it.
                sWriter.WriteLine(Data);

                // Close the streams and
                // close the file.
                sWriter.Close();
                cStream.Close();
                fStream.Close();
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("A file access error occurred: {0}", e.Message);
            }

        }

        ///
        /// Метод дешифрует текст из файла
        ///
        ///
Полный путь к файлу
        ///
Ключ (пароль)
        ///
Вектор инициализации
        /// Текст в дешифрованном виде
        public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
        {
            try
            {
                // Create or open the specified file.
                FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

                // Create a CryptoStream using the FileStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(fStream,
                    new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
                    CryptoStreamMode.Read);

                // Create a StreamReader using the CryptoStream.
                StreamReader sReader = new StreamReader(cStream);

                // Read the data from the stream
                // to decrypt it.
                string val = sReader.ReadToEnd();

                // Close the streams and
                // close the file.
                sReader.Close();
                cStream.Close();
                fStream.Close();

                // Return the string.
                return val;
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("A file access error occurred: {0}", e.Message);
                return null;
            }
        }

Осталось пару штрихов. Создаем обработчик события на загрузку формы Form1. Вставляем код:

                           textBox3.Text = @"C:\Encoded.txt";
            textBox2.Text = "key";
            textBox6.Text = "key";
Удаляем пространства имен, которые не используем. Для этого правой кнопкой мышки клацаем по коду и жмем

Organize Usings - Remove Unused Usings

Вуаля. Наша программа готова !!! Можна тестировать. Отзывы и советы пишите в
комментарии.
Исходники качаем отсюдова hhttp://www.megaupload.com/?d=1SELPDBQ.

3 комментария:

Анонимный комментирует...

Здравствуйте. Очень интересная статья. Только исходники не скачать, ссылки нерабочие. Можно ли перезалить и дать другие ссылки?

Pavel Bilous комментирует...

Ссылка на файл программы обновлена!

Pavel Bilous комментирует...
Этот комментарий был удален автором.