· MD5 (абстрактный базовый класс MD5 и его наследники MD5Cng и MD5CryptoServiceProvider);
· RIPEMD (абстрактный базовый класс RIPEMD160 и его наследник RIPEMD160Managed);
· SHA1 (абстрактный базовый класс SHA1 и его наследники SHA1Cng, SHA1Managed и SHA1CryptoServiceProvider);
· SHA256 (классы SHA256, SHA256Cng, SHA256Managed и SHA256CryptoServiceProvider);
· SHA384 (классы SHA384, SHA384Cng, SHA384Managed и SHA384CryptoServiceProvider);
· SHA512 (классы SHA512, SHA512Cng, SHA512Managed и SHA512CryptoServiceProvider).
Абстрактный класс HashAlgorithm имеет следующие свойства:
· bool CanReuseTransform – признак возможности повторного использования объекта хеширования;
· bool CanTransformMultipleBlocks – признак возможности хеширования нескольких блоков данных;
· byte[] Hash – вычисленное хеш-значение;
· int HashSize – длина хеш-значения в битах;
· int InputBlockSize – длина блока входных данных;
· int OutputBlockSize – длина блока выходных данных.
В классе HashAlgorithm также определены следующие методы, частично переопределяемые в классах-наследниках:
· void Clear() – освобождение всех ресурсов, используемых объектом хеширования;
· byte[] ComputeHash(byte[] buffer) – вычисление хеш-значения для указанных данных;
· byte[] ComputeHash(Stream inputStream) – вычисление хеш-значения для данных из указанного потока;
· byte[] ComputeHash(byte[] buffer, int offset, int count) – вычисление хеш-значения для данных длиной count байт из буфера buffer со смещением offset;
· static HashAlgorithm Create() – создание объекта хеширования для алгоритма по умолчанию SHA1;
· static HashAlgorithm Create(string hashName) – создание объекта хеширования для указанного алгоритма (допустимы значения SHA, SHA1, System. Security. Cryptography. SHA1, System. Security. Cryptography. HashAlgorithm, MD5, System. Security. Cryptography. MD5, SHA256, SHA-256, System. Security. Cryptography. SHA256, SHA384, SHA-384, System. Security. Cryptography. SHA384, SHA512, SHA-512, System. Security. Cryptography. SHA512);
· byte[] HashFinal() – завершение хеширования после обработки последних данных и возвращение результирующего хеш-значения;
· void Initialize() – инициализация объекта хеширования;
· int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) – хеширование данных длиной inputCount байт из буфера inputBuffer со смещением inputOffset с копированием входных данных в буфер outputBuffer со смещением outputOffset; возвращение количества записанных в выходной буфер байт данных;
· byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) – хеширование данных длиной inputCount байт из буфера inputBuffer со смещением inputOffset и возвращение копии хешированных данных.
Классы MD5Cng, MD5CryptoServiceProvider, RIPEMD160Managed, SHA1Cng, SHA1Managed, SHA1CryptoServiceProvider, SHA256Cng, SHA256Managed, SHA256CryptoServiceProvider, SHA384, SHA384Cng, SHA384Managed, SHA384CryptoServiceProvider, SHA512Cng, SHA512Managed и SHA512CryptoServiceProvider имеют конструкторы без параметров.
3.2. Классы для вычисления и проверки кодов аутентификации сообщений
В состав библиотеки FCL входят следующие классы, предназначенные для вычисления кодов аутентификации сообщений (MAC, message authentication code) и контроля целостности информации:
· на основе хеширования с секретным ключом по алгоритмам MD5, RIPEMD или SHA (абстрактный базовый класс HMAC и его наследники HMACMD5, HMACRIPEMD160, HMACSHA1, HMACSHA256, HMACSHA384 и HMACSHA512);
· на основе алгоритма симметричного шифрования TripleDES (класс MACTripleDES).
Общим абстрактным базовым классом для классов контроля целостности является класс KeyedHashAlgorithm, являющийся наследником класса HashAlgorithm. В классе KeyedHashAlgorithm определено дополнительное свойство:
byte[] Key – секретный ключ, используемый при вычислении и проверке кода аутентификации сообщения.
В классе HMAC определены дополнительные свойства:
· int BlockSizeValue – длина блока, используемого при вычислении хеш-значения, в байтах;
· string HashName – имя алгоритма хеширования, используемого при вычислении и проверке кода аутентификации сообщения.
Классы HMACMD5, HMACRIPEMD160, HMACSHA1, HMACSHA256, HMACSHA384 и HMACSHA512 имеют конструкторы без параметров и конструкторы с параметром
byte[] key – секретный ключ, который будет использоваться объектом класса при вычислении и проверке кода аутентификации сообщений.
Класс HMACSHA1 имеет еще один дополнительный конструктор с параметрами
byte[] key, bool useManagedSha1 – создание объекта с заданным секретным ключом и использованием управляемой реализации алгоритма SHA1, если второй параметр равен true, или реализации этого алгоритма в криптопровайдере в неуправляемом коде, если значением второго параметра является false.
Класс MACTripleDES имеет конструктор без параметров, а также конструкторы с параметрами:
· byte[] rgbKey – создание объекта с заданным параметром секретного ключа;
· string strTripleDES, byte[] rgbKey – создание объекта с заданной реализацией алгоритма strTripleDES и заданным секретным ключом rgbKey (реализацией алгоритма TripleDES по умолчанию является System. Security. Cryptography. TripleDES).
Длина ключа, используемая объектами класса MACTripleDES, должна быть 8, 16 или 24 байта.
3.3. Использование средств хеширования и контроля целостности
Рассмотрим примеры использования в приложениях для Microsoft. Net классов, реализующих алгоритмы хеширования и вычисления кодов аутентификации сообщений. В первом примере создадим программу для вычисления хеш-значения по алгоритму RIPEMD160 для двух вводимых пользователем сообщений.
На рис. 6 приведено главное окно программы, а в табл. 5 – соответствие между элементами управления главного окна и их именами в программе.

Рис. 6. Окно программы хеширования
Таблица 5
Имена объектов программ для элементов управления
Элемент управления окна | Его имя в программе |
Редактор для ввода текста первого сообщения | Message1 |
Редактор для ввода текста второго сообщения | Message2 |
Строка для отображения хеш-значения | HashValue |
Кнопка «Выход» | Exit |
Для отображения вычисленного хеш-значения в шестнадцатеричном формате в программе используется статический метод класса string
string Format(string format, Object arg0) – преобразование значения arg0 в строку в соответствии с форматной строкой format (для отображения значения байта в виде двух шестнадцатеричных цифр с обязательным выводом нуля используется формат "{0,2:X2}").
Чтобы проверить правильность выполненного хеширования в программе символы введенных сообщений преобразуются в кодировку ASCII с помощью одноименного статического свойства класса Encoding и его метода GetBytes, рассмотренного в разделе 1.2.
Ниже приведен текст программы:
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Windows. Forms;
// подключение пространства имен классов криптографии
using System. Security. Cryptography;
namespace WindowsFormsApplication6
{
// класс главного окна
public partial class Form1 : Form
{
// объект для алгоритма хеширования
RIPEMD160Managed ripemd;
// данные из первого сообщения
byte[] bytes1;
// данные из второго сообщения
byte[] bytes2;
// хеш-значение
byte[] hash;
// конструктор класса главного окна
public Form1()
{
InitializeComponent();
// создание объекта хеширования
ripemd = new RIPEMD160Managed();
}
// обработка нажатия кнопки "Выход"
private void Exit_Click(object sender, EventArgs e)
{
Close();
}
/* обработка изменения текста в любом их двух редакторов для ввода сообщений */
private void Message1_TextChanged(object sender, EventArgs e)
{
// очистка поля для отображения хеш-значения
HashValue. Text=»»;
// данные для хеширования
byte[] data;
// получение данных первого сообщения
bytes1=Encoding. ASCII. GetBytes(Message1.Text);
// получение данных второго сообщения
bytes2 = Encoding. ASCII. GetBytes(Message2.Text);
// выделение памяти для хешируемых данных
data=new byte[bytes1.Length+bytes2.Length];
// объединение данных двух сообщений
bytes1.CopyTo(data, 0);
bytes2.CopyTo(data, bytes1.Length);
// получение хеш-значения
hash = puteHash(data);
// отображение хеш-значения в шестнадцатеричном формате
for(int i=0; i<hash. Length; i++)
HashValue. Text+=string. Format(“{0,2:X2}”, hash[i]);
}
}
}
Во втором примере этого раздела покажем, как в программе на языке C# использовать алгоритмы хеширования, реализации которых отсутствуют в библиотеке FCL. Для этого нам придется использовать функции CryptoAPI, рассмотренные в разделе 1.3, и некоторые дополнительные функции этого интерфейса, такие как CryptCreateHash, CryptHashData и CryptGetHashParam.
Изменим программу из предыдущего примера и будем вычислять хеш-значение двух сообщений по алгоритму MD4 (окно измененной программы приведено на рис. 7).
В этой программе используются еще две константы, передаваемые функциям CryptoAPI и определенные в файле wincrypt. h:
· 4 (HP_HASHSIZE, значение параметра для получения длины хеш-значения, генерируемого алгоритмом хеширования);
· 2 (HP_HASHVAL, значение параметра для получения вычисленного хеш-значения);
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |


