ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.06.2021

Просмотров: 3551

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
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;