HC-256

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

HC-256 — система потокового шифрования, разработанная криптографом У Хунцзюнем (Hongjun Wu) из сингапурского Института инфокоммуникационных исследований. Впервые опубликован в 2004 году. 128-битный вариант был представлен на конкурсе eSTREAM, целью которого было создание европейских стандартов для поточных систем шифрования. Алгоритм стал одним из четырех финалистов конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью). [1] (англ.)

Описание алгоритма[править | править исходный текст]

Потоковый шифр HC-256 генерирует ключевую последовательность (keystream) длиной до 2^{128} бит с помощью 256-битового ключа(secret key) и 256-битного вектора инициализации(initialization vector). НС-256 содержит две секретные таблицы, в каждой из которых 1024 32-битных элемента. При каждом шаге обновляется один элемент из таблицы при помощи нелинейном функции обратной связи(feedback function). Через каждые 2048 шагов все элементы двух таблиц будут обновлены.[1]

Операции, функции, переменные[править | править исходный текст]

В алгоритме используются следующие операции:

~+ : x+y означает x+y mod 2^{32}, где 0 \le x ~< 2^{32} и 0 \le y ~< 2^{32}
\boxminus : x \boxminus y означает x - y mod 1024
\oplus : побитовое исключающее ИЛИ
~|| : конкатенация
~\gg : оператор сдвига вправо на указанное количество бит
~\ll : оператор сдвига влево на укзанное количество бит
~\ggg : циклический сдвиг вправо, x ~\ggg n означает ((x ~\gg n) ~+ (x ~\ll (32 - n)), где 0 \le n ~< 32 и 0 \le x ~< 2^{32}

В HC-256 используются две таблицы P и Q. Ключ и вектор инициализации обозначаются K и V соответственно. Ключевая последовательность обозначается S.

~P : таблица из 1024-х 32-битных элементов. Каждый элемент обозначается P[i], где 0 \le i \le 1023.
~Q : таблица из 1024-х 32-битных элементов. Каждый элемент обозначается P[i], где 0 \le i \le 1023.
~K : 256-битный ключ алгоритма HC-256.
~V : 256-битный вектор инициализации алгоритма HC-256.
~S : ключевая последовательность, созданная алгоритмом HC-256. 32-битный элемент на выходе i-го шага обозначается S_i . S=S_0 || S_1 || S_2 || ...

В HC-256 используется шесть функций:

{{f_1}(x) = (x >>> 7) \oplus (x >>> 18) \oplus (x >> 3)}
{{f_2}(x) = (x >>> 17) \oplus (x >>> 19) \oplus (x >> 10)}
{{g_1}(x,y) = ((x >>> 10) \oplus (y >>> 23)) + Q[(x \oplus y) mod~ 1024]}
{{g_2}(x,y) = ((x >>> 10) \oplus (y >>> 23)) + P[(x \oplus y) mod~ 1024]}
~{{h_1}(x) = Q[{x_0}] + Q[256 + {x_1}] + Q[512 + {x_2}] + Q[768 + {x_3}]}
~{{h_2}(x) = P[{x_0}] + P[256 + {x_1}] + P[512 + {x_2}] + P[768 + {x_3}]}

Здесь x = x_3 || x_2 || x_1 || x_0 — 32-битное слово. x_0, x_1, x_2, x_3 состоят из 1 байта каждый, причем x_0, x_3 — младший и старший байты соответственно.[2]

Процесс инициализации[править | править исходный текст]

Процесс инициализации (Initialization process) в HC-256 состоит из преобразования P и Q с помощью ключа и вектора инициализации и запуска шифрования 4096 раз без генерации выходного результата (output).

1. Составление K = K_0 || K_1 || … || K_7 и V = V_0 || V_1 || … || V_7, где K_i и V_i состоят из 32-х бит. Ключ и вектор инициализации расширяются в массив W_i (0 \le i \le 2559).

~{W_i} принимает следующие значения:

 {{K_i},~    0 \le i \le 7} 
{{V_{i-8}},~    8 \le i \le 15}
{{f_2}({W_{i-2}}) + W_{i-7} + f_1(W_{i-15}) + W_{i-16} + i,~    16 \le i \le 2559}

2. Обновление таблиц P и Q с помощью W:

{{P[i]} = {W_{i+512}},~  0 \le i \le 1023}
{{Q[i]} = {W_{i+1536}},~  0 \le i \le 1023}

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 \boxminus 10] + g_1(P[j \boxminus 3], P[j \boxminus 1023]);
S_i = h_1(P[j \boxminus 12]) \oplus P[j];
} else
{ Q[j] = Q[j] + Q[j \boxminus 10] + g_2(Q[j \boxminus 3], Q[j \boxminus 1023]);
S_i = h_2(Q[j \boxminus 12]) \oplus Q[j];
} end-if
i = i + 1;

}
end-repeat
[3]

Безопасность шифрования HC-256[править | править исходный текст]

Авторы сформулировали следующие утверждения о безопасности HC-256:
1) В HC-256 нет скрытых дефектов.
2) Ожидается, что наименьший период не будет намного больше чем 2^{256}.
3) Восстановление секретного ключа так же тяжело, как и полный перебор ключей.
4) Для результативной атаки требуется более чем 2^{128} бит ключевой последовательности.
5) В HC-256 нет слабых ключей.

Период[править | править исходный текст]

Алгоритм HC-256 гарантирует, что период ключевой последовательности очень большой. Но точно определить его тяжело. По оценкам средний период ключевой последовательности около 2^{65546}.

Безопасность секретного ключа[править | править исходный текст]

Функции выхода (output function) и функции обратной связи (feedback function) в HC-256 в высокой степени нелинейна. Нелинейная функция выхода допускает очень малую утечку информации на каждом шаге. Нелинейная функция обратной связи гарантирует, что секретный ключ не может быть определен из этой утечки.

Из анализа значений функций h_1(x) и h_2(x) следует:

Для {~2048 * \alpha \le i < j < 2048 * \alpha + 1024~} из условия ~{~{S_i} = {S_j}~} следует, что {~h_1(x)(P[i \boxminus 12]) \oplus P[i] = h_1(x)(P[j \boxminus 12]) \oplus P[j]~}. Так как {~h_1(x)(P[i \boxminus 12]) = h_1(x)(P[j \boxminus 12])~} с вероятностью примерно {2^{-31}}, вероятность того, что {~P[i] = P[j]~}, также равна примерно {2^{-31}}. Это означает, что при каждом совпадении(collision) утекает примерно {2^{-26.1}} бит информации. Всего {\approx 2^{-12}~} совпадений. Для восстановления P необходимо {~\frac{1024*32}{2^{-12}*2^{-26.1}} * 1024 \approx 2^{53.1}~} выходных результатов. Итак, можно сделать вывод, что ключ для 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 точных измерений времени чтения из кэша, время на вычисление, соответствующее времени тестирования 2^{55} ключей. Следует вывод, что в теории HC-256 уязвим к атакам по времени.[5]

Также следует обратить внимание на публикацию Г.Секара (Gautham Sekar) и Б.Пренила (Bart Preneel), предлагающая класс идентификаторов (class of distinguishers), каждый из которых требует тестирование около 2^{276.8} линейных функций. Каждое уравнение включает в себя 8 бит ключевой последовательности. Вероятность успешного исхода 0.9772. Для сравнения, известный до этого и предложенный самим автором HC-256 аналогичный способ требовал 2^{280} функций, каждый из которых включало в себя 10 бит ключевой последовательности.[6]

Заключение[править | править исходный текст]

HC-256 удобен для современных микропроцессоров. Зависимость между операциями в HC-256 сведена у минимуму: три последовательных шага алгоритма могут быть вычислены параллельно. Возможность распараллеливания позволяет HC-256 быть эффективным в современных процессорах. Авторы реализовали HC-256 на языке программирования С и протестировали его эффективность на процессоре Pentium 4. Скорость шифрования HC-256 достигает 1.93 бит/цикл. HC-256 не запатентован и находится в свободном доступе.[7]

Примечания[править | править исходный текст]

  1. Hongjun Wu. Stream Cipher HC-256, p.1
  2. Hongjun Wu. Stream Cipher HC-256, p.2
  3. 1 2 Hongjun Wu. Stream Cipher HC-256, p.3
  4. Hongjun Wu. Stream Cipher HC-256, pp.4-6
  5. Erik Zenner. Cache Timing Analysis of eStream Finalists, pp.1-4
  6. Gautham Sekar and Bart Preneel. Improved Distinguishing Attacks on HC-256, pp.1,2,6
  7. Hongjun Wu. Stream Cipher HC-256, p.1,14

Ссылки[править | править исходный текст]