Обзор CryptoAPI в MS Windows Vista

Страницы работы

Фрагмент текста работы

наших исследований мы будем использовать подопытного кролика в роли строки: «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

Похожие материалы

Информация о работе