Interested Article - Raiden (алгоритм)

Raiden — блочный алгоритм шифрования типа « Сеть Фейстеля », представленный в 2006 году группой авторов во главе с Хулио Кастро ( англ. Julio César Hernández Castro ). Алгоритм разработан с использованием генетического программирования и основан на идеях блочного шифра TEA , который широко известен благодаря сочетанию компактного кода, простой и запоминающейся структуре и высокой скорости выполнения. Поскольку в последнее время алгоритм TEA был признан уязвимым для ряда атак, авторами была предложена, по их мнению, равноценная замена алгоритму, предположительно свободная от уязвимостей и лишь немного уступающая в скорости.

Шифр Raiden, полностью повторяя структуру алгоритма TEA, зашифровывает блок размером 64 бита, имеет два 32-битных подблока, 128-битный секретный ключ и выполняет по умолчанию 16 полных раундов, каждый из которых имеет два раунда сети Фейстеля . Структура шифра позволяет использование 32-х и более раундов.

Т.к. это блочный шифроалгоритм, где длина блока 64-бит, а длина данных может быть не кратна 64-битам, значения всех байтов дополняющих блок до кратности в 64-бит устанавливается в 0x01 .

Безопасность

Алгоритм, в отличие от TEA, фактически не был исследован криптоаналитиками на данный момент. По заявлению авторов, 16 полных раундов алгоритма имеют уровень безопасности , равный 32 полным раундам алгоритма TEA, при этом не имея уязвимостей исходного алгоритма. Важнейшим отличием от шифра TEA является расширенное ключевое расписание. В то время, как алгоритм TEA предусматривает лишь сложение переменной с константой 0x9e3779b9 , Raiden использует ключевое расписание, близкое к ГПСЧ , трансформирует ключ и генерирует подключи для каждого раунда. Шифр успешно проходит тексты Diehard , Sexton и ENT.

Пример кода на языке C

Алгоритм Raiden так же довольно прост в реализации, которая занимает лишь несколько строк кода . Как и TEA , алгоритм основан на операциях с 32-разрядным беззнаковыми числами ( unsigned long ).

void raiden_encode(const u32 key[4], const u32 data[2], u32 result[2])
{
	u32 b0 = data[0], b1 = data[1], k[4] = {key[0],key[1],key[2],key[3]}, sk;
	int i;

	for (i = 0; i < 16; i++)
	{
		sk  = k[i%4] = ((k[0]+k[1])+((k[2]+k[3])^(k[0]<<(k[2] & 0x1F))));
		b0 += ((sk+b1)<<9) ^ ((sk-b1)^((sk+b1)>>14));
		b1 += ((sk+b0)<<9) ^ ((sk-b0)^((sk+b0)>>14));
	}
	result[0] = b0;
	result[1] = b1;
}


void raiden_decode(const u32 key[4], const u32 data[2], u32 result[2])
{
   	u32 b0 = data[0], b1 = data[1], k[4] = {key[0],key[1],key[2],key[3]}, subkeys[16];
	int i;

	for (i = 0; i < 16; i++) subkeys[i] = k[i%4] = ((k[0]+k[1])+((k[2]+k[3])^(k[0]<<(k[2] & 0x1F))));

	for (i = 15; i >= 0; i--)
	{
		b1 -= ((subkeys[i]+b0)<<9) ^ ((subkeys[i]-b0)^((subkeys[i]+b0)>>14));
		b0 -= ((subkeys[i]+b1)<<9) ^ ((subkeys[i]-b1)^((subkeys[i]+b1)>>14));
	}
	result[0] = b0;
  	result[1] = b1;
}

См. также

Примечания

  1. [ . Дата обращения: 28 января 2009. 5 марта 2016 года. Raiden: An alternative to TEA Block Cipher (англ.) ]


Ссылки

Источник —

Same as Raiden (алгоритм)