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; }

  • CIPHERUNICORN-A
  • Алгоритм соединения хешированием
  • Шифрующее программное обеспечение
  • GLR-парсер
  • RC4

  •  

    • Яндекс.Метрика
    • Индекс цитирования