Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #72, НОЯБРЬ 2006 г.

военная тайна

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #072, стр. 072-034-6


[хэширование.]

Среди хэш-алгоритмов в .NET реализованы MD5, SHA1, SHA256, SHA384, SHA512, HMAC-SHA-1 и MACTripleDES. Я подозреваю, что первые две разновидности алгоритмов знакомы практически всем, а алгоритм MACTripleDES - менее известен. Для расчета хэш-значения любым алгоритмом нужно использовать уже излюбленное нами пространство имен System.Security.Cryptography. Для расчета хэш-значения используется метод ComputeHash(byte[] ByteArray). Рассмотрим код для хэширования:

листинг

Расчет контрольных сумм

public class CreateHash

{

public static string[] Hash = new string[7]; //создаем строковой массив

public static void Make()

{

Console.WriteLine("Enter a value");

byte[] Value = ASCIIEncoding.UTF8.GetBytes(Console.ReadLine()); //получаем значение

MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();

SHA1Managed SHA1 = new SHA1Managed();

SHA256Managed SHA256 = new SHA256Managed();

SHA384Managed SHA384 = new SHA384Managed(); //создаем криптопровайдеры

SHA512Managed SHA512 = new SHA512Managed();

HMACSHA1 MACSHA = new HMACSHA1();

MACTripleDES MACTDes = new MACTripleDES();

//генерируем хэш-значения

Hash[0] = ASCIIEncoding.UTF8.GetString(MD5.ComputeHash(Value));

Hash[1] = ASCIIEncoding.UTF8.GetString(SHA1.ComputeHash(Value));

Hash[2] = ASCIIEncoding.UTF8.GetString(SHA256.ComputeHash(Value));

Hash[3] = ASCIIEncoding.UTF8.GetString(SHA384.ComputeHash(Value));

Hash[4] = ASCIIEncoding.UTF8.GetString(SHA512.ComputeHash(Value));

Hash[5] = ASCIIEncoding.UTF8.GetString(MACSHA.ComputeHash(Value));

Hash[6] = ASCIIEncoding.UTF8.GetString(MACTDes.ComputeHash(Value));

}

}

В этом классе создается строковой массив, который будет заполняться хэш-значениями. Создается массив байтов, заполняемый при помощи метода Console.ReadLine(). Затем создаем криптопровайдеры в динамической памяти, шифруем и заполняем строковой массив.

[потенциальные уязвимости.]

Система CryptoAPI довольно обширна и интересна, но это не исключает, а очень даже способствует большому количеству недочетов в ней. За время написания статьи автор столкнулся с несколькими переполнениями буфера при расшифровке алгоритмом RSA, проблемой несовместимости кодировок при хэшировании и расшифровке алгоритма DES. Конечно, верификатор отловил переполнение буфера, и после появления окна с надписью о том, что программа выполнила недопустимую операцию, в консоли появилась надпись overflow с кодом ошибки. Но и на таких простых примерах видно, насколько еще недоработана система криптографии в .NET.

По последним обещаниям компании Майкрософт все неточности и ошибки будут исправлены в полной стабильной версии .NET 3.0. Будем ждать.

[the end.]

Мы узнали некоторые достоинства и недостатки CryptoAPI в Windows Vista, немного рассмотрели пространство имен System.Security.Cryptography, кратко изучили все виды криптографических алгоритмов и их криптопровайдеров в .NET. На мой взгляд, самой безопасной реализацией криптографического алгоритма в .NET является RSA, - он, как и всегда, надежен. В данный момент его можно смело использовать в своих проектах (с длиной ключа, начиная от 2048 для любовных писем – Прим. Dr. Все, что меньше – на фиг с пляжа).

Назад на стр. 072-034-5  Содержание  Вперед на стр. 072-034-7