Cs-cipher разработали в
1998 году
(
англ.
) и
(
англ.
)
при поддержке
Compagnie des Signaux
. Он был представлен в качестве кандидата в проекте
NESSIE
в рамках программы Европейской комиссии IST (
англ.
Information Societies Technology
, информационные общественные технологии) в конкурсной группе 64-битных блочных шифров
. Несмотря на то, что при исследовании не было обнаружено уязвимостей
, шифр не был выбран для 2 фазы проекта
, потому что оказался самым медленным в своей группе
.
- преобразование 64-битной строки, используется для генерации ключей и в раундовой функции
- битовая
транспозиция
, в данном случае
транспонирование матрицы
, составленной из 8 битных строк, используется при генерации ключей. На вход функция принимает 64-битную строку
- функция циклического
битового сдвига
влево, в данном случае принимает 8-битную строку:
- преобразование
, используется в раундовой функции. На вход принимает 8-битную строку, если упростить получим
:
- преобразование
, используется при расшифровке. На вход принимает 8-битную строку
- преобразование, используется в раундовой функции
, берет на вход 16-битные строки
, результатом является 16-битная строка
, в свою очередь:
- преобразование, используется при расшифровке
, берет на вход 16-битные строки
, результатом является 16-битная строка
, в свою очередь:
- используется для генерации ключей
Константы алгоритма
Ниже представлен список констант, заданных создателями алгоритма:
b7e151628aed2a6a
, требуется для раундовой функции
bf7158809cf4f3c7
, требуется для раундовой функции
290d61409ceb9e8f
, требуется для генерации ключей
1f855f585b013986
, требуется для генерации ключей
972ed7d635ae1716
, требуется для генерации ключей
21b6694ea5728708
, требуется для генерации ключей
3c18e6e7faadb889
, требуется для генерации ключей
b700f76f73841163
, требуется для генерации ключей
3f967f6ebf149dac
, требуется для генерации ключей
a40e7ef6204a6230
, требуется для генерации ключей
03c54b5a46a34465
, требуется для генерации ключей
Генерация ключей
Если секретный ключ, используемый в шифре меньше 128 бит, то первые биты заполняются нулями
, поэтому в дальнейшем будем считать секретный ключ 128 битным.
Алгоритм генерации ключей
Согласно следующему алгоритму в шифре из 128-битного ключа генерируется 9 подключей
размером 64 бита:
первоначально ключ делится на две 64 битные половины
, таким образом мы получаем начальные параметры:
Для генерации последующих ключей используется рекуррентная формула
:
Пример генерации ключей
Рассмотрим пример генерации ключей, описанный создателями CS-cipher
. В нем используется секретный ключ
0123456789abcdeffedcba9876543210
.
Согласно рассмотренному выше, получаем начальные параметры для генерирования раундовых ключей:
Каждый раунд шифровки начинается с операции
XOR
над входящей 64-битной строкой и подключа. Затем 64-битная строка разделяется на 4 16-битных строки, над которыми происходит нелинейное преобразование(
). После этого строки снова делятся, на этот раз в результате получается 8 8-битных строк, которые затем переставляются. Данные действия повторяются еще дважды в каждом раунде, разница лишь в том, что операция
XOR
происходит с заданными константами, а не со сгенерированным ключом. После последнего раунда следует дополнительная операция
XOR
с оставшимся сгенерированным ключом
.
Формальное описание алгоритма
Первоначально определим:
- 64-битная строка, приходит на вход раундовой функции
в
итерации
- временное 64-битное значение, вычисленное на
шаге раундовой функции
- 64-битная строка, конечный зашифрованный текст
Раундовая функции
Раундовая функция состоит из следующих действий
:
Зашифровывание
Зашифрование состоит из 8 раундов, конечный 64-битный зашифрованный текст
можно вычислить из фрагмента открытого текста
по формуле
:
Где
— раундовая функция
, описана выше.
Пример зашифровывания открытого текста
Рассмотрим пример зашифровывания открытого текста, описанный создателями CS-cipher
. В нем используется следующие секретный ключ и открытый текст:
0123456789abcdef
0123456789abcdeffedcba9876543210
Секретный ключ соответствует вышележащему примеру генерации раундовых ключей, то есть раундовые ключи были подсчитаны выше:
45fd137a4edf9ec4
1dd43f03e6f7564c
ebe26756de9937c7
961704e945bad4fb
0b60dfe9eff473d4
76d3e7cf52c466cf
75ec8cef767d3a0d
82da3337b598fd6d
fbd820da8dc8af8c
Промежуточные результаты для вычисления
:
d85c19785690b0e3
0f4bfb9e2f8ac7e2
Получим следующие значения на раундах:
c3feb96c0cf4b649
3f54e0c8e61a84d1
b15cb4af3786976e
76c122b7a562ac45
21300b6ccfaa08d8
99b8d8ab9034ec9a
a2245ba3697445d2
В итоге получили следующий зашифрованный текст:
88fddfbe954479d7
Расшифровывание
Расшифровывание состоит из 8 раундов, обратных зашифровыванию
. Важно, что алгоритм расшифровки использует сгенерированные ключи в обратном порядке, т. е.
. Перед началом происходит операция
.
Для удобства и соответствия обозначений, еще раз укажем:
- номер итерации: от 0 до 7 включительно - всего 8 раундов
- 64-битная строка, приходит на вход обратной к раундовой функции
в
итерации,
- открытый текст
- 64-битный сгенерированный ключ, приходит на вход обратной к раундовой функции
в
итерации
- временное 64-битное значение, вычисленное на
шаге обратной к раундовой функции.
Для каждого раунда вызывается следующая последовательность действий
:
Статистическая оценка зашифрованных данных
В ходе участия в проекте
NESSIE
были проведены множество статистических тестов над зашифрованными данными
, в том числе:
В результате тестирования шифра не было обнаружено его отклонений от случайного распределения
.
Криптоанализ
Марковский шифр
Предположим, у нас есть
раундовый шифр, зашифрованный текст можно получить по формуле:
, в котором каждый раунд
использует свой ключ
.
Тогда Марковским шифром называется шифр, для которого для любого раунда
и любых
,
и
выполнено
:
Определение анализируемого шифра
В ходе анализа используется модифицированный шифр CS-cipher, называемый в дальнейшем CSC.
Он получается из шифра CS-cipher следующей заменой:
для шифровки CS-cipher использует следующую последовательность ключей и констант:
. Для удобства переобозначим их как
.
По определению
CSC получается из CS-cipher заменой полученной с помощью генерации ключей и констант последовательности
на 1600-битный случайный ключ
с равномерным распределением.
Полученный шифр CSC является 24 раундовым блочным Марковским шифром
.