Статья по криптографии, которую я разместил немного ниже, объясняет базовые принципы
сохранения конфиденциальности информации. Это конечно хорошо, но можно ли написать
программу на C# так, чтобы она кодировала наш текст, и соответственно декодировала
его?
Да. И достаточно просто.
Я написал программу, которая демонстрирует алгоритм шифрования TripleDES. Немного
об алгоритме: алгоритм симметричный, то есть шифруем и дешифруем текст, при помощи
одного и того же пароля (ключа). Если верить Википедии, то –
Triple DES (3DES) — симметричный блочный шифр, созданный Уитфилдом Диффи,
Мартином Хеллманом и Уолтом Тачманном в 1978 году на основе алгоритма DES, с целью
устранения главного недостатка последнего — малой длины ключа (56 бит), который
может быть взломан методом полного перебора ключа. Скорость работы 3DES в 3 раза
ниже, чем у DES, но криптостойкость намного выше — время, требуемое для криптоанализа
3DES, может быть в миллиард раз больше, чем время, нужное для вскрытия DES. (c)Wikipedia
В нашей программе мы будем использовать класс TripleDESCryptoServiceProvider.
Он определяет объект-оболочку для доступа к реализации алгоритма TripleDES, предоставляемой
поставщиком служб шифрования (CSP). Для использования этого класса нужно использовать
пространство имен System.Security.Cryptography.
using System.Security.Cryptography;
Поставщик служб шифрования (Cryptography Service Provider, CSP) - это посредник
между операционной системой, которая может управлять им с помощью стандартных функций
CryptoAPI, и исполнителем криптографических операций(это может быть как программа,
так и аппаратный комплекс). программа, так и аппаратный комплекс).
Итак, создаем пустой проект WindowsFormsApplication и называем его TripleDES. На
форме Form1 размещаем такие контролы:
- TabControl (находим в ToolBox-Containers)
- Button – на первой закладке – 3, на второй – 2 шт.
-TextBox – на первой закладке – 4, на второй – 3 шт.
-Label – на первой закладке – 4, на второй – 5 шт.
Смотрим на рисунки:
После этого каждому элементу задаем свойство текст такие:
Теперь немного объясню, что зачем.
Вкладка «Шифрование»
Здесь мы можем выбрать текст из файла, или же напечатать текст в TextBox для текста
(большой такой). Если вы открываете текст из текстового файла (*.doc не поддерживаются),
тогда текст из файла автоматически отобразится в TextBox для текста.
Пароль – нужен фиксированной длинны, которая равна 24 буквам. На одну букву приходится
8 байт памяти, и в итоге пароль получается длинной в 24 * 8 = 192 байта. В нашем
случае может использоваться пароль любой длинны, если только он меньше 24 символов.
В моей программе короткий пароль дублируется и дописывается к уже существующему
несколько раз. То есть вы ввели «ключ», а программа сделает «ключключключключключ».
Вектор инициализации (IV) – нужен для задания параметров блочного шифрования. Он
генерируется при шифровании, а также генерируется совершенно другим при дешифровании.
Поэтому мы запоминаем его в локальной переменной IVector.
protected byte[] IVector = null;
Путь куда шифруем – путь, куда сохраняем текстовый файл.
Вкладка «Дешифрование»
Путь к файлу – путь к файлу для дешифровки. Вектор (IV) – берем с переменной IVector.
Для наглядности отображает его через метку label9.
// Создаем новый TripleDESCryptoServiceProvider обьект
// для генерирования вектора инициализации (IV).
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
// Для наглядности выводим значение вектора инициализации
string temp = null;
for ( int i = 0; i < tDESalg.IV.Length; i++)
{
temp += tDESalg.IV[i].ToString();
}
tbVector.Text = temp;
lVector.Text = temp;
// Запоминаем вектор в локальной переменной
IVector IVector = tDESalg.IV;
Подведем итоги – чтобы зашифровать информацию алгоритмом TripleDES, нужен пароль
(ключ) и вектор инициализации. Чтобы расшифровать информацию, нужны тот же пароль
и вектор инициализации.
На этом первая часть разработки программы закончена. Вторую допечатаю немного позже.
Там уже будет код для обработчиков событий, код методов для кодирования, декодирования.
Как говорится в фильмах – продолжение следует.