Raiden (алгоритм)

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

Алгоритм блокового шифрування
Назва:Raiden
Розробник:Хуліо Кастро Хав'єр Олабаррієта
Створений:2006 року
Опублікований:2006 року
Розмір ключа:128 біт
Розмір блоку:64 біт
Число раундів: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;
}

Див. також

Примітки

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.