Глава 8. Безопасный канал общения
в виде 32-битового целого числа, в котором наименее значимый байт записы-
вается первым.
8.4
Детали реализации
Пришло время перейти к обсуждению деталей реализации безопасного
канала общения. Для удобства наш канал общения определен как двуна-
правленный, чтобы в обоих направлениях можно было использовать один
и тот же ключ. Если определить канал общения как однонаправленный, обя-
зательно найдется кто-нибудь, кто использует в обоих направлениях один
и тот же ключ и полностью разрушит безопасность системы. Определение
канала общения как двунаправленного снижает риск возникновения подоб-
ной ситуации.
Для описания наших алгоритмов будем использовать псевдокод, понят-
ный всем, кто хоть немного знаком с соглашениями, принятыми в языках
программирования. Блоки операторов будут выделяться с помощью отсту-
пов и парных ключевых слов наподобие
if
/
fi
или
do
/
od
.
8.4.1
Инициализация
Первый алгоритм, представленный в этой главе, — это инициализация
параметров канала общения. Она состоит из двух основных функций: уста-
новка ключей и установка номеров сообщений. Ключ канала общения будет
выступать в качестве источника для генерации четырех дочерних ключей:
ключа шифрования и ключа аутентификации, которые будут применяться
для отправки сообщений пользователем А пользователю Б, а также ключа
шифрования и ключа аутентификации, которые будут применяться для от-
правки сообщений пользователем Б пользователю А.
функция
InitializeSecureChannel
вход:
K
Ключ канала общения, 256 бит.
R
Роль. Указывает, кем является участник — пользователем А
или Б.
выход:
S
Состояние безопасного канала общения.
Вначале построим четыре дочерних ключа. Это будут четыре строки
ASCII без фиксированной длины и нуль-терминаторов.
KeySendEnc
←
SHA
d
−
256(
K
k
“Шифрование от А к Б”
)
KeyRecEnc
←
SHA
d
−
256(
K
k
“Шифрование от Б к А”
)
KeySendAuth
←
SHA
d
−
256(
K
k
“Аутентификация от А к Б”
)
KeyRecAuth
←
SHA
d
−
256(
K
k
“Аутентификация от Б к А”
)
8.4. Детали реализации
143
Поменяем местами ключи шифрования и дешифрования, если участ-
ник — пользователь Б.
if
R
= “Пользователь Б”
then
swap(KeySendEnc, KeyRecEnc)
swap(KeySendAuth, KeyRecAuth)
fi
Установим значения счетчиков отправленных и полученных сообще-
ний равными 0. Счетчик отправленных сообщений — это номер
последнего отправленного сообщения. Счетчик полученных сообще-
ний — это номер последнего полученного сообщения.
(MsgCntSend, MsgCntRec)
←
(0
,
0)
Зафиксируем состояние.
S ←
(
KeySendEnc,
KeyRecEnc,
KeySendAuth,
KeyRecAuth,
MsgCntSend,
MsgCntRec
)
return
S
У нас есть еще одна функция, которая уничтожает значение состояния
S
.
Мы не будем рассматривать ее реализацию более подробно. Все, что требу-
ется от данной функции, — это очистить и высвободить память, в которой
хранится переменная
S
. Обратите внимание на слово “очистить” — это очень
важный момент. Во многих системах функция высвобождения памяти не обя-
зательно очищает ее, поэтому по окончании использования состояния
S
его
необходимо удалить явно.
8.4.2
Отправка сообщения
Рассмотрим, какие действия необходимо выполнить, чтобы отправить со-
общение. Алгоритм отправки сообщения принимает на вход состояние сеанса,
сообщение, которое должно быть отправлено, и дополнительные данные, ко-
торые должны быть аутентифицированы, а выдает сообщение, зашифрован-
ное вместе со своим аутентификатором и готовое к отправке. Для аутентифи-
кации сообщения у получателя должны быть те же дополнительные данные,
что и у отправителя.
функция
SendMessage
вход:
S
Состояние безопасного сеанса.
m
Сообщение, которое должно быть отправлено.
144
Достарыңызбен бөлісу: |