|
Алгоритм RC5 это новый блочный
шифр, разработанный Роном Ривестом для RSA laboratories. В этом алгоритме
переменными являются:
- Длина блока.
- Количество циклов (итераций).
- Длина ключа.
В блочном алгоритме RC5 размер слова определяет однозначно размер
блока - размер блока в два раза больше размера слова. Например, задан размер
слова в 32 бита - размер блока в этом случае будет 64 бита. Для лучшего
результата (наверно имеется ввиду скорость работы) советуют выбирать размер
слова равным разрядности регистров процессора, на котором реализуется алгоритм.
В этой страничке будут изпользованы следущие обозначения: W - Это размер слова в алгоритме RC5 в битах.Как
отмечалось ранее -
это половина от размера блока.
WW - Это размер слова в байтах.
B - Это размер блока в битах.
BB - Это размер блока в байтах: BB = B/ 8.
b - Это длина в байтах секретного ключа. 0 <= b< 256.
K - Это секретный ключ, который определяется последовательностью
байтов: K[0], ..., K[b-1].
R - Это число циклов (итераций) во внутренних преобразованиях
алгоритма
RC5. 0 <= R < 256.
T - Это число слов в расширенной таблице ключей. Оно всегда равно
2*(R + 1). 1 < T < 513.
S - Это расширенная таблица ключей, состоящая из
последовательности:
S[0], ..., S[T-1].
N - Это число байтов в тексте сообщения.
P - Это сообщение, состояшее из последовательности байтов:
P[0], ..., P[N-1].
C - Это шифровка, состоящая из последовательности байтов:
C[0], C[1], ...
I - Это начальный вектор для алгоритма CBC, который состоит из
последовательности
байтов: I[0], ..., I[BB-1].
1 Описание ключа RC5
Как и большая часть блочных шифров, алгоритм RC5, расширяет небольшой
ключ, введенный пользователем, в таблицу внутренних ключей.Длина
пользовательского ключа является одним из параметров алгоритма.Пример структуры
для ключа на языке С:
typedef struct rc5UserKey
{
int keyLength; /* длина в байтах. */
unsigned char *keyBytes; /* символы ключа */
} rc5UserKey;
Основные операции с типом rc5UserKey - это:
- Создание ключа
- Уничтожение
- и установка ключа
1.1 Создание объекта rc5UserKey
Создание ключа крайне просто: выделение памяти для ключа и очистка этой
памяти. Например так:
rc5UserKey *RC5_Key_Create ()
{
rc5UserKey *pKey;
pKey = new rc5UserKey;
if (pKey != ((rc5UserKey *) 0))
{
pKey->keyLength = 0;
pKey->keyBytes = (unsigned char *) 0;
}
return (pKey);
}
1.2 Уничтожение объекта rc5UserKey
Удаление ключа тоже просто: очищается память и освобождается, причем сначала
надо очистить память, а потом освободить ее:
void RC5_Key_Destroy (rc5UserKey *pKey)
{
unsigned char *to;
int count;
if (pKey == ((rc5UserKey *) 0))
return;
if (pKey->keyBytes == ((unsigned char *) 0))
return;
to = pKey->keyBytes;
for (count = 0; count < pKey->keyLength; count++)
to[count] = (unsigned char) 0;
delete (pKey->keyBytes);
pKey->keyBytes = (unsigned char *) 0;
pKey->keyLength = 0;
delete (pKey);
}
1.3 Установка ключа
В этой операции происходит копирование ключа из массива символов в объект
rc5UserKey. В случае неудачи функция возвращает 0:
int RC5_Key_Set (rc5UserKey *pKey,int keyLength,unsigned char *keyBytes)
{
unsigned char *keyBytesCopy;
unsigned char *from, *to;
int count;
keyBytesCopy = (unsigned char *) malloc (keyLength);
if (keyBytesCopy == ((unsigned char *) 0))
return (0);
from = keyBytes;
to = keyBytesCopy;
for (count = 0 ; count < keyLength ; count++)
to[count] = from[count];
pKey->keyLength = count;
pKey->keyBytes = keyBytesCopy;
return (1);
}
Для описания расширения ключа понадобятся некоторые определения,макросы: /* Определения для алгоритма RC5 как для 64-битного блочного шифра. */
/* "unsigned int" = 32 бита */
#define RC5_WORD unsigned int
#define W (32)
#define WW (W / 8)
#define ROT_MASK (W - 1)
Назад
|