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

Raiden
Розробники Хуліо Кастро Хав'єр Олабаррієта
Уперше оприлюднений 2006 року
Раундів 16
Тип Мережа Фейстеля

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

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

Безпека ред.

Алгоритм, на відміну від TEA, фактично не був досліджений криптоаналітиками на даний момент. За заявою авторів, 16 повних раундів алгоритму мають рівень безпеки, рівний 32 повним раундам алгоритму TEA, при цьому, не маючи вразливостей вихідного алгоритму. Найважливішою відмінністю від шифру TEA є розширений ключовий розклад. В той час, як алгоритм TEA передбачає лише додавання змінної з константою 0x9e3779b9 , Raiden використовує ключовий розклад, близький до ДПРЧ, трансформує ключ і генерує підключі для кожного раунду. Шифр успішно проходить тексти Diehard, Sexton і ENT.[1]

Приклад коду на мові 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. Raiden: An alternative to TEA Block Cipher (англ.). Архів оригіналу за 5 березня 2016. Процитовано 22 квітня 2018.

Посилання ред.