Нашел таки время на продолжение статьи. На тему кодирование 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.