Материал: MSZI_2003

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
background image

Стандарт

 

шифрования

 

данных

 DES     

421

 

Продолжение

 

листинга

 18.4

 

SUB transpose (datax() AS INTEGER, T() AS INTEGER, nt%) 
letbe XT(), datax(), 64 
FOR i% = 1 TO nt% 
 datax(i%) = XT(T(i%)) 
NEXT i% 
END SUB 
 
SUB xtob (a$, mbits() AS INTEGER) 
LOCAL X$,NIBBLE$ 
FOR i% = 1 to 16 
    X$ = MID$(a$,i%,1) 
    SELECT CASE X$ 
    CASE "0" 
     NIBBLE$ = "0000" 
    CASE "1" 
     NIBBLE$ = "0001" 
    CASE "2" 
     NIBBLE$ = "0010" 
    CASE "3" 
     NIBBLE$ = "0011"  
    CASE "4" 
     NIBBLE$ = "0100" 
    CASE "5" 
     NIBBLE$ = "0101" 
    CASE "6" 
     NIBBLE$ = "0110" 
    CASE "7" 
     NIBBLE$ = "0111"  
    CASE "8" 
     NIBBLE$ = "1000" 
    CASE "9" 
     NIBBLE$ = "1001" 
    CASE "A" 
     NIBBLE$ = "1010" 
    CASE "B" 
     NIBBLE$ = "1011"  
    CASE "C" 
     NIBBLE$ = "1100" 
    CASE "D" 
     NIBBLE$ = "1101" 
    CASE "E" 

background image

422

     

Глава

 18. 

Криптографическая

 

защита

 

 

Окончание

 

листинга

 18.4

 

     NIBBLE$ = "1110" 
    CASE "F" 
     NIBBLE$ = "1111" 
    CASE ELSE 
     Print "

Не

 

является

 16-

ричным

 

значением

!" 

     SYSTEM  
    END SELECT 
    FOR j% = 1 to 4 
        mbits(((i% - 1) * 4) + j%) = ASC(MID$(NIBBLE$, j%, 1)) - 48 
    NEXT j% 
  NEXT i% 
END SUB 

Другие

 

режимы

 

использования

 

алгоритма

 

шифрования

 DES 

Помимо

 

режима

 ECB, 

алгоритм

 DES 

может

 

использоваться

 

в

 

режиме

 

сцепления

 

блоков

 

шифртекста

 (

СВС

 — 

С

i

р

h

ег

 

В

1

ос

k Chaining). 

Суть

 

этого

 

режима

 

состоит

 

в

 

том

что

 

сообщение

 

разбивается

 

на

 

блоки

 

по

 64 

бит

и

 

их

 

последовательность

 

зашифровыва

-

ется

Перед

 

шифрованием

 (

в

 

режиме

 

ЕСВ

), 

блок

 

открытого

 

текста

 

поразрядно

 

складыва

-

ется

 

с

 

предыдущим

 

блоком

 

шифртекста

Для

 

шифрования

 

первого

 

блока

 

шифртекста

 

требуется

 

так

 

называемый

 

вектор

 

инициализации

 (IV — initialization vector). 

Последний

 

не

 

является

 

секретным

Данный

 

режим

 

не

 

позволяет

 

накапливаться

 

ошибкам

 

при

 

пере

-

даче

поскольку

 

ошибка

 

при

 

передаче

 

приведет

 

к

 

потере

 

только

 

двух

 

блоков

 

исходного

 

текста

Кроме

 ECB 

и

 CBC, 

существуют

 

также

 

режимы

 

шифрования

 

с

 

обратной

 

связью

 

(

С

F

В

 — 

С

i

р

h

е

r F

ее

db

аск

и

 

шифрования

 

с

 

внешней

 

обратной

 

связью

 (

О

F

В

 — Output 

F

ее

db

аск

).  

Стандарт

 

криптографического

 

преобразования

 

данных

 

ГОСТ

 28147-89 

Стандарт

 

криптографического

 

преобразования

 

данных

 

ГОСТ

 28147-89 

рекомендован

 

к

 

использованию

 

для

 

защиты

 

любых

 

данных

представленных

 

в

 

виде

 

двоичного

 

кода

Данный

 

стандарт

 

формировался

 

с

 

учетом

 

мирового

 

опыта

и

 

в

 

частности

при

 

его

 

разра

-

ботке

 

были

 

приняты

 

во

 

внимание

 

недостатки

 

алгоритма

 DES. 

Стандарт

 

довольно

 

сло

-

жен

поэтому

 

приведем

 

лишь

 

его

 

концептуальное

 

описание

Алгоритм

 

криптографического

 

преобразования

установленный

 

ГОСТ

 28147-89 (

да

-

лее

 — 

ГОСТ

используется

 

для

 

шифрования

 

данных

 

в

 

двух

 

режимах

а

 

также

 

для

 

выра

-

ботки

 

имитовставки

которая

 

является

 

средством

 

контроля

 

целостности

 

данных

 

и

 

зави

-

сит

 

от

 

ключей

При

 

шифровании

 

алгоритм

 

ГОСТ

 

сводится

 

к

 

шифру

 

гаммирования

.

 

Блок

 

гаммы

 

представляет

 

собой

 64-

битовую

 

комбинацию

состоящую

 

из

 

двух

 

последователь

-

ных

 32-

битовых

 

блоков

Исходя

 

из

 

удобства

 

изложения

далее

 

будем

 

называть

 

любой

 64-

background image

Стандарт

 

криптографического

 

преобразования

 

данных

 

ГОСТ

 28147-89     

423

 

битовый

 

блок

 

комбинацией

а

 

также

 

считать

что

 

блок

 

состоит

 

их

 

двух

 

сцепленных

 

под

-

блоков

 

из

 32-

х

 

битов

 

каждый

Гамма

 

накладывается

 

поразрядно

 

по

 

модулю

 2. 

Каждая

 

комбинация

 

гаммы

 

представ

-

ляет

 

собой

 

результат

 

шифрпреобразования

 

с

 

помощью

 

шифра

 

простой

 

замены

 

на

 

мно

-

жестве

 64-

битовых

 

комбинаций

Входные

 

комбинации

 

для

 

указанного

 

шифра

в

 

общем

 

случае

формируются

 

в

 

зависимости

 

от

 

ключей

псевдослучайного

 

открытого

 

параметра

 

S

 (

синхропосылка

), 

известных

 

констант

 

с

1

c

2

 

и

 

предыдущего

 

блока

 

шифртекста

Факти

-

чески

 

задача

 

каждого

 

из

 

режимов

 

шифрования

 — 

это

 

формирование

 64-

битовых

 

комби

-

наций

 

для

 

входа

 

в

 

основной

 

режим

 

работы

 

ГОСТ

называемый

 

режимом

 

простой

 

заме

-

ны

По

 

сути

ключи

 

необходимы

 

для

 

работы

 

ГОСТ

 

именно

 

в

 

этом

 

режиме

Комбинация

 

гаммы

 

является

 

результатом

 

работы

 

алгоритма

 

в

 

режиме

 

простой

 

замены

Алгоритм

 

ГОСТ

 

в

 

качестве

 

исходных

 

данных

 

использует

 

три

 

параметра

K

,

 

X

 

и

 

Z

 — 

64-

битовый

 

блок

 

данных

Первый

 

параметр

 

является

 

долговременным

а

 

второй

 — 

се

-

ансовым

 

ключом

Параметры

 

независимы

 

и

 

имеют

 

размер

 512, 256 

и

 64 

бита

 

соответственно

K

 

пред

-

ставляет

 

собой

 

отображение

 

множества

 

блоков

 

в

 

себя

Это

 

отображение

 

реализует

 

потет

-

радную

 

замену

 32-

разрядных

 

блоков

 

в

 32-

х

 

разрядные

 

и

 

состоит

 

из

 8 

подключей

.

 

Подключ

 

K

i

 

(

i = 1, …, 8

), 

входящий

 

в

 

K

является

 

таблицей

 

замены

 

для

 

i-

той

 (

слева

тетрады

т

.

е

состоит

 

из

 16 

тетрад

В

 

стандарте

 

ключ

 

K

 

называется

 

блоком

 

подстановки

а

 

подключи

 

K

 

— 

узлами

 

замены

Сеансовый

 

ключ

 

X

 

состоит

 

из

 

восьми

 32-

разрядных

 

подключей

 

X

i

,

 

каждый

 

из

 

кото

-

рых

 

в

 

соответствующий

 

момент

 

используется

 

для

 

суммирования

 

с

 

некоторым

 

блоком

 

по

 

модулю

 2. 

Режим

 

простой

 

замены

 

алгоритма

 

ГОСТ

 

реализован

 

в

 

виде

 

шифра

 

Файстеля

Шифрование

 

блока

 

открытого

 

текста

 

Z

 

алгоритмом

 

ГОСТ

 

производится

 

за

 32 

цикла

На

 

каждом

 

цикле

 

происходит

 

преобразование

 

входной

 

комбинации

 

в

 

выходную

Шиф

-

ртекстом

 

является

 

результат

 

работы

  (

выход

тридцать

 

второго

 

цикла

подвергнутый

 

очень

 

простому

 

дополнительному

 

преобразованию

Процесс

 

шифрования

 

в

 

режиме

 

простой

 

замены

 (

рис

. , 

который

 

обозначим

 

через

 

T = 

ГОСТ

(S)

 

можно

 

представить

 

в

 

виде

 

последовательности

 34 

блоков

 

u = (U

–2

, U

–1

, U

0

U

1

, U

2

, …, U

30

, U

31

)

где

 

U

-1

||U

0

 = S 

и

 U

31

||U

30

 = T

Здесь

 

U

-1

||U

— 

результат

 

работы

 

цикла

 

0

U

0

||U

— 

результат

 

работы

 

цикла

 

1

 

и

 

т

.

д

до

 

U

31

||U

30

 — 

результата

 

работы

 

цикла

 

31

Дополнительное

 

преобразование

 

меняет

 

по

-

рядок

 

следования

 

блоков

U

31

||U

30

 

= T

На

 

цикле

 

i

 

используется

 

подключ

 

X

t(i)

При

 

шифровании

 

используется

 

следующая

 

последовательность

 

выбора

 

подключей

 

от

 

начального

 

и

 

до

 

последнего

 

цикла

t(i) = {0,1,2,3,4,5,6,7; 0,1,2,3,4,5,6,7; 0,1,2,3,4,5,6,7; 7,6,5,4,3,2,1,0}

 

При

 

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

 

используется

 

обратный

 

порядок

 

следования

 

подключей

В

 

режиме

 

гаммирования

 

последовательность

 64-

битовых

 

комбинаций

 

гаммы

 

имеет

 

вид

γ

ГОСТ

(

φ

(

σ

K–1

))

k = 1, 2, ...

где

 

σ

0

 = 

ГОСТ

(S)

При

 

этом

 

для

 

s

1

||s

2

 

φ

(

σ

)

 

со

-

стоит

 

из

 

двух

 

блоков

s

º

 c

1

, s

2

 + c

2

.

Здесь

 

сложение

 

с

 

c

2

 

производится

 

по

 

mod 2

32

а

 

s

º

 

c

= s

1

 + c

1

 mod(2

32

 – 1)

 

за

 

исключением

 

случая

 

s

º

 c

1

, s

2

 + c

2

когда

 

результат

 

прини

-

background image

424

     

Глава

 18. 

Криптографическая

 

защита

 

 

мается

 

равным

 

2

32

 – 1

Шестнадцатеричное

 

представление

 

c

1

 

и

 

c

2

соответственно

сле

-

дующее

х

01010101

 

и

 

х

01010104

В

 

режиме

 

гаммирования

 

с

 

обратной

 

связью

 

γ

ГОСТ

(S)

γ

k+1 

ГОСТ

(

γ

 t

k

)

k = 1, 2, …, t

 — 

комбинация

 

открытого

 

тек

-

ста

 

Рис

. 18.9.

 

Цикл

 

шифрования

 

в

 

режиме

 

простой

 

замены

 

Пример

 

реализации

 

алгоритма

 

ГОСТ

 

представлен

 

в

 

листингах

 18.5 

и

 18.6 (

компиля

-

тор

 — Microsoft Visual C 6.0). 

Листинг

 18.5.

 

Пример

 

реализации

 

алгоритма

 

ГОСТ

 

на

  

языке

 C++ 

в

 

виде

 

библиотечного

 

класса

 (

библиотека

 Crypto++ 5.1) 

#include "pch.h" 
#include "gost.h" 
#include "misc.h" 
 

Продолжение

 

листинга

 18.5

 

NAMESPACE_BEGIN(CryptoPP) 
 
// S-

блоки

 

const byte GOST::Base::sBox[8][16]={ 
  {4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3}, 

background image

Стандарт

 

криптографического

 

преобразования

 

данных

 

ГОСТ

 28147-89     

425

 

  {14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9}, 
  {5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11}, 
  {7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3}, 
  {6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2}, 
  {4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14}, 
  {13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12}, 
  {1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12}}; 
 
bool GOST::Base::sTableCalculated = false; 
word32 GOST::Base::sTable[4][256]; 
 
void GOST::Base::UncheckedSetKey(CipherDir direction, const 
byte *userKey, unsigned int length) 

  AssertValidKeyLength(length); 
  PrecalculateSTable(); 
  GetUserKey(LITTLE_ENDIAN_ORDER, key.begin(), 8, userKey,  
             KEYLENGTH); 

 
void GOST::Base::PrecalculateSTable() 

  if (!sTableCalculated) 
  { 
    for (unsigned i = 0; i < 4; i++) 
      for (unsigned j = 0; j < 256; j++)  
      { 
        word32 temp = sBox[2*i][j%16] | (sBox[2*i+1][j/16] << 4); 
        sTable[i][j] = rotlMod(temp, 11+8*i); 
      } 
    sTableCalculated=true; 
  } 

 
#define f(x)  ( t=x,                        \ 
        sTable[3][GETBYTE(t, 3)] ^ sTable[2][GETBYTE(t, 2)]  \ 

Продолжение

 

листинга

 18.5

 

        ^ sTable[1][GETBYTE(t, 1)] ^ sTable[0][GETBYTE(t, 0)]  

 
typedef BlockGetAndPut<word32, LittleEndian> Block; 

Источник: https://files.student-it.ru/previewfile/16073