Русская Википедия:CS-Cipher

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Cs-cipher (Шаблон:Lang-fr, симметричный шифр) — симметричный 64 битный Шаблон:Sfn блочный алгоритм шифрования данных Шаблон:Sfn, использующий длину ключа до 128 битШаблон:Sfn. По принципу работы является 8 раундовой SP-сетьюШаблон:Sfn.

История

Cs-cipher разработали в 1998 году Шаблон:Не переведено 2 и Шаблон:Не переведено 2 Шаблон:Sfn при поддержке Compagnie des SignauxШаблон:Sfn . Он был представлен в качестве кандидата в проекте NESSIE в рамках программы Европейской комиссии IST (Шаблон:Lang-en, информационные общественные технологии) в конкурсной группе 64-битных блочных шифровШаблон:Sfn. Несмотря на то, что при исследовании не было обнаружено уязвимостейШаблон:Sfn, шифр не был выбран для 2 фазы проектаШаблон:Sfn, потому что оказался самым медленным в своей группеШаблон:Sfn.

Основные обозначения

Используемые функции

Для начала обозначим следующие обозначения:

  • <math>P(x) = z_l \parallel z_r</math> - независимая перестановка 8-битных строк Шаблон:Sfn. Определяется как трех-раундовая сеть ФейстеляШаблон:Sfn:
    • 8-битная входная строка делится на две 4-битных <math>x = x_l\parallel x_r</math>
    • <math>y = x_l \oplus f(x_r)</math>
    • <math> z_r = x_r \oplus g(y)</math>
    • <math> z_l = y\oplus f(z_r)</math>
    • Результатом является строка <math>z = z_l\parallel z_r</math>
      • Функции <math>f(x)</math> и <math>g(x)</math> задаются таблицей:
таблица <math>f(x)</math> и <math>g(x)</math>
x 0 1 2 3 4 5 6 7 8 9 a b c d e f
<math>f(x)</math> f d b b 7 5 7 7 e d a b e d e f
<math>g(x)</math> a 6 0 2 b e 1 8 d 4 5 3 f c 7 9
В конечном итоге <math>P(x)</math> задается с помощью таблицыШаблон:Sfn:
таблица <math>P(x)</math>
xy .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f
0. 29 0d 61 40 9c eb 9e 8f 1f 85 5f 58 5b 01 39 86
1. 97 2e d7 d6 35 ae 17 16 21 b6 69 4e a5 72 87 08
2. 3c 18 e6 e7 fa ad b8 89 b7 00 f7 6f 73 84 11 63
3. 3f 96 7f 6e bf 14 9d ac a4 0e 7e f6 20 4a 62 30
4. 03 c5 4b 5a 46 a3 44 65 7d 4d 3d 42 79 49 1b 5c
5. f5 6c b5 94 54 ff 56 57 0b f4 43 0c 4f 70 6d 0a
6. e4 02 3e 2f a2 47 e0 c1 d5 1a 95 a7 51 5e 33 2b
7. 5d d4 1d 2c ee 75 ec dd 7c 4c a6 b4 78 48 3a 32
8. 98 af c0 e1 2d 09 0f 1e b9 27 8a e9 bd e3 9f 07
9. b1 ea 92 93 53 6a 31 10 80 f2 d8 9b 04 36 06 8e
a. be a9 64 45 38 1c 7a 6b f3 a1 f0 cd 37 25 15 81
b. fb 90 e8 d9 7b 52 19 28 26 88 fc d1 e2 8c a0 34
c. 82 67 da cb c7 41 e5 c4 c8 ef db c3 cc ab ce ed
d. d0 bb d3 d2 71 68 13 12 9a b3 c2 ca de 77 dc df
e. 66 83 bc 8d 60 c6 22 23 b2 8b 91 05 76 cf 74 c9
f. aa f1 99 a8 59 50 3b 2a fe f9 24 b0 ba fd f8 55
  • Например <math>P(</math> 26<math>_{16})</math>:
    • <math>y =</math>2<math>_{16} \oplus f(</math> 6<math>_{16}) = </math> 2<math>_{16} \oplus </math> 7<math>_{16} = </math> 5<math>_{16}</math>
    • <math>z_r = </math> 6<math>_{16} \oplus g(y) = </math> 6<math>_{16}\oplus </math> e<math>_{16} = 8</math>
    • <math>z_l = y \oplus f(z_r) = </math> 5<math>_{16} \oplus </math> e<math>_{16} = </math> b<math>_{16}</math>
    • Итого: <math>P(</math> 26<math>_{16}) = </math> b8<math>_{16}</math>


  • <math>P^8(x) = P(x_{63..56})\parallel P(x_{55..48})\parallel P(x_{47..40})\parallel P(x_{39..32})\parallel P(x_{31..24})\parallel P(x_{23..16})\parallel P(x_{15..8})\parallel P(x_{7..0})</math>Шаблон:Sfn - преобразование 64-битной строки, используется для генерации ключей и в раундовой функции
  • <math>T(z) = z_{63}\parallel z_{55}\parallel \dots\parallel z_7\parallel z_{62}\parallel z_{54}\parallel \dots \parallel z_0 </math> - битовая транспозиция, в данном случае транспонирование матрицы Шаблон:Sfn, составленной из 8 битных строк, используется при генерации ключей. На вход функция принимает 64-битную строку
  • <math>R_l(x)</math> - функция циклического битового сдвига влево, в данном случае принимает 8-битную строку: <math>R(x_7\parallel x_6\parallel x_5\parallel x_4\parallel x_3\parallel x_2\parallel x_1\parallel x_0) = x_6\parallel x_5\parallel x_4\parallel x_3\parallel x_2\parallel x_1\parallel x_0\parallel x_7</math>
  • <math>\varphi(x) = (R_l(x) \land 55_{16})\oplus x</math> - преобразованиеШаблон:Sfn, используется в раундовой функции. На вход принимает 8-битную строку, если упростить получимШаблон:Sfn:
    • <math>\varphi(x_7\parallel x_6\parallel x_5\parallel x_4\parallel x_3\parallel x_2\parallel x_1\parallel x_0) = x_7\parallel( x_6\oplus x_5) \parallel x_5\parallel( x_4\oplus x_3)\parallel x_3\parallel( x_2\oplus x_1)\parallel x_1\parallel (x_0\oplus x_7)</math>
  • <math> \phi^'(x) = (R_l(x)\land aa_{16})\oplus x</math> - преобразованиеШаблон:Sfn, используется при расшифровке. На вход принимает 8-битную строку
  • <math>M(x)</math> - преобразование, используется в раундовой функцииШаблон:Sfn, берет на вход 16-битные строки <math>x=x_l\parallel x_r</math>, результатом является 16-битная строка <math>M(x)=y_l\parallel y_r</math>, в свою очередь:
    • <math>y_l = P( \varphi (x_l)\oplus x_r)</math>
    • <math>y_r = P( R_l(x_l)\oplus x_r)</math>
  • <math>M^{-1}(y_l \parallel y_r)</math> - преобразование, используется при расшифровкеШаблон:Sfn, берет на вход 16-битные строки <math>y=y_l\parallel y_r</math>, результатом является 16-битная строка <math>M^{-1}(y)=x_l\parallel x_r</math>, в свою очередь:
    • <math> x_l = \phi^{'}(P(y_l)\oplus P(y_r))</math>
    • <math>x_r = R_l(x_l)\oplus P(y_r)</math>
  • <math>F_{c_i}(x) = T (P^8(x\oplus c^i))</math> - используется для генерации ключейШаблон:Sfn

Константы алгоритма

Ниже представлен список констант, заданных создателями алгоритма:

  • <math>c = </math> b7e151628aed2a6a<math>_{16} </math>Шаблон:Sfn, требуется для раундовой функции
  • <math>c^' =</math> bf7158809cf4f3c7<math>_{16} </math>Шаблон:Sfn, требуется для раундовой функции
  • <math>c^0 = </math> 290d61409ceb9e8f<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^1 = </math> 1f855f585b013986<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^2 = </math> 972ed7d635ae1716<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^3 = </math> 21b6694ea5728708<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^4 = </math> 3c18e6e7faadb889<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^5 = </math> b700f76f73841163<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^6 = </math> 3f967f6ebf149dac<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^7 = </math> a40e7ef6204a6230<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей
  • <math>c^8 = </math> 03c54b5a46a34465<math>_{16}</math>Шаблон:Sfn, требуется для генерации ключей

Генерация ключей

Если секретный ключ, используемый в шифре меньше 128 бит, то первые биты заполняются нулями Шаблон:Sfn, поэтому в дальнейшем будем считать секретный ключ 128 битным.

Алгоритм генерации ключей

Согласно следующему алгоритму в шифре из 128-битного ключа генерируется 9 подключей <math>k^0, k^1, ... , k^8 </math> размером 64 бита:

  • первоначально ключ делится на две 64 битные половиныШаблон:Sfn, таким образом мы получаем начальные параметры:
<math>k = k^{-1}\parallel k^{-2}</math>
  • Для генерации последующих ключей используется рекуррентная формулаШаблон:Sfn:
<math>k^i= k^{i-2}\oplus F_{c^i}(k^{i-1})</math>

Пример генерации ключей

Рассмотрим пример генерации ключей, описанный создателями CS-cipherШаблон:Sfn. В нем используется секретный ключ

<math>k = </math> 0123456789abcdeffedcba9876543210<math>_{16}</math>.

Согласно рассмотренному выше, получаем начальные параметры для генерирования раундовых ключей:

<math>k^{-1} = </math> 0123456789abcdef<math>_{16}</math>
<math>k^{-2} = </math> fedcba9876543210<math>_{16}</math>

Рассмотрим подробно генерацию ключа <math>k^0</math>:

<math>k^0 = k^{-2} \oplus F_{c_0}(k^{-1}) = k^{-2} \oplus T(P^8(k^{-1}\oplus c^0))=</math>
<math>= k^{-2} \oplus T(P^8(</math> 0123456789abcdef<math>_{16}\oplus</math> 290d61409ceb9e8f<math>_{16} ))=</math>
<math>= k^{-2} \oplus T(</math> b711fa89ae0394e4<math>_{16}) =</math> fedcba9876543210<math>_{16}\oplus </math> bb21a9e2388bacd4<math>_{16}</math>

Конечный результат работы алготитма генерации:

<math>k^0 = </math> 45fd137a4edf9ec4<math>_{16}</math>
<math>k^1 = </math> 1dd43f03e6f7564c<math>_{16}</math>
<math>k^2 = </math> ebe26756de9937c7<math>_{16}</math>
<math>k^3 = </math> 961704e945bad4fb<math>_{16}</math>
<math>k^4 = </math> 0b60dfe9eff473d4<math>_{16}</math>
<math>k^5 = </math> 76d3e7cf52c466cf<math>_{16}</math>
<math>k^6 = </math> 75ec8cef767d3a0d<math>_{16}</math>
<math>k^7 = </math> 82da3337b598fd6d<math>_{16}</math>
<math>k^8 = </math> fbd820da8dc8af8c<math>_{16}</math>

Шифрование

Краткое описание зашифровки

Каждый раунд шифровки начинается с операции XOR над входящей 64-битной строкой и подключа. Затем 64-битная строка разделяется на 4 16-битных строки, над которыми происходит нелинейное преобразование( <math>M(x)</math>). После этого строки снова делятся, на этот раз в результате получается 8 8-битных строк, которые затем переставляются. Данные действия повторяются еще дважды в каждом раунде, разница лишь в том, что операция XOR происходит с заданными константами, а не со сгенерированным ключом. После последнего раунда следует дополнительная операция XOR с оставшимся сгенерированным ключомШаблон:Sfn.

Формальное описание алгоритма

Первоначально определим:

  • <math>m^i</math> - 64-битная строка, приходит на вход раундовой функции <math>R(x)</math> в <math>i</math> итерации
  • <math>t^i = t^i_{63..56}\parallel t^i_{55..48}\parallel t^i_{47..40}\parallel t^i_{39..32}\parallel t^i_{31..24}\parallel t^i_{23..16}\parallel t^i_{15..8}\parallel t^i_{7..0}</math> - временное 64-битное значение, вычисленное на <math>i</math> шаге раундовой функции
  • <math>S</math> - 64-битная строка, конечный зашифрованный текст

Раундовая функции <math>R(x)</math>

Раундовая функция состоит из следующих действийШаблон:Sfn:

  1. <math>t^1= x</math>
  2. <math>t^2 = M(t^1_{63..48})\parallel M(t^1_{47..32})\parallel M(t^1_{31..16})\parallel M(t^1_{15..0})</math>
  3. <math>t^3 = t^2_{63..56}\parallel t^2_{47..40}\parallel t^2_{31..24}\parallel t^2_{15..8}

\parallel t^2_{55..48}\parallel t^2_{39..32}\parallel t^2_{23..16}\parallel t^2_{7..0}</math>

  1. <math>t^4= t^3 \oplus c</math>
  2. <math>t^5 = M(t^4_{63..48})\parallel M(t^4_{47..32})\parallel M(t^4_{31..16})\parallel M(t^4_{15..0})</math>
  3. <math>t^6 = t^5_{63..56}\parallel t^5_{47..40}\parallel t^5_{31..24}\parallel t^5_{15..8}

\parallel t^5_{55..48}\parallel t^5_{39..32}\parallel t^5_{23..16}\parallel t^5_{7..0}</math>

  1. <math>t^7= t^6 \oplus c^'</math>
  2. <math>t^8 = M(t^7_{63..48})\parallel M(t^7_{47..32})\parallel M(t^7_{31..16})\parallel M(t^7_{15..0})</math>
  3. <math>m^{i+1} = t^9 = t^8_{63..56}\parallel t^8_{47..40}\parallel t^8_{31..24}\parallel t^8_{15..8}

\parallel t^8_{55..48}\parallel t^8_{39..32}\parallel t^8_{23..16}\parallel t^8_{7..0}</math>

Зашифровывание

Зашифрование состоит из 8 раундов, конечный 64-битный зашифрованный текст <math>S</math> можно вычислить из фрагмента открытого текста <math>m</math> по формулеШаблон:Sfn:

<math> S = k^8\oplus R(k^7\oplus \dots R(k^1\oplus R(k^0\oplus m)\dots)</math>

Где <math>R(x)</math> — раундовая функцияШаблон:Sfn, описана выше.

Пример зашифровывания открытого текста

Рассмотрим пример зашифровывания открытого текста, описанный создателями CS-cipherШаблон:Sfn. В нем используется следующие секретный ключ и открытый текст:

<math>m^0= </math> 0123456789abcdef<math>_{16}</math>
<math>k = </math> 0123456789abcdeffedcba9876543210<math>_{16}</math>

Секретный ключ соответствует вышележащему примеру генерации раундовых ключей, то есть раундовые ключи были подсчитаны выше:

<math>k^0 = </math> 45fd137a4edf9ec4<math>_{16}</math>
<math>k^1 = </math> 1dd43f03e6f7564c<math>_{16}</math>
<math>k^2 = </math> ebe26756de9937c7<math>_{16}</math>
<math>k^3 = </math> 961704e945bad4fb<math>_{16}</math>
<math>k^4 = </math> 0b60dfe9eff473d4<math>_{16}</math>
<math>k^5 = </math> 76d3e7cf52c466cf<math>_{16}</math>
<math>k^6 = </math> 75ec8cef767d3a0d<math>_{16}</math>
<math>k^7 = </math> 82da3337b598fd6d<math>_{16}</math>
<math>k^8 = </math> fbd820da8dc8af8c<math>_{16}</math>

Промежуточные результаты для вычисления <math>m^1</math>:

<math>t^3 = </math> d85c19785690b0e3<math>_{16}</math>
<math>t^6 = </math> 0f4bfb9e2f8ac7e2<math>_{16}</math>

Получим следующие значения на раундах:

<math>m^1 = </math> c3feb96c0cf4b649<math>_{16}</math>
<math>m^2 = </math> 3f54e0c8e61a84d1<math>_{16}</math>
<math>m^3 = </math> b15cb4af3786976e<math>_{16}</math>
<math>m^4 = </math> 76c122b7a562ac45<math>_{16}</math>
<math>m^5 = </math> 21300b6ccfaa08d8<math>_{16}</math>
<math>m^6 = </math> 99b8d8ab9034ec9a<math>_{16}</math>
<math>m^7 = </math> a2245ba3697445d2<math>_{16}</math>

В итоге получили следующий зашифрованный текст:

<math>S = </math> 88fddfbe954479d7<math>_{16}</math>

Расшифровывание

Расшифровывание состоит из 8 раундов, обратных зашифровываниюШаблон:Sfn. Важно, что алгоритм расшифровки использует сгенерированные ключи в обратном порядке, т. е. <math> k^8, k^7, k^6, k^5, k^4, k^3, k^2, k^1, k^0</math>Шаблон:Sfn. Перед началом происходит операция <math> m^0 = S \oplus k^8</math>.

Для удобства и соответствия обозначений, еще раз укажем:

  • <math> i</math> - номер итерации: от 0 до 7 включительно - всего 8 раундов
  • <math>m^i</math> - 64-битная строка, приходит на вход обратной к раундовой функции <math>R^{-1}(x)</math> в <math> i</math> итерации, <math>m^8</math> - открытый текст
  • <math>k^{7-i}</math> - 64-битный сгенерированный ключ, приходит на вход обратной к раундовой функции <math>R^{-1}(x)</math> в <math> i</math> итерации
  • <math>t^i = t^i_{63..56}\parallel t^i_{55..48}\parallel t^i_{47..40}\parallel t^i_{39..32}\parallel t^i_{31..24}\parallel t^i_{23..16}\parallel t^i_{15..8}\parallel t^i_{7..0}</math> - временное 64-битное значение, вычисленное на <math>i</math> шаге обратной к раундовой функции.

Для каждого раунда вызывается следующая последовательность действийШаблон:Sfn:

<math>t^1 = m^i_{63..56}\parallel m^i_{31..24}\parallel m^i_{55..48}\parallel m^i_{23..16}\parallel m^i_{47..40}\parallel m^i_{15..8} \parallel m^i_{39..32}\parallel m^i_{7..0}</math>

<math>t^2 = M^{-1}(t^1_{63..48})\parallel M^{-1}(t^1_{47..32})\parallel M^{-1}(t^1_{31..16})\parallel M^{-1}(t^1_{15..0})</math>

<math> t^3 = t^2 \oplus c^'</math>

<math>t^4 = t^3_{63..56}\parallel t^3_{31..24}\parallel t^3_{55..48}\parallel t^3_{23..16}\parallel t^3_{47..40}\parallel t^3_{15..8} \parallel t^3_{39..32}\parallel t^3_{7..0}</math>

<math>t^5 = M^{-1}(t^4_{63..48})\parallel M^{-1}(t^4_{47..32})\parallel M^{-1}(t^4_{31..16})\parallel M^{-1}(t^4_{15..0})</math>

<math> t^6 = t^5 \oplus c</math>

<math>t^7 = t^6_{63..56}\parallel t^6_{31..24}\parallel t^6_{55..48}\parallel t^6_{23..16}\parallel t^6_{47..40}\parallel t^6_{15..8} \parallel t^6_{39..32}\parallel t^6_{7..0}</math>

<math>t^8 = M^{-1}(t^7_{63..48})\parallel M^{-1}(t^7_{47..32})\parallel M^{-1}(t^7_{31..16})\parallel M^{-1}(t^7_{15..0})</math>

<math> m^{i+1} = t^9 = t^8 \oplus k^{7-i}</math>

Статистическая оценка зашифрованных данных

В ходе участия в проекте NESSIE были проведены множество статистических тестов над зашифрованными даннымиШаблон:Sfn, в том числе:

В результате тестирования шифра не было обнаружено его отклонений от случайного распределенияШаблон:Sfn.

Криптоанализ

Марковский шифр

Предположим, у нас есть <math>r</math> раундовый шифр, зашифрованный текст можно получить по формуле: <math> S = Enc(x) = (\rho_r \circ ... \circ \rho_1)(x)</math>, в котором каждый раунд <math>\rho_i</math> использует свой ключ <math>k_i</math>.

Тогда Марковским шифром называется шифр, для которого для любого раунда <math>i</math> и любых <math>x</math>, <math>a</math> и <math>b</math> выполненоШаблон:Sfn:

<math>Pr_{k_i}[\rho_i(x\oplus a) \oplus \rho_i(x) = b] =Pr_{k_i, X}[\rho_i(X\oplus a) \oplus \rho_i(X) = b]</math>

Определение анализируемого шифра

В ходе анализа используется модифицированный шифр CS-cipher, называемый в дальнейшем CSC.

Он получается из шифра CS-cipher следующей заменой:

  • для шифровки CS-cipher использует следующую последовательность ключей и констант:
<math>k^0, c, c^', k^1, c, c^',...,k^7, c, c^', k^8</math>. Для удобства переобозначим их как <math>k_0, k_1, ..., k_{24}</math>.
  • По определениюШаблон:Sfn CSC получается из CS-cipher заменой полученной с помощью генерации ключей и констант последовательности <math>k_0, k_1, ..., k_{24}</math> на 1600-битный случайный ключ <math>k= (k_0, k_1, ..., k_{24})</math> с равномерным распределением.

Полученный шифр CSC является 24 раундовым блочным Марковским шифромШаблон:Sfn.

Устойчивость к атакам

Для шифра CSC были доказаны:

Поэтому предполагается, что CS-cipher:

Реализация

Существует реализации данного алгоритма шифрования на СШаблон:Sfn( предоставлена авторами):


# define CSC_C10 0xbf
# define CSC_C11 0x71
# define CSC_C12 0x58
# define CSC_C13 0x80
# define CSC_C14 0x9c
# define CSC_C15 0xf4
# define CSC_C16 0xf3
# define CSC_C17 0xc7
uint8 tbp[256]={
0x29,0x0d,0x61,0x40,0x9c,0xeb,0x9e,0x8f,
0x1f,0x85,0x5f,0x58,0x5b,0x01,0x39,0x86,
0x97,0x2e,0xd7,0xd6,0x35,0xae,0x17,0x16,
0x21,0xb6,0x69,0x4e,0xa5,0x72,0x87,0x08,
0x3c,0x18,0xe6,0xe7,0xfa,0xad,0xb8,0x89,
0xb7,0x00,0xf7,0x6f,0x73,0x84,0x11,0x63,
0x3f,0x96,0x7f,0x6e,0xbf,0x14,0x9d,0xac,
0xa4,0x0e,0x7e,0xf6,0x20,0x4a,0x62,0x30,
0x03,0xc5,0x4b,0x5a,0x46,0xa3,0x44,0x65,
0x7d,0x4d,0x3d,0x42,0x79,0x49,0x1b,0x5c,
0xf5,0x6c,0xb5,0x94,0x54,0xff,0x56,0x57,
0x0b,0xf4,0x43,0x0c,0x4f,0x70,0x6d,0x0a,
0xe4,0x02,0x3e,0x2f,0xa2,0x47,0xe0,0xc1,
0xd5,0x1a,0x95,0xa7,0x51,0x5e,0x33,0x2b,
0x5d,0xd4,0x1d,0x2c,0xee,0x75,0xec,0xdd,
0x7c,0x4c,0xa6,0xb4,0x78,0x48,0x3a,0x32,
0x98,0xaf,0xc0,0xe1,0x2d,0x09,0x0f,0x1e,
0xb9,0x27,0x8a,0xe9,0xbd,0xe3,0x9f,0x07,
0xb1,0xea,0x92,0x93,0x53,0x6a,0x31,0x10,
0x80,0xf2,0xd8,0x9b,0x04,0x36,0x06,0x8e,
0xbe,0xa9,0x64,0x45,0x38,0x1c,0x7a,0x6b,
0xf3,0xa1,0xf0,0xcd,0x37,0x25,0x15,0x81,
0xfb,0x90,0xe8,0xd9,0x7b,0x52,0x19,0x28,
0x26,0x88,0xfc,0xd1,0xe2,0x8c,0xa0,0x34,
0x82,0x67,0xda,0xcb,0xc7,0x41,0xe5,0xc4,
0xc8,0xef,0xdb,0xc3,0xcc,0xab,0xce,0xed,
0xd0,0xbb,0xd3,0xd2,0x71,0x68,0x13,0x12,
0x9a,0xb3,0xc2,0xca,0xde,0x77,0xdc,0xdf,
0x66,0x83,0xbc,0x8d,0x60,0xc6,0x22,0x23,
0xb2,0x8b,0x91,0x05,0x76,0xcf,0x74,0xc9,
0xaa,0xf1,0x99,0xa8,0x59,0x50,0x3b,0x2a,
0xfe,0xf9,0x24,0xb0,0xba,0xfd,0xf8,0x55,
};
void enc_csc(uint8 m[8],uint8* k)
{
  uint8 tmpx,tmprx,tmpy;
  int i;
  #define APPLY_M(cl,cr,adl,adr) \
  code=tmpx=m[adl]^cl; \
  code=tmprx=(tmpx<<1)^(tmpx>>7); \
  code=tmpy=m[adr]^cr; \
  code=m[adl]=tbp[(tmprx&0x55)^tmpx^tmpy]; \
  code=m[adr]=tbp[tmprx^tmpy];
  for(code=i=0;i<8;i++,k+=8) 
  {
    APPLY_M(k[0],k[1],0,1)
    APPLY_M(k[2],k[3],2,3)
    APPLY_M(k[4],k[5],4,5)
    APPLY_M(k[6],k[7],6,7)
    APPLY_M(CSC_C00,CSC_C01,0,2)
    APPLY_M(CSC_C02,CSC_C03,4,6)
    APPLY_M(CSC_C04,CSC_C05,1,3)
    APPLY_M(CSC_C06,CSC_C07,5,7)
    APPLY_M(CSC_C10,CSC_C11,0,4)
    APPLY_M(CSC_C12,CSC_C13,1,5)
    APPLY_M(CSC_C14,CSC_C15,2,6)
    APPLY_M(CSC_C16,CSC_C17,3,7)
  }
  for(code=i=0;i<8;i++) 
    code=m[i]^=k[i];
}

код алгоритма шифровки на С

Также авторами собрана статистика скорости зашифровки данных, оказавшаяся быстрее DESШаблон:Sfn:

Скорость зашифровки данных CS-cipher
платформа тактовая частота скорость шифровки
VLSI 1216nand 1mm 230 МГц 73 Мбит/с
VLSI 30000nand 15mm 230 МГц 2 Гбит/с
standard C 32bits 133 МГц 2 Мбит/с
bit slice (Pentium) 133 МГц 11 Мбит/с
bit slice (Alpha) 300 МГц 196 Мбит/с
Pentium assembly code 133 МГц 8 Мбит/с
6805 assembly code 4 МГц 20 Кбит/с

Дальнейшее развитие

На основе CS-cipher в 2004 году Томом Ст. Денис был разработан 128-битный шифр <math>CS^2</math>-cipher Шаблон:Sfn.

Полученный шифр был проверен и оказался устойчивым к:

Примечания

Шаблон:Примечания

Литература

Шаблон:Симметричные криптосистемы