ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.06.2021
Просмотров: 3551
Скачиваний: 3
Стандарт
шифрования
данных
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"
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-
Стандарт
криптографического
преобразования
данных
ГОСТ
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
—
результат
работы
цикла
0
,
U
0
||U
1
—
результат
работы
цикла
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
=
ГОСТ
(
φ
(
σ
K–1
))
,
k = 1, 2, ...
,
где
σ
0
=
ГОСТ
(S)
.
При
этом
для
s
1
||s
2
φ
(
σ
)
со
-
стоит
из
двух
блоков
:
s
1
º
c
1
, s
2
+ c
2
.
Здесь
сложение
с
c
2
производится
по
mod 2
32
,
а
s
1
º
c
1
= s
1
+ c
1
mod(2
32
– 1)
за
исключением
случая
s
1
º
c
1
, s
2
+ c
2
,
когда
результат
прини
-
424
Глава
18.
Криптографическая
защита
мается
равным
2
32
– 1
.
Шестнадцатеричное
представление
c
1
и
c
2
,
соответственно
,
сле
-
дующее
:
х
01010101
и
х
01010104
,
В
режиме
гаммирования
с
обратной
связью
γ
1
=
ГОСТ
(S)
,
γ
k+1
=
ГОСТ
(
γ
k
⊕
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},
Стандарт
криптографического
преобразования
данных
ГОСТ
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;