Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - RC5 - Реализация алгоритма RC5 на языке C#14 июня 2011Оглавление: 1. RC5 2. Свойства 3. Варианты алгоритма 4. Реализация алгоритма RC5 на языке C# В данной реализации используется размер слова W = 64 бита, что соответствует размеру блока в 128 бит. Число раундов R = 16. Ключ K определяется пользователем самостоятельно. using System; namespace RC5Alg { public class RC5 { const int W = 64; // половина длины блока в битах. // Возможные значения 16, 32 и 64. // Для эффективной реализации величину W // рекомендуют брать равным машинному слову. // Например, для 64-битных платформ оптимальным будет // выбор W=64, что соответствует размеру блока в 128 бит. const int R = 16; // число раундов. Возможные значения 0…255. // Увеличение числа раундов обеспечивает увеличение // уровня безопасности шифра. Так, если R = 0, // то информация шифроваться не будет. const UInt64 PW = 0xB7E151628AED2A6B; // 64-битная константа const UInt64 QW = 0x9E3779B97F4A7C15; // 64-битная константа UInt64 L; // массив слов для секретного ключа пользователя UInt64 S; // таблица расширенных ключей int t; // размер таблицы int b; // длина ключа в байтах. Возможные значения 0…255. int u; // кол-во байтов в одном машинном слове int c; // размер массива слов L public RC5 { /* * Перед непосредственно шифрованием или расшифровкой данных выполняется процедура расширения ключа. * Процедура генерации ключа состоит из четырех этапов: * 1. Генерация констант * 2. Разбиение ключа на слова * 3. Построение таблицы расширенных ключей * 4. Перемешивание */ // основные переменные UInt64 x, y; int i, j, n; /* * Этап 1. Генерация констант * Для заданного параметра W генерируются две псевдослучайные величины, * используя две математические константы: e и f. * Qw = Odd * 2^W; * Pw = Odd * 2^W; * где Odd - это округление до ближайшего нечетного целого. * * Для оптимизации алгоритмы эти 2 величины определены заранее. */ /* * Этап 2. Разбиение ключа на слова * На этом этапе происходит копирование ключа K..K в массив слов L..L, где * c = b/u, а u = W/8. Если b не кратен W/8, то L дополняется нулевыми битами до ближайшего * большего размера c, при котором длина ключа b будет кратна W/8. */ u = W >> 3; b = key.Length; c = b % u > 0 ? b / u + 1 : b / u; L = new UInt64; for { L = ROL + key; } /* Этап 3. Построение таблицы расширенных ключей * На этом этапе происходит построение таблицы расширенных ключей S..S, * которая выполняется следующим образом: */ t = 2 * ; S = new UInt64; S = PW; for { S = S + QW; } /* Этап 4. Перемешивание * Циклически выполняются следующие действия: */ x = y = 0; i = j = 0; n = 3 * Math.Max; for { x = S = ROL, 3); y = L = ROL, ); i = % t; j = % c; } } /// <summary> /// Циклический сдвиг битов слова влево /// </summary> /// <param name="a">машинное слово: 64 бита</param> /// <param name="offset">смещение</param> /// <returns>машинное слово: 64 бита</returns> private UInt64 ROL { UInt64 r1, r2; r1 = a << offset; r2 = a >> ; return ; } /// <summary> /// Циклический сдвиг битов слова вправо /// </summary> /// <param name="a">машинное слово: 64 бита</param> /// <param name="offset">смещение</param> /// <returns>машинное слово: 64 бита</returns> private UInt64 ROR { UInt64 r1, r2; r1 = a >> offset; r2 = a << ; return ; } /// <summary> /// Свертка слова по 8-ми байтам /// </summary> /// <param name="b">массив байтов</param> /// <param name="p">позиция</param> /// <returns></returns> private static UInt64 BytesToUInt64 { UInt64 r = 0; for { r |= b; r <<= 8; } r |= b; return r; } /// <summary> /// Развертка слова по 8-ми байтам /// </summary> /// <param name="a">64-битное слово</param> /// <param name="b">массив байтов</param> /// <param name="p">позиция</param> private static void UInt64ToBytes { for { b = ; a >>= 8; } b = ; } /// <summary> /// Операция шифрования /// </summary> /// <param name="inBuf">входной буфер для шифруемых данных</param> /// <param name="outBuf">выходной буфер</param> public void Cipher { UInt64 a = BytesToUInt64; UInt64 b = BytesToUInt64; a = a + S; b = b + S; for { a = ROL, b) + S; b = ROL, a) + S; } UInt64ToBytes; UInt64ToBytes; } /// <summary> /// Операция расшифрования /// </summary> /// <param name="inBuf">входной буфер для шифруемых данных</param> /// <param name="outBuf">выходной буфер</param> public void Decipher { UInt64 a = BytesToUInt64; UInt64 b = BytesToUInt64; for { b = ROR, a) ^ a; a = ROR, b) ^ b; } b = b - S; a = a - S; UInt64ToBytes; UInt64ToBytes; } } } Просмотров: 8091
|