наших исследований мы будем использовать подопытного кролика в роли строки: «Xakep - Super Hypper Rulez!».
Работа с симметричными алгоритмами
Тут все предельно просто, поскольку данные шифруются и расшифровываются одним и тем же ключом. Для работы с алгоритмом Triple DES нам понадобится TripleDES Crypto Service Provider - его криптопровайдер по умолчанию. Создаем консольное приложение, регистрируем пространство имен System.Security.Cryptography и создаем класс TripleDES для работы с алгоритмом. В нашем классе будет две логические функции public bool Encrypt() и public bool Decrypt() для соответствующих преобразований информации. Напомню, что в симметричных алгоритмах используется только секретный ключ, который используется для преобразований данных в обе стороны. Входными данными в функциях будут: незашифрованный текст, ключ преобразований и имя файла, в который будет записан шифротекст (и, наоборот, в функции расшифровки). Рассмотрим код:
Криптопровайдеры TripleDES
public class TripleDES
{
public static bool Encrypt(string OpenText, string SafeKey, string EncrText)
{
try
{
DESCryptoServiceProvider TDes = new DESCryptoServiceProvider(); //создаем //провайдер
TDes.Key = ASCIIEncoding.ASCII.GetBytes(SafeKey);
TDes.GenerateIV(); //генерируем вектор инициализации
ICryptoTransform encryption = TDes.CreateEncryptor(); //создаем шифровальщик
FileStream Fin = new FileStream(OpenText, FileMode.Open, FileAccess.Read);
//создаем файловые потоки
FileStream Fout = new FileStream(EncrText, FileMode.Create, FileAccess.Write);
CryptoStream crypt = new CryptoStream(Fout, encryption, CryptoStreamMode.Write);
byte[] outtext = new byte[Fin.Length - 1];
Fin.Read(outtext, 0, outtext.Length);
crypt.Write(outtext, 0, outtext.Length); //шифруем
crypt.Close(); //закрываем
Fin.Close();
Fout.Close();
Console.WriteLine("Done");
return true;
}
//далее обработка ошибок
}
public static bool Decrypt(string SafeText, string SafeKey, string OpenText)
{
try
{
TripleDESCryptoServiceProvider TDesDec = new TripleDESCryptoServiceProvider();
//Создаем провайдер
TDesDec.Key = ASCIIEncoding.ASCII.GetBytes(SafeKey);
TDesDec.GenerateIV(); //генерируем вектор инициализации
FileStream SText = new FileStream(SafeText, FileMode.Open, FileAccess.Read);
ICryptoTransform decrypt = TDesDec.CreateDecryptor();
CryptoStream DecryptionStream = new CryptoStream(SText, decrypt, CryptoStreamMode.Read); //создаем шифровальщик
StreamWriter OpenT = new StreamWriter(OpenText);
OpenT.Write(new StreamReader(DecryptionStream).ReadToEnd()); //расшифровываем
OpenT.Flush(); //закрываем
OpenT.Close();
Console.WriteLine("Done");
return true;
}
//далее обработка ошибок
}
}
В функции TripleDES.Encrypt() создается криптопровайдер для алгоритма TripleDES, далее создается ключ и вектор инициализации алгоритма, потом при помощи объекта ICryptoTransform создается шифровальщик, после этого программа читает файл с текстом, который надо зашифровать. После преобразования байтов программа записывает результат в файл. Расшифровка сообщения происходит практически таким же образом, только программа открывает файл с щифротекстом. Замечу, что для использования другого симметричного алгоритма шифрования нужно поменять первую строку в коде - ту, где создается криптопровайдер. После всех преобразований наш подопытный кролик (строка «Xakep - Super Hypper Rulez!») будет выглядеть следующим образом: НТdЁщc` ”rУђqi ЂUdЊWГ:`- Ї�ы�Н†. Как видно, алгоритм не очень-то сильно увеличивает размер информации, и подобрать ключ будет довольно просто. А в ассиметричных алгоритмах все гораздо более красиво.
RSA security protection
Алгоритм RSA - на мой взгляд, один из самых удобных и безопасных алгоритмов шифрования. Мои слова подтверждает тот факт, что RSA используется в банковских и платежно-карточных системах (Web Money, E-gold или PayPal). В ассиметричных алгоритмах ключ делится на открытую и закрытую часть. Информация может шифроваться открытой частью, которая также может быть передана по Сети, а для расшифровки данных потребуется закрытая часть, которая будет находиться в компьютере, расшифровывающем информацию. Снова создаем консольное приложение и регистрируем класс RSA. В нем будет три функции: RSA.NewEncrypt(), RSA.NormalEncrypt(), RSA.Decrypt(). Для шифрования нужно две функции на случай, если ключи нужно сгенерировать автоматически, и на случай, если используются готовые ключи (например, если необходимо зашифровать разные тексты одним ключом). Разница между ними в том, что при создании новых ключей все происходит автоматически, а при ручной загрузке нужно использовать метод RSACryptoServiceProvider.FromXmlString() для загрузки открытого ключа, поскольку для шифрования его достаточно. Далее необходимо перевести строковые данные в массив байтов и шифровать. Рассмотрим класс RSA:
Работа с криптопровайдерами RSA
public class rsa
{
static RSACryptoServiceProvider RSAp; //глобальный криптопровайдер
public static void Decrypt(string OpenTextFile, string PrivateKeyFile, string OutputFileName)
{
XmlTextReader PrivateKeyLoader = new XmlTextReader(PrivateKeyFile);
PrivateKeyLoader.WhitespaceHandling = WhitespaceHandling.None;
PrivateKeyLoader.Read(); //загружаем ключи
string PrivateKey = PrivateKeyLoader.ReadOuterXml();
StreamReader file = new StreamReader(OpenTextFile);
string encrypted = file.ReadToEnd(); //загружаем шифротекст
RSACryptoServiceProvider decr = new RSACryptoServiceProvider
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.