CS-Cipher

Материал из testwiki
Версия от 18:17, 7 декабря 2022; imported>Подарёнка (орфография, chas-correct)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

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.

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

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

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

  • P(x)=zlzr - независимая перестановка 8-битных строк Шаблон:Sfn. Определяется как трех-раундовая сеть ФейстеляШаблон:Sfn:
    • 8-битная входная строка делится на две 4-битных x=xlxr
    • y=xlf(xr)
    • zr=xrg(y)
    • zl=yf(zr)
    • Результатом является строка z=zlzr
      • Функции f(x) и g(x) задаются таблицей:
таблица f(x) и g(x)
x 0 1 2 3 4 5 6 7 8 9 a b c d e f
f(x) f d b b 7 5 7 7 e d a b e d e f
g(x) a 6 0 2 b e 1 8 d 4 5 3 f c 7 9
В конечном итоге P(x) задается с помощью таблицыШаблон:Sfn:
таблица P(x)
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
  • Например P( 2616):
    • y=216f( 616)= 216 716= 516
    • zr= 616g(y)= 616 e16=8
    • zl=yf(zr)= 516 e16= b16
    • Итого: P( 2616)= b816


  • P8(x)=P(x63..56)P(x55..48)P(x47..40)P(x39..32)P(x31..24)P(x23..16)P(x15..8)P(x7..0)Шаблон:Sfn - преобразование 64-битной строки, используется для генерации ключей и в раундовой функции
  • T(z)=z63z55z7z62z54z0 - битовая транспозиция, в данном случае транспонирование матрицы Шаблон:Sfn, составленной из 8 битных строк, используется при генерации ключей. На вход функция принимает 64-битную строку
  • Rl(x) - функция циклического битового сдвига влево, в данном случае принимает 8-битную строку: R(x7x6x5x4x3x2x1x0)=x6x5x4x3x2x1x0x7
  • φ(x)=(Rl(x)5516)x - преобразованиеШаблон:Sfn, используется в раундовой функции. На вход принимает 8-битную строку, если упростить получимШаблон:Sfn:
    • φ(x7x6x5x4x3x2x1x0)=x7(x6x5)x5(x4x3)x3(x2x1)x1(x0x7)
  • ϕ'(x)=(Rl(x)aa16)x - преобразованиеШаблон:Sfn, используется при расшифровке. На вход принимает 8-битную строку
  • M(x) - преобразование, используется в раундовой функцииШаблон:Sfn, берет на вход 16-битные строки x=xlxr, результатом является 16-битная строка M(x)=ylyr, в свою очередь:
    • yl=P(φ(xl)xr)
    • yr=P(Rl(xl)xr)
  • M1(ylyr) - преобразование, используется при расшифровкеШаблон:Sfn, берет на вход 16-битные строки y=ylyr, результатом является 16-битная строка M1(y)=xlxr, в свою очередь:
    • xl=ϕ'(P(yl)P(yr))
    • xr=Rl(xl)P(yr)
  • Fci(x)=T(P8(xci)) - используется для генерации ключейШаблон:Sfn

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

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

  • c= b7e151628aed2a6a16Шаблон:Sfn, требуется для раундовой функции
  • c'= bf7158809cf4f3c716Шаблон:Sfn, требуется для раундовой функции
  • c0= 290d61409ceb9e8f16Шаблон:Sfn, требуется для генерации ключей
  • c1= 1f855f585b01398616Шаблон:Sfn, требуется для генерации ключей
  • c2= 972ed7d635ae171616Шаблон:Sfn, требуется для генерации ключей
  • c3= 21b6694ea572870816Шаблон:Sfn, требуется для генерации ключей
  • c4= 3c18e6e7faadb88916Шаблон:Sfn, требуется для генерации ключей
  • c5= b700f76f7384116316Шаблон:Sfn, требуется для генерации ключей
  • c6= 3f967f6ebf149dac16Шаблон:Sfn, требуется для генерации ключей
  • c7= a40e7ef6204a623016Шаблон:Sfn, требуется для генерации ключей
  • c8= 03c54b5a46a3446516Шаблон:Sfn, требуется для генерации ключей

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

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

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

Согласно следующему алгоритму в шифре из 128-битного ключа генерируется 9 подключей k0,k1,...,k8 размером 64 бита:

  • первоначально ключ делится на две 64 битные половиныШаблон:Sfn, таким образом мы получаем начальные параметры:
k=k1k2
  • Для генерации последующих ключей используется рекуррентная формулаШаблон:Sfn:
ki=ki2Fci(ki1)

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

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

k= 0123456789abcdeffedcba987654321016.

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

k1= 0123456789abcdef16
k2= fedcba987654321016

Рассмотрим подробно генерацию ключа k0:

k0=k2Fc0(k1)=k2T(P8(k1c0))=
=k2T(P8( 0123456789abcdef16 290d61409ceb9e8f16))=
=k2T( b711fa89ae0394e416)= fedcba987654321016 bb21a9e2388bacd416

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

k0= 45fd137a4edf9ec416
k1= 1dd43f03e6f7564c16
k2= ebe26756de9937c716
k3= 961704e945bad4fb16
k4= 0b60dfe9eff473d416
k5= 76d3e7cf52c466cf16
k6= 75ec8cef767d3a0d16
k7= 82da3337b598fd6d16
k8= fbd820da8dc8af8c16

Шифрование

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

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

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

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

  • mi - 64-битная строка, приходит на вход раундовой функции R(x) в i итерации
  • ti=t63..56it55..48it47..40it39..32it31..24it23..16it15..8it7..0i - временное 64-битное значение, вычисленное на i шаге раундовой функции
  • S - 64-битная строка, конечный зашифрованный текст

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

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

  1. t1=x
  2. t2=M(t63..481)M(t47..321)M(t31..161)M(t15..01)
  3. t3=t63..562t47..402t31..242t15..82t55..482t39..322t23..162t7..02
  4. t4=t3c
  5. t5=M(t63..484)M(t47..324)M(t31..164)M(t15..04)
  6. t6=t63..565t47..405t31..245t15..85t55..485t39..325t23..165t7..05
  7. t7=t6c'
  8. t8=M(t63..487)M(t47..327)M(t31..167)M(t15..07)
  9. mi+1=t9=t63..568t47..408t31..248t15..88t55..488t39..328t23..168t7..08

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

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

S=k8R(k7R(k1R(k0m))

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

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

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

m0= 0123456789abcdef16
k= 0123456789abcdeffedcba987654321016

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

k0= 45fd137a4edf9ec416
k1= 1dd43f03e6f7564c16
k2= ebe26756de9937c716
k3= 961704e945bad4fb16
k4= 0b60dfe9eff473d416
k5= 76d3e7cf52c466cf16
k6= 75ec8cef767d3a0d16
k7= 82da3337b598fd6d16
k8= fbd820da8dc8af8c16

Промежуточные результаты для вычисления m1:

t3= d85c19785690b0e316
t6= 0f4bfb9e2f8ac7e216

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

m1= c3feb96c0cf4b64916
m2= 3f54e0c8e61a84d116
m3= b15cb4af3786976e16
m4= 76c122b7a562ac4516
m5= 21300b6ccfaa08d816
m6= 99b8d8ab9034ec9a16
m7= a2245ba3697445d216

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

S= 88fddfbe954479d716

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

Расшифровывание состоит из 8 раундов, обратных зашифровываниюШаблон:Sfn. Важно, что алгоритм расшифровки использует сгенерированные ключи в обратном порядке, т. е. k8,k7,k6,k5,k4,k3,k2,k1,k0Шаблон:Sfn. Перед началом происходит операция m0=Sk8.

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

  • i - номер итерации: от 0 до 7 включительно - всего 8 раундов
  • mi - 64-битная строка, приходит на вход обратной к раундовой функции R1(x) в i итерации, m8 - открытый текст
  • k7i - 64-битный сгенерированный ключ, приходит на вход обратной к раундовой функции R1(x) в i итерации
  • ti=t63..56it55..48it47..40it39..32it31..24it23..16it15..8it7..0i - временное 64-битное значение, вычисленное на i шаге обратной к раундовой функции.

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

t1=m63..56im31..24im55..48im23..16im47..40im15..8im39..32im7..0i

t2=M1(t63..481)M1(t47..321)M1(t31..161)M1(t15..01)

t3=t2c'

t4=t63..563t31..243t55..483t23..163t47..403t15..83t39..323t7..03

t5=M1(t63..484)M1(t47..324)M1(t31..164)M1(t15..04)

t6=t5c

t7=t63..566t31..246t55..486t23..166t47..406t15..86t39..326t7..06

t8=M1(t63..487)M1(t47..327)M1(t31..167)M1(t15..07)

mi+1=t9=t8k7i

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

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

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

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

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

Предположим, у нас есть r раундовый шифр, зашифрованный текст можно получить по формуле: S=Enc(x)=(ρr...ρ1)(x), в котором каждый раунд ρi использует свой ключ ki.

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

Prki[ρi(xa)ρi(x)=b]=Prki,X[ρi(Xa)ρi(X)=b]

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

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

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

  • для шифровки CS-cipher использует следующую последовательность ключей и констант:
k0,c,c',k1,c,c',...,k7,c,c',k8. Для удобства переобозначим их как k0,k1,...,k24.
  • По определениюШаблон:Sfn CSC получается из CS-cipher заменой полученной с помощью генерации ключей и констант последовательности k0,k1,...,k24 на 1600-битный случайный ключ k=(k0,k1,...,k24) с равномерным распределением.

Полученный шифр 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-битный шифр CS2-cipher Шаблон:Sfn.

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

Примечания

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

Литература

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