HC-256
HC-256 — система потокового шифрования, разработанная криптографом У Хунцзюнем (Hongjun Wu) из сингапурского Института инфокоммуникационных исследований. Впервые опубликован в 2004 году. 128-битный вариант был представлен на конкурсе eSTREAM, целью которого было создание европейских стандартов для поточных систем шифрования. Алгоритм стал одним из четырёх финалистов конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью). [1] (англ.)
Описание алгоритма
Потоковый шифр HC-256 генерирует ключевую последовательность (keystream) длиной до [math]\displaystyle{ 2^{128} }[/math] бит с помощью 256-битового ключа (secret key) и 256-битного вектора инициализации (initialization vector).
НС-256 содержит две секретные таблицы, в каждой из которых 1024 32-битных элемента. При каждом шаге обновляется один элемент из таблицы при помощи нелинейном функции обратной связи(feedback function). Через каждые 2048 шагов все элементы двух таблиц будут обновлены.[1]
Операции, функции, переменные
В алгоритме используются следующие операции:
[math]\displaystyle{ + }[/math] : x+y означает x+y mod [math]\displaystyle{ 2^{32} }[/math], где 0 [math]\displaystyle{ \le }[/math] x [math]\displaystyle{ \lt }[/math] [math]\displaystyle{ 2^{32} }[/math] и 0 [math]\displaystyle{ \le }[/math] y [math]\displaystyle{ \lt }[/math] [math]\displaystyle{ 2^{32} }[/math]
[math]\displaystyle{ \boxminus }[/math] : x [math]\displaystyle{ \boxminus }[/math] y означает x — y mod 1024
[math]\displaystyle{ \oplus }[/math] : побитовое исключающее ИЛИ
[math]\displaystyle{ || }[/math] : конкатенация
[math]\displaystyle{ \gg }[/math] : оператор сдвига вправо на указанное количество бит
[math]\displaystyle{ \ll }[/math] : оператор сдвига влево на указанное количество бит
[math]\displaystyle{ \ggg }[/math] : циклический сдвиг вправо, x [math]\displaystyle{ \ggg }[/math] n означает ((x [math]\displaystyle{ \gg }[/math] n) [math]\displaystyle{ + }[/math] (x [math]\displaystyle{ \ll }[/math] (32 — n)), где 0 [math]\displaystyle{ \le }[/math] n [math]\displaystyle{ \lt }[/math] 32 и 0 [math]\displaystyle{ \le }[/math] x [math]\displaystyle{ \lt }[/math] [math]\displaystyle{ 2^{32} }[/math]
В HC-256 используются две таблицы P и Q. Ключ и вектор инициализации обозначаются K и V соответственно. Ключевая последовательность обозначается S.
[math]\displaystyle{ P }[/math] : таблица из 1024 32-битных элементов. Каждый элемент обозначается P[i], где 0 [math]\displaystyle{ \le }[/math] i [math]\displaystyle{ \le }[/math] 1023.
[math]\displaystyle{ Q }[/math] : таблица из 1024 32-битных элементов. Каждый элемент обозначается P[i], где 0 [math]\displaystyle{ \le }[/math] i [math]\displaystyle{ \le }[/math] 1023.
[math]\displaystyle{ K }[/math] : 256-битный ключ алгоритма HC-256.
[math]\displaystyle{ V }[/math] : 256-битный вектор инициализации алгоритма HC-256.
[math]\displaystyle{ S }[/math] : ключевая последовательность, созданная алгоритмом HC-256. 32-битный элемент на выходе i-го шага обозначается [math]\displaystyle{ S_i }[/math] . S=[math]\displaystyle{ S_0 }[/math] || [math]\displaystyle{ S_1 }[/math] || [math]\displaystyle{ S_2 }[/math] || …
В HC-256 используется шесть функций:
[math]\displaystyle{ {{f_1}(x) = (x \gt \gt \gt 7) \oplus (x \gt \gt \gt 18) \oplus (x \gt \gt 3)} }[/math]
[math]\displaystyle{ {{f_2}(x) = (x \gt \gt \gt 17) \oplus (x \gt \gt \gt 19) \oplus (x \gt \gt 10)} }[/math]
[math]\displaystyle{ {{g_1}(x,y) = ((x \gt \gt \gt 10) \oplus (y \gt \gt \gt 23)) + Q[(x \oplus y) mod~ 1024]} }[/math]
[math]\displaystyle{ {{g_2}(x,y) = ((x \gt \gt \gt 10) \oplus (y \gt \gt \gt 23)) + P[(x \oplus y) mod~ 1024]} }[/math]
[math]\displaystyle{ {{h_1}(x) = Q[{x_0}] + Q[256 + {x_1}] + Q[512 + {x_2}] + Q[768 + {x_3}]} }[/math]
[math]\displaystyle{ {{h_2}(x) = P[{x_0}] + P[256 + {x_1}] + P[512 + {x_2}] + P[768 + {x_3}]} }[/math]
Здесь x = [math]\displaystyle{ x_3 }[/math] || [math]\displaystyle{ x_2 }[/math] || [math]\displaystyle{ x_1 }[/math] || [math]\displaystyle{ x_0 }[/math] — 32-битное слово. [math]\displaystyle{ x_0 }[/math], [math]\displaystyle{ x_1 }[/math], [math]\displaystyle{ x_2 }[/math], [math]\displaystyle{ x_3 }[/math] состоят из 1 байта каждый, причем [math]\displaystyle{ x_0 }[/math], [math]\displaystyle{ x_3 }[/math] — младший и старший байты соответственно.[2]
Процесс инициализации
Процесс инициализации (Initialization process) в HC-256 состоит из преобразования P и Q с помощью ключа и вектора инициализации и запуска шифрования 4096 раз без генерации выходного результата (output).
1. Составление K = [math]\displaystyle{ K_0 }[/math] || [math]\displaystyle{ K_1 }[/math] || … || [math]\displaystyle{ K_7 }[/math] и V = [math]\displaystyle{ V_0 }[/math] || [math]\displaystyle{ V_1 }[/math] || … || [math]\displaystyle{ V_7 }[/math], где [math]\displaystyle{ K_i }[/math] и [math]\displaystyle{ V_i }[/math] состоят из 32 битов. Ключ и вектор инициализации расширяются в массив [math]\displaystyle{ W_i }[/math] (0 [math]\displaystyle{ \le }[/math] i [math]\displaystyle{ \le }[/math] 2559).
[math]\displaystyle{ {W_i} }[/math] принимает следующие значения:
[math]\displaystyle{ {{K_i},~ 0 \le i \le 7} }[/math]
[math]\displaystyle{ {{V_{i-8}},~ 8 \le i \le 15} }[/math]
[math]\displaystyle{ {{f_2}({W_{i-2}}) + W_{i-7} + f_1(W_{i-15}) + W_{i-16} + i,~ 16 \le i \le 2559} }[/math]
2. Обновление таблиц P и Q с помощью W:
[math]\displaystyle{ {{P[i]} = {W_{i+512}},~ 0 \le i \le 1023} }[/math]
[math]\displaystyle{ {{Q[i]} = {W_{i+1536}},~ 0 \le i \le 1023} }[/math]
3. Запуск шифрования (алгоритм генерации ключевой последовательности) 4096 раз без генерации выходного результата.
Процесс инициализации завершен и шифр готов к генерации ключевой последовательности.[3]
Алгоритм генерации ключевой последовательности
На каждом шаге обновляется один элемент из таблицы и генерируется один 32-битный выходной элемент. Ниже описан процесс генерации ключевой последовательности:
i=0;
repeat until enough keystream bits are generated.
{
j = i mod 1024;
if (i mod 2048) < 1024
{
P[j] = P[j] + P[j [math]\displaystyle{ \boxminus }[/math] 10] + [math]\displaystyle{ g_1 }[/math](P[j [math]\displaystyle{ \boxminus }[/math] 3], P[j [math]\displaystyle{ \boxminus }[/math] 1023]);
[math]\displaystyle{ S_i = h_1 }[/math](P[j [math]\displaystyle{ \boxminus }[/math] 12]) [math]\displaystyle{ \oplus }[/math] P[j];
}
else
{
Q[j] = Q[j] + Q[j [math]\displaystyle{ \boxminus }[/math] 10] + [math]\displaystyle{ g_2 }[/math](Q[j [math]\displaystyle{ \boxminus }[/math] 3], Q[j [math]\displaystyle{ \boxminus }[/math] 1023]);
[math]\displaystyle{ S_i = h_2 }[/math](Q[j [math]\displaystyle{ \boxminus }[/math] 12]) [math]\displaystyle{ \oplus }[/math] Q[j];
}
end-if
i = i + 1;
}
[3]
end-repeat
Безопасность шифрования HC-256
Авторы сформулировали следующие утверждения о безопасности HC-256:
- В HC-256 нет скрытых дефектов.
- Ожидается, что наименьший период не будет намного больше чем [math]\displaystyle{ 2^{256} }[/math].
- Восстановление секретного ключа так же тяжело, как и полный перебор ключей.
- Для результативной атаки требуется более чем [math]\displaystyle{ 2^{128} }[/math] бит ключевой последовательности.
- В HC-256 нет слабых ключей.
Период
Алгоритм HC-256 гарантирует, что период ключевой последовательности очень большой. Но точно определить его тяжело. По оценкам средний период ключевой последовательности около [math]\displaystyle{ 2^{65546} }[/math].
Безопасность секретного ключа
Функции выхода (output function) и функции обратной связи (feedback function) в HC-256 в высокой степени нелинейна. Нелинейная функция выхода допускает очень малую утечку информации на каждом шаге. Нелинейная функция обратной связи гарантирует, что секретный ключ не может быть определён из этой утечки.
Из анализа значений функций [math]\displaystyle{ h_1(x) }[/math] и [math]\displaystyle{ h_2(x) }[/math] следует:
Для [math]\displaystyle{ {~2048 * \alpha \le i \lt j \lt 2048 * \alpha + 1024~} }[/math] из условия [math]\displaystyle{ {~{S_i} = {S_j}~} }[/math] следует, что [math]\displaystyle{ {~h_1(x)(P[i \boxminus 12]) \oplus P[i] = h_1(x)(P[j \boxminus 12]) \oplus P[j]~} }[/math]. Так как [math]\displaystyle{ {~h_1(x)(P[i \boxminus 12]) = h_1(x)(P[j \boxminus 12])~} }[/math] с вероятностью примерно [math]\displaystyle{ {2^{-31}} }[/math], вероятность того, что [math]\displaystyle{ {~P[i] = P[j]~} }[/math], также равна примерно [math]\displaystyle{ {2^{-31}} }[/math]. Это означает, что при каждом совпадении(collision) утекает примерно [math]\displaystyle{ {2^{-26.1}} }[/math] бит информации. Всего [math]\displaystyle{ {\approx 2^{-12}~} }[/math] совпадений. Для восстановления P необходимо [math]\displaystyle{ {~\frac{1024*32}{2^{-12}*2^{-26.1}} * 1024 \approx 2^{53.1}~} }[/math] выходных результатов. Итак, можно сделать вывод, что ключ для HC-256 безопасен, и что его нельзя определить быстрее, чем полным перебором ключей.
Безопасность процесса инициализации
Процесс инициализации HC-256 состоит из двух этапов (см. выше). P и Q преобразуются с помощью ключа K и вектора инициализации V. Каждый бит K и V влияет на все биты двух таблиц, и каждое изменение в них приводит к неконтролируемым изменениям в таблицах. Шифрование запускается 4096 раз без генерирования выходного результата, так что таблицы P и Q становятся более случайными. После процесса инициализации изменение в K и V не приводят к изменениям в ключевой последовательности.[4]
Атаки на HC-256
В 2008 году Эриком Зеннером (Erik Zenner) был предложен способ атаки на шифр HC-256. Предложенная атака по времени позволяет восстановить и внутреннее состояние (inner state), представляющее собой 2 таблицы из 1024 32-битовых элементов, а также ключ. Атака требует 8 килобайт известной ключевой последовательности, 6148 точных измерений времени чтения из кэша, время на вычисление, соответствующее времени тестирования [math]\displaystyle{ 2^{55} }[/math] ключей. Следует вывод, что в теории HC-256 уязвим для атак по времени.[5]
Также следует обратить внимание на публикацию Г.Секара (Gautham Sekar) и Барта Пренеля (Bart Preneel), предлагающую класс идентификаторов (class of distinguishers), каждый из которых требует тестирование около [math]\displaystyle{ 2^{276.8} }[/math] линейных функций. Каждое уравнение включает в себя 8 бит ключевой последовательности. Вероятность успешного исхода 0.9772. Для сравнения, известный до этого и предложенный самим автором HC-256 аналогичный способ требовал [math]\displaystyle{ 2^{280} }[/math] функций, каждый из которых включало в себя 10 бит ключевой последовательности.[6]
Заключение
HC-256 удобен для современных микропроцессоров. Зависимость между операциями в HC-256 сведена у минимуму: три последовательных шага алгоритма могут быть вычислены параллельно. Возможность распараллеливания позволяет HC-256 быть эффективным в современных процессорах. Авторы реализовали HC-256 на языке программирования С и протестировали его эффективность на процессоре Pentium 4. Скорость шифрования HC-256 достигает 1.93 бит/цикл. HC-256 не запатентован и находится в свободном доступе.[7]
Примечания
- ↑ Hongjun Wu. Stream Cipher HC-256, p. 1.
- ↑ Hongjun Wu. Stream Cipher HC-256, p. 2.
- ↑ 3,0 3,1 Hongjun Wu. Stream Cipher HC-256, p. 3.
- ↑ Hongjun Wu. Stream Cipher HC-256, p. 4—6.
- ↑ Erik Zenner. Cache Timing Analysis of eStream Finalists, p. 1—4.
- ↑ Gautham Sekar and Bart Preneel. Improved Distinguishing Attacks on HC-256, p. 1, 2, 6.
- ↑ Hongjun Wu. Stream Cipher HC-256, p. 1, 14.