Interested Article - Raiden (алгоритм)
- 2021-02-26
- 1
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;
}
См. также
Примечания
- [ . Дата обращения: 28 января 2009. 5 марта 2016 года. Raiden: An alternative to TEA Block Cipher (англ.) ]
Ссылки
- от 25 марта 2016 на Wayback Machine
- 2021-02-26
- 1