Данный проект представляет собой реализацию клиентского и сервервного приложений, которые обмениваются сообщениями, вводимыми с клавиатуры. Всё общение происходит по защищённому каналу связи (обеспечивается как аутентификация, так и шифрование и целостность), который строится поверх обычных сокетов.
Дополнительно реализовано приложение для атаки Man-in-the-middle (человек посередине) на имеющуюся клиент-серверную архитектуру.
Ознакомиться с практическими методами шифрования и защиты данных, освоить навык написания клиент-серверных приложений и работы с сокетами.
- С помощью протокола TLS библиотеки libssl. Поддерживатся использование серверного сертификата.
- Более низкоуровневая реализация, где весь протокол установления защищённого канала связи и шифрования данных написан вручную с помощью криптографических методов библиотеки libcrypto.
- Операционная система Linux
- Установленные библиотеки libssl, libcrypto и математические функции из math.h.
Обе библиотеки libssl и libcrypto находятся в составе проекта OpenSSL (см. https://www.openssl.org/). При разработке я использовал версию 3.0:
vselenaya@computer:~$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
Далее будут подробно описаны обе реализации.
Реализация находится в директории tls
. В директории находится Makefile
для сборки проекта через утилиту make.
Для тех, кому лень читать подробно, кратко тут:
- Сгенерировать сертификат и закрытый ключ сервера:
make cert_server
- Команда
make project
создаёт 3 программы:client
иserver
- это клиент и сервер, а такжеmim
- программа для атаки MIM. - Для обычного защищённого общения нужно запустить сначала сервер:
./server
, а потом клиент:./client
- Для тестирования скорости работы, запускаем
./server test_speed
, а потом./client test_speed
- Для демонстрации атаки MIM, нужно сгенерировать сертификат и закрытый ключ приложения mim -- это делается через
make cert_mim
, а потом подменить в коде клиента порт и сертификат сервера на соотвествующие у mim. Далее запускаем в порядке:./server
,./mim
,./client
.
├── include/ # Директория с заголовочными файлами
└── common.h
├── src/ # Директория с исходным кодом
├── client.c # Код клиентского приложения
├── server.c # Код серверного приложения
├── mim.c # Код приложения для атаки MIM
└── common.c # Общие функции
├── obj/ # Директория c объектными файлами
├── client.o
├── server.o
├── mim.o
└── common.o
├── client # Три исполняемых файла: клиент, сервер и приложение mim
├── server
├── mim
├── mim_cert.pem # Файл сертификата приложения mim
├── mim_private.key # Файл закрытого ключа приложения mim
├── server_cert.pem # Файл сертификата сервера
├── server_private.key # Файл закрытого ключа сервера
└── Makefile # Файл для сборки проекта через утилиту make
Изначально в проекте директории obj/
и файлов client
, server
, mim
нет: они появится после сборки проекта через Makefile
.
Файлы сертификатов и закрытых ключей тоже нужно генерировать через make
.
Клиент подключается к северу по обычному TCP-соединению. Далее поверх этого соединения используется TLS-протокол, через который происходит аутентификация сервера (с помощью сертификата), а также обмен сообщениями (конфиденциальность и целостность протокол TLS обеспечивает). Сообщения клиент и сервер по очереди вводят с клавиатуры.
Чтобы клиент мог убедиться, что он действительно общается с настоящим сервером (то есть, что никто не перехватил соединение и не притворяется сервером), сервер должен подтвердить свою подлинность (это называется аутентификация). В протоколt TLS это делается с помощью сертификата -- специального файла, состоящего из некоторого описания сервера (например, его имени url и открытого ключа) и подписи этого описания.
Эта подпись в сертификате обычно делеается закрытым ключом специального центра сертификации (CA), а подтверждается подпись, соответственно, парным открытым ключом этого же CA. Этот открытый ключ находится в сертификате CA -- такие сертификаты называются корневыми и по умолчанию установлены в операционной системе (мы им доверяем по умолчанию).
Тогда клиент, получая такой сертификат, проверяет подпись (с помощью коревого сертификата) и, если она правильная, то клиент может быть уверен в достоверности предоставленного сертификата, а именно, что у сервера с данным url будет именно такой открытый ключ. Зачем так сложно? Это делается для того, чтобы в операционной системе не пришлось хранить открытые ключи для каждого url, а достаточно лишь хранить несколько корневых сертификатов и ими прверять остальные. А зная открытый ключ, можно проверить, что тот, с кем клиент общается, является обладателем парного зарытого ключа (тут везде используется криптография с парой открытый-закрытый ключ) -- например, просто получить случайный текст и его подпись от сервера.
То есть аутентификация сервера проводится в два этапа: сначала сервер даёт сертификат (разумеется url, указанный в сертфикате клиент сразу сверяет с тем, куда он хочет подключиться (и если несовпадает, то обрывается соединение)) и клиент его проверяеят. После этого клиент уверен, что у сервера с таким (как в сертификате) url-адресом будет такой открытый ключ, но остаётся проверить, что сервер не просто дал чужой сертификат. Для этого нужно проверить, что у сервера есть закрытый ключ -- парный к тому, что указан в сертификате (тогда это будет означать, что сервер и правда является обладателем сертификата, а зачит его адрес действительно совпадает с указанным в сертификате url -- то есть клиент подключился к тому серверу, который нужен).
Короче, протокол TLS всё сделает автоматически.
Однако, чтобы тут не возиться с корневыми сертификатами, мы делаем так называем самоподписанный сертификат: сертификат сервера подписывается закрытым ключом этого же сервера. Тогда для проверки сертификата достаточно знать открытый ключ сервера (он, конечно, написан в предоставленном сервером сертификате, но так как мы ещё не проверили его, этот ключ нужно знать заранее). Для этого мы просто подсовываем клиенту заранее целиком весь сертификат сервера (а клиент из него возьмёт только открытый ключ для проверки подписи предоставляемого сервером сертфииката: то есть в данном случае сертификат сервера выступает в роли корневого для самого себя). Это никак не портит безопасность, но на практике делают через CA, так как непонятно, как безопасно (без возможности подмены) клиент может узнать сертификат сервера без CA (в данном случае мы этот сертификат, можно сказать, вписываем вручную на стороне клиента, но на практике серверов слишком много и все их сертификаты не сохранить)... а вот сертификатов CA не так много -- их заранее сохраняют в операционной системе.
Это было про аутентификацию сервера. Клиент тоже может подтверждать свою подлинность с помощью сертификата, но обычно это делается с помощью логина-пароля уже на этапе общения между клиентом и сервером.
Это была идея аутентификации в протколе TLS... То, насколько важен сертификат, можно убедиться с помощью атаки MIM (Man-in-the-middle).
Как было сказано, для аутентификации сервера, нужно сгенерировать закрытый ключ сервера (его будет знать только сервер) и самоподписанный (то есть подписанный этим же закрытым ключом) сертификат сервера (его сервер будет посылать клиенту для аутентификации и его же заранее будет иметь клиент у себя, чтобы вытащить из него открытый ключ и им проверить присланный якобы от сервера сертификат).
Это можно сделать через команду make cert_server
(внутри используются команды openssl).
Для сборки проекта, можно воспользоваться командами: make client
и make server
. Они соберут исполняемые файлы client
клиента и server
сервера.
- Сначала нужно запустить серверное приложение:
./server
. После этого сервер начнёт ждать подключения от клиента. - Далее запускаем (в отдельном окне терминала Linux) клиентское приложение:
./client
. - Если всё настроено правильно и сертификат правильный, то TLS-подключение создастся автоматически. После этого у клиента появится приглашение к вводу сообщения для сервера.
- Далее, начиная с клиента, сервер и клиент могут обмениваться сообщениями по сети, вводя их с клавиатуры. При этом безопасность общения обеспечивается протколом TLS. Заметим, что сообщения отправляются по очереди: сначала клиент отправляет (а сервер просто ждёт и ничего не пишет), затем сервер получает и пишет ответ (до получения овтета клиент ждёт и ничего не пишет).
- Для прекращения диалога, клиент или сервер вводят сообщение EXIT. При этом клиентское приложение завершает работу, а серверное заканчивает диалог с данным клиентом и вновь готов соединяться с новыми клиентами.
Вывод в терминале Linux:
Вывод клиента:
vselenaya@computer:~/socket3$ ./client
ЗАПУСК КЛИЕНТА
=============
Контекст клиента для работы ssl загружен...
Есть соединение с сервером...
Соединение с TLS_AES_256_GCM_SHA384 криптографией...
Сертификат сервера успешно принят:
Сертификат подключенного собеседника
Subject: /C=RU/ST=Some-State/L=SPB/O=SPBU_NET/CN=localhost
Issuer: /C=RU/ST=Some-State/L=SPB/O=SPBU_NET/CN=localhost
=== TLS соединение успешно установлено ===
Введите сообщение для сервера (EXIT - выход):
Привет!
--> Отправили сообщение для сервера
Ответ сервера:
Привет! Как дела?
Введите сообщение для сервера (EXIT - выход):
Неплохо! Реши задачку, пожалуйста: 123+45=?
--> Отправили сообщение для сервера
Ответ сервера:
Хммм, кажется 168
Введите сообщение для сервера (EXIT - выход):
Ага, правильно!
--> Отправили сообщение для сервера
Ответ сервера:
Здорово. Давай тогда пока)
Введите сообщение для сервера (EXIT - выход):
EXIT
vselenaya@computer:~/socket3$
Вывод сервера:
vselenaya@computer:~/socket3$ ./server
ЗАПУСК СЕРВЕРА
=============
Контексты и сертификаты сервера для работы ssl загружены...
Серверный сокет открыт...
Ждём клиентов...
Принято соединение от клиента: 127.0.0.1:45032
Соединение с TLS_AES_256_GCM_SHA384 криптографией...
=== TLS соединение успешно установлено ===
...ждём сообщений от клиента...
Cообщение от клиента:
Привет!
Введите сообщение клиенту (EXIT - выход)...
Привет! Как дела?
---> сообщение клиенту отправлено
Cообщение от клиента:
Неплохо! Реши задачку, пожалуйста: 123+45=?
Введите сообщение клиенту (EXIT - выход)...
Хммм, кажется 168
---> сообщение клиенту отправлено
Cообщение от клиента:
Ага, правильно!
Введите сообщение клиенту (EXIT - выход)...
Здорово. Давай тогда пока)
---> сообщение клиенту отправлено
Клиент завершил диалог.
Ждём клиентов...
Проект позволяет протестировать скорость создания TLS-соединения и скорость отправки сообщений. Для этого необходимо запустить сервер и клиент с параметром test_speed
. В этом случае сервер выключит вывод всех функций (чтобы не засорять вывод огромным количеством справочной информации), а клиент замерит скорость создания TLS-соединения с сервером, а также скорость обмена парой сообщений (время между началом отправки сообщения на сервер и окончанием получения ответа от сервера (при тестировании скорости сервер работает в режиме эхо: то есть посылает клиенту те же сообщения, что клиент отправил ему; клиент же посылает случайно сгенерированные сообщения)).
Количество итераций тестирования задаётся параметром TEST_ITERS
в файле common.h
. Аккуратнее: при тестировании скорости создания соединения в коде есть sleep на 1.5 секунды (чтобы дождаться завершения соединения на сервере). Поэтому время тестирования скорости соединения будет как минимум
Вывод сервера:
vselenaya@computer:~/socket3$ ./server test_speed
Запуск в режиме тестирование скорости
(вывод всех дальнейших функций отключён)
vselenaya@computer:~/socket3$
заметим, что в данном режиме по окончании тестирования, сервер тоже завершает работу.
Вывод клиента:
vselenaya@computer:~/socket3$ ./client test_speed
Начинаем тестирование скорости...
Скорость создания TLS-сессии:
средняя скорость: 0.007788
стандартное отклонение: 0.001721
количество итераций: 100
Скорость обмена парой сообщений (длины 1000 байт):
средняя скорость: 0.000263
стандартное отклонение: 0.000025
количество итераций: 100
vselenaya@computer:~/socket3$
под скоростью имеется в виду время - в секундах.
Под атакой MIM (Man-in-the-middle или человек посередине) подразумевается атака, при которой некоторое приложение встаёт между клиентом и сервером. Это приложение незаметно подменяет сервер для клиента и клиента для сервера (то есть mim является одновременно и клиентом, и сервером - и, конечно, у него есть свой сертификат). Таким образом, клиент и сервер думают, что общаются друг с другом, а на самом деле они общаются через приложение mim, которое может читать все сообщения (нарушается конфиденциальность), может видоизменять, удалять добавлять новые и так далее (нарушается целостность). Именно сертификат сервера должен защищать от такой атаки клиента (сервера от этого защищает аутентификация, например, по логину-паролю клиента).
В данном проекте эта атака реализована следующим образом: клиент подключается к приложению mim, а приложение mim подключается к серверу. Далее общение клиента и сервера происходит как и ранее, но теперь приложение mim выводит на экран каждое сообщение и предоставляет возможность изменить его.
Клиент может попасться на атаку MIM только, если он ошибочно примет за настоящий сервер приложение mim. Как мы знаем, в нашей реализации аутентификация сервера производится с помощью открытого ключа, находящегося в сертификате, который заранее знает клиент. Поэтому для реализации атаки MIM, нужно внутри кода клиента подменить сертификат сервера на сертификат mim (в реальном мире атака MIM производится если, например, у пользователя был установлен чужеродный корневой сертификат, который подтвердит подлинность какого-нибудь сайта мошенников вместо настоящего сайта...).
А также, конечно, необходимо явно указать в коде клиента адрес приложения mim, к которому подключаться (в реальности адрес, к которому подключается пользователь подменяется или подменой DNS-ответа, или же просто специальной настройкой маршрутизаторов, которые ведут запрос на сайт мошенников).
Итак, для реализации атаки MIM в проекте, необходимо:
- Сгенерировать сертификат и закрытый ключ приложения mim:
make cert_mim
. После этой команды появятся файлыmim_cert.pem
(сам сертификат) иmim_private.key
(приватный ключ - его знает и использует только само приложение mim). - Собрать приложение:
make mim
-- эта команда скомпилирует программуmim
, которое и будет реализовыввать атаку MIM. - Подменить явно в коде клиента (в файле
client.c
) адрес (а точнее - доменное имя) сервера на адрес mim (при запуске на одном и том же компьютере mim будет работать по адресуlocalhost
; порт, на котором будет запущен mim (если в его код не вносились изменения) - это9091
).
Для этого нужно заменить строки21-23
файлаclient.c
с таких:
#define SERVER_ADDR "localhost" // адрес, где работает сервер
#define SERVER_PORT 4433 // порт, где рабоатет сервер
#define CERT_FILE "server_cert.pem" // сертификат сервера (по открытом ключу этого сертификата проверяется подлинность сервера)
на такие:
#define SERVER_ADDR "localhost" // адрес mim
#define SERVER_PORT 9091 // заменили порт, куда подключаться клиенту, на порт mim
#define CERT_FILE "mim_cert.pem" // явно указали сертификат mim
- После изменения кода клиента, нужно не забыть перекомпилировать:
make client
- Запускаем сначала сервер:
./server
, затем приложение mim:./mim
, и потом клиент:./client
.
Вывод в терминале Linux
Вывод сервера:
vselenaya@computer:~/socket3$ ./server
ЗАПУСК СЕРВЕРА
=============
Контексты и сертификаты сервера для работы ssl загружены...
Серверный сокет открыт...
Ждём клиентов...
Принято соединение от клиента: 127.0.0.1:44722
Соединение с TLS_AES_256_GCM_SHA384 криптографией...
=== TLS соединение успешно установлено ===
...ждём сообщений от клиента...
Cообщение от клиента:
Привет! Реши пример 100+20=?
Введите сообщение клиенту (EXIT - выход)...
Привет! Ответ 120
---> сообщение клиенту отправлено
Cообщение от клиента:
А вот и неверно!
Введите сообщение клиенту (EXIT - выход)...
EXIT
Ждём клиентов...
Вывод клиента:
vselenaya@computer:~/socket3$ ./client
ЗАПУСК КЛИЕНТА
=============
Контекст клиента для работы ssl загружен...
Есть соединение с сервером...
Соединение с TLS_AES_256_GCM_SHA384 криптографией...
Сертификат сервера успешно принят:
Сертификат подключенного собеседника
Subject: /C=RU/L=SPb/O=SPbU/CN=spbu.ru
Issuer: /C=RU/L=SPb/O=SPbU/CN=spbu.ru
=== TLS соединение успешно установлено ===
Введите сообщение для сервера (EXIT - выход):
Привет! Реши пример 100+20=?
--> Отправили сообщение для сервера
Ответ сервера:
Не хочу решать пример!
Введите сообщение для сервера (EXIT - выход):
Ну и не надо. Я обиделся.
--> Отправили сообщение для сервера
Сервер закончил диалог.
vselenaya@computer:~/socket3$
Как можно заметить, клиент получил сообщения не те, которые отправлял сервер. Дело в mim, который напакостил и обидел клиента...
Вывод mim:
vselenaya@computer:~/socket3$ ./mim
MIM удалось подключиться к серверу!
Сертификат подключенного собеседника
Subject: /C=RU/ST=Some-State/L=SPB/O=SPBU_NET/CN=localhost
Issuer: /C=RU/ST=Some-State/L=SPB/O=SPBU_NET/CN=localhost
TLS-соединение с СЕРВЕРОМ успешно установлено
К MIM подключился клиент: 127.0.0.1:57650!
TLS-соединение с КЛИЕНТОМ успешно установлено
=== MIM-атака готова! ===
КЛИЕНТ пытается отправить серверу сообщение:
Привет! Реши пример 100+20=?
Разрешить передачу (1 или 0)?
1
сообщение не модифицируем.
--> Отправили сообщение для сервера
СЕРВЕР пытается отправить клиенту сообщение:
Привет! Ответ 120
Разрешить передачу (1 или 0)?
0
Введите новое сообщение:
Не хочу решать пример!
--> Отправили сообщение для клиента
КЛИЕНТ пытается отправить серверу сообщение:
Ну и не надо. Я обиделся.
Разрешить передачу (1 или 0)?
0
Введите новое сообщение:
А вот и неверно!
--> Отправили сообщение для сервера
СЕРВЕР завершил передачу.
vselenaya@computer:~/socket3$
данный проект всё же учебный, поэтому тут есть несколько недостатков...
- Размер всех сообщений не должен быть больше
BUFFER_LEN
, который установлен в 1024 байт. - Для отправки/получения сообщений из TLS-сокета, используются просто команды
SSL_read
(аналог командыrecv
в обычном сокете) иSSL_write
(аналогsend
в обычном сокете).
Чтобы сообщения не смешивались, при оправке каждого сообщения сначала отправляется ровно 8 байт числа типаsize_t
: длина последующего сообщения. Тогда при получении мы точно знаем, что сначала идут эти 8 байт, а потом ещё нужно считать сообщение ровно той длины, сколько написано в полученнх 8 байтах. Это общепринятый способ отправки-получения сообщений в реальных приложениях.
Но по-хорошему, при получении сообщений нужно не просто считывать через один вызовSSL_read
илиrecv
, это нужно делать в циклеwhile
(так как отправленные, например, 1024 байта, могут дойти до адресата кусками: сначала 512 байтов, затем 256, затем оставшиеся 256... и всё это адресат должен считать): то есть сначала нужно считывать сокет пока не наберём 8 байтов (в которых лежит длина последующего сообщения), а затем нужно читать из сокета, пока не набеёрм указанную ранее длину сообщения. Конечно, чтобы не зависнуть при чтении из сокета (если данных в сокете нет, то иrecv
, иSSL_write
просто зависнут в ожидании данных... а такое может быть: если клиент отправил случайно данные в неправильном формате, то мы можем недочитать или наоборот ждать данных, которых не будет тд), необходимо установить таймаут на чтение.
Но так как этот проект всё же больше про криптографию, этого не сделано, но можно быстро поправить. - При любых ошибках (неправильный сертификат или отсутсвтие файла...), программа будет просто падать (завершаться с ненулевым кодом возврата, не заботясь об очистке памяти), но во многих случаях информация об ошибке будет выведена. В принципе, это не страшно, так как при завершении программы операционная система сама освободит всю память и закроет все сокеты.
При корректной работе программы утечек памяти быть не должно. - Клиент не проверяет url-адрес в сертификате, который предоставляет сервер. Это не очень хорошо, так как сервер может быть подменём другим сервером, чей сертификат будет подписан закрытым ключом настоящего сервера (и тогда клиент успешно проверит этот сертификат открытым ключом настоящего сервера... тут может возникнуть вопрос, а почему, раз у клиента заранее есть сертификат настоящего сервера, клиент не может просто побитово серить имеющийся у него и предоставленный сертификаты?... в теории может, но протокол TLS относится к зарнее имеющемуся сертификату просто как к корневому, а потому берёт из него только открытый ключ для проверки подписи предоставляемого сертификата). Но проверку url тоже недолго добавлять.
Реализация находится в директории crypto
. В директории находится Makefile
для сборки проекта через утилиту make.
Для тех, кому лень читать подробно, кратко тут:
- Команда
make project
создаёт 2 программы:client
- это программа и для клиента, и для сервера, а такжеmim
- программа для атаки MIM. - Для обычного защищённого общения нужно запустить сначала сервер:
./client server [new_key или old_key]
, а потом клиент:./client client [new_key или old_key]
. - Для тестирования скорости работы, запускаем
./client server test_speed
, а потом./client client test_speed
(перед этим нужно, чтобы ключи сервреа и клиента были созданы и запомнены в client_..._info_... файлах) - Для демонстрации атаки MIM: подменить в коде клиента порт сервера на соотвествующий у mim. Далее запускаем в порядке:
./client server [new_key или old_key]
,./mim [proxy или mim] [new_key или old_key]
,./client client [new_key или old_key]
.
├── include/ # Директория с заголовочными файлами
├── aes.h
├── kex.h
├── keypair.h
├── secure_and_net.h
└── common.h
├── src/ # Директория с исходным кодом
├── aes.c # Функции шифрования и расшифрования сообщений
├── client.c # Код клиентского и серверного приложений
├── common.c # Общие функции
├── kex.c # Код для выработки общего секрета по криптографическому протколу Диффи-Хеллмана ECDH
├── keypair.c # Код для реализации криптографии открытый-закрытый ключ
├── mim.c # Код приложения для атаки MIM
└── secure_and_net.c # Код общих функций безопасной сетевой связи
├── obj/ # Директория c объектными файлами
├── client.o
├── server.o
├── mim.o
└── common.o
├── client # Два исполняемых файла: клиент/сервер и приложение mim
├── mim
├── client_X_info_Y # Несколько файлов такого вида: в них хранится публичный ключ абонента Y,
├── ... # который получает X
├── client_key_pub.pem # Следующие три пары файлов - это пары открытого и закрытого ключей каждого абонента
├── client_key.pem
├── server_key_pub.pem
├── server_key.pem
├── mim_pubkey.pem
├── mim_prikey.pem
└── Makefile # Файл для сборки проекта через утилиту make
Изначально в проекте директории obj/
и файлов client
, mim
нет: они появится после сборки проекта через Makefile
. Файлов client_..._info_...
и ключей тоже изначально нет - они появятся в процессе работы.
В отличие от предыдущей реализации (при помощи TLS), в данном случае клиент и сервер равнозначны: им обоим нужно подтверждать свою подлинность друг другу (в реализации TLS подлинность проверялась только у сервера сертификатом). Это в каком-то смысле упрощает реализацию, так как код сервера и клиента абсолютно одинаковый, кроме создания сокетов... поэтому для запуска используется одна и та же программа client
(просто одна копия работает за сервер, а другая за клиент), но с разными параметрами.
Также, так как клиент и сервер равнозначны, то кого из них называть "клиентом", а кого - "сервером", не так важно. Поэтому в комментариях к коду, а также в выводе информации на экран под "клиентом" имеется в виду та программа, которая запущена на данном компьютере (которая и делает вывод на экран), а под "сервером" - та программа, что удаленно находится. Например, если на компьютере client client ...
, а на компьютере client server ...
, то на
Но в описании проекта (например, в этом файле README) клиентом и сервером называем классическим образом: клиент - тот, кто подключается, сервер - кто ждёт соединения.
Глобально в процессе работы программы есть два этапа:
- Установление защищённого соединения поверх обычного TCP-соединения. Это делается с помощью аутентификации по открытому ключу и создания общего секрета через протокол Диффи-Хеллмана.
- Обмен шифрованными сообщениями. Сообщения вводятся с клавиатуры поочереди, шифруются блочным шифром AES-256 с режимом шифрования CBC, дополняются имитовставкой HMAC и отправляются.
Итак, разберём каждый этап подробнее.
Этап 1 заключается в следующем:
- У каждого пользователя (абонента) - и клиента и сервера - есть имя. Оно конкретно ничего не меняет, а нужно просто для удобства идентификации.
- Каждый абонент (и клиент, и сервер) генерирует пару ключей Ed25519 (открытый и закрытый). Файл с закрытым ключом шифруется (если точее: шифруется, конечно, не файл, а сам ключ - просто сама строчка шифруется) паролем.
- Далее клиент и сервер устанавливают обычное TCP-соединение (через обычные сокеты). После чего они оба передают друг другу свои открытые ключи (это, конечно, происходит по незащищённому каналу связи, но это и неважно, так как потом, уже после установления защищённого соединения эти ключи будут проверены).
- При первом соединении с неизвестным пользователем
пользователь вручную подтверждает доверие к отрытому ключу, который ему был прислан (чтобы тут избежать атак, необходимо тщательно сверить реальный открытый ключ собеседник с тем, что был прислан... чтобы реализовать такое на практике, можно записать открытый ключ на бумажке на стороне сервера и потом принести её к клиенту и сверить... это, конечно, не так удобно, но по-другому никак - именно поэтому в TLS используются корневые сертификаты, который автоматически подтверждают подлинность ключа).
После этого имя и ассоциированный (который был прислан) открытый ключ пользователя сохраняются, как известные (чтобы при следующем подключении пользователя с этим именем, мы могли просто сверить ключ с сохраненным вариантом, а не сложно по бумажке сравнивать). Сохранение производится в файл с именем видаclient_X_info_Y
, гдеX
- имя клиента,Y
- имя сервера, чей ключ сохраняем (такие файлы мы кратко называем info).
Если же соединение с известным пользователем (идентификация по имени, которое прислано в начале - то есть если info-файл с этим именем найден), то ключ проверяется на совпадение с сохраненным. Если ключ совпадает, соединение продолжает устанавливаться. При изменении открытого ключа известного пользователя выдается соответствующее предупреждение с возможностью подтвердить изменение ключа (и тут снова нужно бежать с бумажкой сверять ключ).
Казалось бы, ведь имя можно спокойно подделать, так как оно передаётся по незащищённому каналу. Но это неважно, имя используется лишь для поиска сохранённого открытого ключа (чтобы вручную не сверять), но мы всё равно будем его проверять.
Просто получается, что если у нас появляется новый пользователь (с новым именем), мы в любом случае бежим с бумажкой проверять реальный открытый ключ пользователя (а заодно и его имя), с которым хотим соединиться - и если всё совпадает, то только тогда продолжаем соединение и сохраняем присланный ключ в файл. Таким образом, среди сохранённых открытых ключей в info-файлах у нас есть биекция между открытым ключом и именем пользователя (это как с сертификатами в TLS, которые подтверждают, что у такого url такой-то открытый ключ).
В итоге, единственный вариант, когда нам не надо бежать с бумажкой сверять реальный севрер - это когда присланные имя и открытый ключ пользователя совпадают с сохраннным в info-файле (если не совпадает имя, это будет новый пользователь (значит высветится просьба подтвердить открытый ключ - и мы пойдем сверять), если не совпадёт открытый ключ, высветится информация об изменении открытого ключа (и мы снова пойдём сверять)). Но в этом случае пользователю придётся этот открытый ключ подтверждать - и если он подтвердит, то всё в порядке, ведь мы точно знаем, что хотим соединиться с таким-то сервером (имя которого было прислано), а его открытый ключ мы уже когда-то сверяли и сохранили в файле... раз ключ подтверждён, значит именно с этим сервером мы и соединяемся.
Смысл пункта 4 аналогичен проверке сертификатов в TLS: необходимо сопоставить сервер, с которым мы хотим общаться, с его открытым ключом. То есть после этого пункта мы точно знаем, что у сервера (с которым мы хотим соединиться) именно такой открытый ключ, как нам был прислан. Тут, конечно, остаётся опасность, что кто-то перехватил соединение и просто прислал тот же открытый ключ, что у сервера. Но эту опасность мы отбросим, когда проверим этот открытый ключ (проверим, что у того, к кому мы подключились, есть парный закрытый ключ - и если у него он есть, значит мы подключились к правдивому обладателю открытого ключа - то есть к нужному серверу). - Далее начинает работать протокол Диффи-Хеллмана (ECDH): пользователи генерируют у себя по паре ключей (открытый и закрытый), а потом обмениваются лишь открытыми ключами. После чего каждый имеет у себя оба открытых и свой закрытый ключ. Из них генерируется общий (одинаковый и у севрера, и у клиента) секрет. Всё это происходит по открытому каналу, но всё равно получается общий секрет, так как посторонние не знают ни один закрытый ключ. Из этого общего секрета генерируются все необходимые ключи (которые будут одинаковы у обоих, так как секрет общий): ключ для шифрования сообщений AES-256 (32 байта), инициализационный вектор IV (40 байт), секрет для создания имитовставки HMAC, SHA-256 (40 байт).
- Далее каждый пользователь генерирует случайное сообщение (длины 128 байтов, например) и подписывает его своим закрытым ключом (который в пункте 2 получали). После чего отправляет сообщение и подпись собеседнику. При отправке и сообщения, и подписи, они шифруются и снабжаются имитовставкой HMAC.
Пользователь (клиент), получив сообщение и подпись от своего собеседника (сервера), проверяет подпись по открытому ключу, который был получен в пункте 3. Если подпись верна, значит собеседник действительно обладает закрытым ключом, парным тому открытому, который был прислан пользователю. А так как открытый ключ как раз соответствует тому серверу, с которым мы хотим связаться (в этом мы убеждаись в пункте 4, где бегали с бумажкой и сверяли, что у нужного нам сервера действительно такой открытый ключ), то значит всё это время мы общались с настоящим сервером, с которым и хотим связаться.
Из двух случайных сообщений клиента и сервера создаётся идентификатор (ID) сессии. Он нужен для безопасности, чтобы предотвратить какие-нибудь атаки на основе накопленных данных за разные сессии, ведь у разных сессий разны ID.
По итогу данного пункта пользователи убеждаются в достоверности друг друга. С этого момента защищённое соединение считается установленным.
После установки соединения, пиры переходят в режим обмена сообщениями (вводимыми с
клавиатуры), пока одна из сторон не инициирует разрыв соединения (введёт сообщение EXIT). То есть начинается Этап 2.
Каждое сообщение, вводимое пользователем с клавиатуры, проходит несколько этапов:
- Шифрование.
Сообщение шифруется блочным шифром AES-256 (ключ для которого был выделен из общего секрета, полученного в ECDH) с режимом шифрования CBC (инициализационный вектор IV для которого также получен из общего секрета).
Этот этап обеспечивает конфиденциальнсоть сообщения. - Создание имитовставки.
Для сообщения генерируется имитовставка HMAC на основе SHA-256. Секрет для генерации HMAC также получен из общего секрета.
Имитовставка - это некоторый отпечаток (отпечаток в том смысле, что по данным его получить легко, а вот из имитовставки узнать что-то о данных почти невозможно; также не имея всех данных нельзя подделать их часть и подделать имитовставку) большого количества данных о сообщении. Она генерируется для того, чтобы сообщение никто не изменил, не удалил или не добавил в канал связи (шифрование это не обеспечивает, так как можно изменить шифротекст (а значит изменить и само сообщение, получающееся после расшифрования), не зная, как он расшифровывается). Всё это называется целостоностью.
При генерации HMAC учитывается само сообщение (чтобы приизменении сообщения, имитовставка это могла показать), секрет HMAC (чтобы никто кроме клиента и сервера не смог создать имитовставку), идентификатор сессии (на всякий случай), номер сообщения в потоке (для сообщений от клиента к севреру и обратно есть два отдельных счётчика - их значения вставляются в имитовставку, чтобы, например, нельзя было бы удалить сообщение из потока незаметно, так как счётчик увеличивает значение с каждым отправленным и полученным сообщением).
Кстати, стоит заметить, что в пункте 6 этапа 1, когда пользователи обмениваются сообщениями с подписями, HMAC считается только от сообщения и секрета (счётчики и другое не добавляется), так как в принципе здесь имитовставка не так нужна, ведь есть подпись сообщения закрытым ключом...
Этот этап обеспечивает целостность сообщения. - Отправка сообщения.
После подготовки шифрованное сообщение и имитовставка к нему отправляются в сеть собеседнику. Собеседник при получении расшифровывает сообщение и проверяет имитовставку (для этого собеседник заново вычисляет имитовставку от расшифрованного сообщения - и если она совпадает с той, что была прислана, значит вторжения в канал коммуникации не было и сообщение дошло без изменения).
Для начала необходимо собрать проект (приложение client
) через Makefile
. Для этого запускается команда make client
.
Теперь у нас есть приложение client
, которое запускается со следующими параметрами:
server
илиclient
- это обязательный параметр, указавыющий в каком режиме запускать приложение (в режиме "сервера" - то есть того, кто ждёт подключение или в режиме "клиента" - того, кто подключается).- Это обязательный параметр, который может принимать одно из 3 значений:
new_key
указывает на то, что нужно генерировать новые.pem
- файлы с отерытым и закрытым ключомold_key
показывает, что можно использовать старые файлы с ключами (если их не будет, то будут сгенерированы новые, как будто указан предыдущий вариант)test_speed
необходим для запуска тестирования скорости соединения и коммуникации (ВАЖНО: этот параметр должен быть указан одновременно и у клиента, и у сервера; также предварительно и у клиента, и у сервера уже должны быть сгенерированы.pem
-файлы с ключами)
only_connection
- это необязательный параметр, который выключает этап обмена сообщениями: пользователь произведёт только этап установления защищённого соединения (этап 1 в описании идеи), после чего соединение завершится.
- Необходимо запустить сервер:
./client server [new_key или old_key]
. После этого сервер будет ждать подключение клиентов. - Далее запускаем (в отдельном окне терминала Linux) приложение в роли клиента:
./client client [new_key или old_key]
. - Если всё настроено правильно, то защищённое соединение создастся автоматически. После этого у клиента появится приглашение к вводу сообщения для сервера.
- Далее, начиная с клиента, сервер и клиент могут обмениваться сообщениями по сети, вводя их с клавиатуры. При этом безопасность общения обеспечивается криптографией. Заметим, что сообщения отправляются по очереди: сначала клиент отправляет (а сервер просто ждёт и ничего не пишет), затем сервер получает и пишет ответ (до получения овтета клиент ждёт и ничего не пишет).
- Для прекращения диалога, клиент или сервер вводят сообщение EXIT. При этом и клиентское, и серверное приложения завершают работу.
Изначально у нас не было никаких .pem
-файлов и никаких client_..._info_...
- файлов.
Вывод в терминале Linux
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client server new_key
Запуск СЕРВЕРА
-----------
Генерируем новую пару открытый-закрытый ключ
---> Серверу отправлено имя bbserv
Сервер прислал своё имя bbcli
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAvp3QNavVMaNP3JuBBLSTkB2qBCyL1XlFkwifaOlQ3Zo=
-----END PUBLIC KEY-----
Подтвердите нового клиента bbcli с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAvp3QNavVMaNP3JuBBLSTkB2qBCyL1XlFkwifaOlQ3Zo=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 5e fc 6d d9 7f 24 ed a3 36 9d 74 07 32 6f 40 03 bd 8a 73 88 a1 1d da bb a2 d3 eb 72 9b 6a 68 ca 18 60 0d 91 40 cb 51 5a 12 dc 98 a9 2b 0c f6 bb 80 ad 05 39 7f 46 12 85 2d 12 62 7a 24 8f da 53
---> Открытый ключ для общего секрета отправлен
Общий секрет: 62 bc 7c f3 09 6d 93 cd 84 bb 57 87 a0 e2 6a 0e 3d c0 94 99 40 b3 d4 f2 94 56 7f 64 9f 65 45 80
AES-256 KEY: 88 5b 2f 01 dc 38 cd 7b 98 a0 64 87 11 8f e4 86 a2 7b 74 fe dd 53 76 94 95 e2 d9 fb 15 2d 04 71
AES-256 IV: 95 6d 98 b0 4d e4 06 6c c8 5b 26 b0 31 80 19 91 33 f4 15 e5 64 61 55 28 59 52 b7 15 0a 83 74 96 90 70 19 48 91 ad 85 35
HMAC SECRET: 95 6d 98 b0 4d e4 06 6c c8 5b 26 b0 31 80 19 91 33 f4 15 e5 64 61 55 28 59 52 b7 15 0a 83 74 96 90 70 19 48 91 ad 85 35
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: dd 86 30 f0 80 b0 52 ab 56 a1 df 04 3e 47 c2 e4 1c a8 e3 48 f0 f6 83 ed 2a 6b 17 24 0a 76 71 27 47 13 fb c6 28 e4 6a b6 ca 90 f5 c5 b3 77 c5 21 a9 e9 41 d1 49 37 e4 14 61 a9 69 94 5f 6d 3a 84 a2 c6 7c f7 15 cc b2 42 1b 64 81 40 f9 c7 25 8a a7 22 da 33 51 2f 05 69 0e e1 da 82 4a 97 28 25 1f 85 1e e6 05 90 c0 72 33 48 b4 79 75 bc b7 1b f6 35 2f c0 56 19 c3 89 d8 27 98 f0 39 fc 38 32
---> и подпись: 4f d9 39 0d 7c 6f 8f d0 e5 f8 29 d7 ff 1a 0b 1e 35 3a 8c 5f ee a9 3a 21 fb e1 6a 4d 66 35 a8 7d 35 f9 d3 05 dc 88 6f 3a 97 5a e1 ca 08 a4 a9 94 8a ce 0f 0a 27 5c 50 c0 94 72 40 ba 49 17 db 03
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 3c 23 3e ba 42 2c ca 4c ea 1b cf 6d bb dc 5f 37 dd c9 13 0c 0a cd 5d be d5 e9 39 bc 05 d4 0b 9c d5 00 24 5d c3 18 47 20 10 6b 5a 15 ad d6 14 3d 4d 19 05 19 9f 10 e4 e0 0d b7 37 2f fa fb 3d e7 97 8d a1 6a 68 50 9b 82 7b 15 11 09 ee 1c 81 72 be a0 7c 1c 39 cf d4 5f 2e b7 2d 67 55 f6 f9 9a ea 51 85 8d 9a a2 33 bb 26 6a 91 a6 72 1a c5 81 c0 60 d9 80 4a b0 f9 83 89 9a 9e 55 64 44 34 65 ce 6b d0 49 b4 fb 1f 90 e8 09 61 6c 60 d0 9b f3
--> и HMAC для этого сообщения: 55 1e b6 40 f8 0b 4d ae 16 22 42 5c 71 59 39 3f 15 88 63 8c 8a 54 8a a4 97 f8 8f 06 67 9d 65 f4
--> Отправили шифрованное сообщение: Ciphertext: 0f 67 5d e6 f4 37 a7 51 28 57 81 34 e5 59 0d d5 4b 12 52 2a 80 bf 5e 54 58 06 9f 2d 6e d9 65 37 cd f8 63 3d ad 64 bf a5 81 74 3b d1 2e 7c eb 3d f7 bd 76 2f 51 d5 7b ea 59 bb 4f 23 03 28 f0 90 05 e7 1c 2e 3a 53 2c 95 a3 2a 53 1a 76 3a 18 03
--> и HMAC для этого сообщения: 48 fb 40 e3 75 d3 7a 9a 0a fb 75 9a da dc a0 1d 52 71 71 bb b5 2d 2b 18 50 e2 7b b2 76 48 65 1c
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
��n��\(كK_����*��]ly:�u�v�M��tʛ����%E����H��>!;�S�GY^S"�?�/:�������bؿ�P��MZ����y��l�=�v��HMAC корректен
r�%���ли=��@M]�9�?g�����dM9HMAC корректенвали: Q�j��9�u�r��D uE�bO�Xw��
========================
Получили от сервера bbcli сообщение: 97 9a 15 b8 d9 86 e8 fd 10 7c aa 87 52 ad 35 0f e8 4c 54 0d fe 13 01 c5 6e 19 a5 de 06 5c 28 d9 83 4b 5f 91 99 a4 b9 2a b1 a8 5d 6c 79 3a 91 75 f9 13 76 a0 4d a3 02 85 74 ca 9b fe a0 fe a1 25 45 0e bb a7 eb a0 e3 48 85 e0 3e 05 21 3b cb 53 c5 47 59 5e 53 22 fe 3f 81 2f 3a f9 ed b9 b0 c3 e7 b3 ca 62 d8 bf d7 1c 50 e8 ec 81 14 4d 5a f4 e7 97 d9 ff 79 bf 8b 6c 90 3d d6 76 05 90 11 8c
и подпись: 51 8b 6a 03 b1 ea 9e 39 87 75 a8 72 b2 f5 7f 13 44 14 09 75 45 ca 62 4f e1 58 77 06 d5 c5 0d 72 8f 69 08 25 eb 16 e4 e7 0f 09 3d e1 93 f8 40 4d 5d d5 39 82 3f 67 84 c1 de db f7 64 4d 14 39 00
=== Подлинность сервера bbcli подтверждена! ===
Соединение установлено, идентификатор сессии: dd 86 30 f0 80 b0 52 ab 56 a1 df 04 3e 47 c2 e4 1c a8 e3 48 f0 f6 83 ed 2a 6b 17 24 0a 76 71 27 47 13 fb c6 28 e4 6a b6 ca 90 f5 c5 b3 77 c5 21 a9 e9 41 d1 49 37 e4 14 61 a9 69 94 5f 6d 3a 84 a2 c6 7c f7 15 cc b2 42 1b 64 81 40 f9 c7 25 8a a7 22 da 33 51 2f 05 69 0e e1 da 82 4a 97 28 25 1f 85 1e e6 05 90 c0 72 33 48 b4 79 75 bc b7 1b f6 35 2f c0 56 19 c3 89 d8 27 98 f0 39 fc 38 32 97 9a 15 b8 d9 86 e8 fd 10 7c aa 87 52 ad 35 0f e8 4c 54 0d fe 13 01 c5 6e 19 a5 de 06 5c 28 d9 83 4b 5f 91 99 a4 b9 2a b1 a8 5d 6c 79 3a 91 75 f9 13 76 a0 4d a3 02 85 74 ca 9b fe a0 fe a1 25 45 0e bb a7 eb a0 e3 48 85 e0 3e 05 21 3b cb 53 c5 47 59 5e 53 22 fe 3f 81 2f 3a f9 ed b9 b0 c3 e7 b3 ca 62 d8 bf d7 1c 50 e8 ec 81 14 4d 5a f4 e7 97 d9 ff 79 bf 8b 6c 90 3d d6 76 05 90 11 8c
==== Диалог ====
Введите сообщение (EXIT - выход):
Добрый день!
--> Отправили шифрованное сообщение: Ciphertext: 93 01 ff aa ca 81 4d bd b3 e9 0c 2e e2 82 b9 ba a3 19 5f c0 73 b5 38 ab c0 15 f4 a4 ec f9 dc e9
--> и HMAC для этого сообщения: a6 f3 98 cb d0 b1 36 0f 1f 29 ca ae 30 9e c0 06 da a3 c2 e1 78 b4 09 69 1d 86 e9 be 79 b6 bc ad
Получили шифрованное сообщение и расшифровали: Привет! Решишь пример 200+30-120? Выглядит сложновато...
HMAC корректен
Введите сообщение (EXIT - выход):
Да, конечно! Ответ 110!
--> Отправили шифрованное сообщение: Ciphertext: 23 f6 03 ba 7c 23 f3 ca b7 d8 46 35 04 99 a5 3b cf ed 37 89 53 7c cc 19 3d 53 b4 d2 7b d3 8b 60 51 a5 7c 07 15 78 a6 1e 06 a7 2d 6d 8a d7 7c 78
--> и HMAC для этого сообщения: 1c 03 fe 20 6b 0d 77 28 52 4d f2 20 f9 05 e0 8f c2 f9 90 5a 60 32 db be c0 8c 63 3e 72 b0 59 4f
Получили шифрованное сообщение и расшифровали: ну как?
HMAC корректен
Введите сообщение (EXIT - выход):
решил-решил
--> Отправили шифрованное сообщение: Ciphertext: 24 31 f4 a8 ce f7 27 ca d1 90 68 86 d9 e8 95 ac 19 af 50 8a 7f d5 df 0a 8c c6 e9 e9 ae f3 86 99
--> и HMAC для этого сообщения: 0d e4 40 bc 15 e9 95 98 61 1f 08 80 f7 ce 69 18 6e 06 03 5f 94 99 f1 d2 31 db 16 05 7f cd 7a 96
Получили шифрованное сообщение и расшифровали: Спасибо!!
HMAC корректен
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Вывод клиента:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client old_key
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Файлы с открытым-закрытым ключом не найдены... генерируем новые
---> Серверу отправлено имя bbcli
Сервер прислал своё имя bbserv
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAYj7LyGbhhlIZIK3NxCM/wEC5oEpjd89M195yIRDHDkM=
-----END PUBLIC KEY-----
Подтвердите нового клиента bbserv с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAYj7LyGbhhlIZIK3NxCM/wEC5oEpjd89M195yIRDHDkM=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 a8 fb 7a f6 c1 88 2a aa ee 32 e4 d6 ac 92 f6 e7 c6 b8 e6 5f 56 ba 52 b7 07 af e7 79 f7 ed 9c 6a 54 68 43 3d 8e d7 cf 50 da 56 12 7d 85 5d e1 2c 35 1e 1c e4 b7 85 01 4f ee 2d 31 82 20 d2 63 b6
---> Открытый ключ для общего секрета отправлен
Общий секрет: 62 bc 7c f3 09 6d 93 cd 84 bb 57 87 a0 e2 6a 0e 3d c0 94 99 40 b3 d4 f2 94 56 7f 64 9f 65 45 80
AES-256 KEY: 88 5b 2f 01 dc 38 cd 7b 98 a0 64 87 11 8f e4 86 a2 7b 74 fe dd 53 76 94 95 e2 d9 fb 15 2d 04 71
AES-256 IV: 95 6d 98 b0 4d e4 06 6c c8 5b 26 b0 31 80 19 91 33 f4 15 e5 64 61 55 28 59 52 b7 15 0a 83 74 96 90 70 19 48 91 ad 85 35
HMAC SECRET: 95 6d 98 b0 4d e4 06 6c c8 5b 26 b0 31 80 19 91 33 f4 15 e5 64 61 55 28 59 52 b7 15 0a 83 74 96 90 70 19 48 91 ad 85 35
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 97 9a 15 b8 d9 86 e8 fd 10 7c aa 87 52 ad 35 0f e8 4c 54 0d fe 13 01 c5 6e 19 a5 de 06 5c 28 d9 83 4b 5f 91 99 a4 b9 2a b1 a8 5d 6c 79 3a 91 75 f9 13 76 a0 4d a3 02 85 74 ca 9b fe a0 fe a1 25 45 0e bb a7 eb a0 e3 48 85 e0 3e 05 21 3b cb 53 c5 47 59 5e 53 22 fe 3f 81 2f 3a f9 ed b9 b0 c3 e7 b3 ca 62 d8 bf d7 1c 50 e8 ec 81 14 4d 5a f4 e7 97 d9 ff 79 bf 8b 6c 90 3d d6 76 05 90 11 8c
---> и подпись: 51 8b 6a 03 b1 ea 9e 39 87 75 a8 72 b2 f5 7f 13 44 14 09 75 45 ca 62 4f e1 58 77 06 d5 c5 0d 72 8f 69 08 25 eb 16 e4 e7 0f 09 3d e1 93 f8 40 4d 5d d5 39 82 3f 67 84 c1 de db f7 64 4d 14 39 00
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 91 ca 3a 34 95 f9 b6 93 ed 04 f4 52 c5 0f 19 b9 f2 79 93 6b 18 14 5f 72 83 05 cf b6 8f f3 03 b5 be 08 f9 e6 eb 6b 68 16 fc 2c 4d 89 b6 e1 26 51 e2 82 96 15 49 5c e3 1a 8d c0 20 40 5a e1 bd bf f5 ff b8 fc ce 20 d8 0d 61 bf 20 f4 ae 74 5b c6 96 4b 35 ac 6d d6 87 0a 52 47 62 7f 2a 11 a2 44 a4 72 92 32 83 a4 2c b2 0d 9d 43 86 a0 77 f0 d5 d0 f3 95 b1 5b 14 26 f6 a7 89 4c e4 67 e7 80 1e 2c e8 0f 57 9e 1f c2 c7 f4 65 69 92 55 53 ae 51
--> и HMAC для этого сообщения: 20 d8 6b 8d 3a 1d 16 f0 cb a8 63 2b 79 af a2 91 b2 06 20 04 90 3c dc 86 56 f1 af 7a e4 cb 9c 39
--> Отправили шифрованное сообщение: Ciphertext: 29 26 4e 13 0c 22 91 49 2e 57 67 aa 6d 88 df cb 5c d5 22 43 7a c1 92 30 f7 6f 29 c5 55 8a a3 11 df 8f 2a c1 90 9e d3 3f 6c cf d8 28 c1 f8 b7 5c 9c 77 e4 87 79 94 07 6e e1 69 b7 27 6c 77 57 8a e4 85 e7 6c ea d4 7a bf 02 91 57 50 c7 31 77 3e
--> и HMAC для этого сообщения: 82 b5 76 61 03 d2 ce c6 f5 30 39 84 0d 28 42 8c 5b 05 a7 ee 5f 72 11 e5 f2 26 ac d7 5b f4 f6 67
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: ݆0���R�V��>G����H����*k$
vq'G��(�j�ʐ�ųw�!��A�I7�a�i�_m:���|�̲B�@��%��"�3Q/i�ڂJ�(%����r3H�yu��5/�VÉ�'��9�82HMAC корректен
|o����)���ифрованное сообщение и расшифровали: O�9
5:�_�:!��jMf5�}5��܈o:�Z������
'\P��r@�I�HMAC корректен
========================
Получили от сервера bbserv сообщение: dd 86 30 f0 80 b0 52 ab 56 a1 df 04 3e 47 c2 e4 1c a8 e3 48 f0 f6 83 ed 2a 6b 17 24 0a 76 71 27 47 13 fb c6 28 e4 6a b6 ca 90 f5 c5 b3 77 c5 21 a9 e9 41 d1 49 37 e4 14 61 a9 69 94 5f 6d 3a 84 a2 c6 7c f7 15 cc b2 42 1b 64 81 40 f9 c7 25 8a a7 22 da 33 51 2f 05 69 0e e1 da 82 4a 97 28 25 1f 85 1e e6 05 90 c0 72 33 48 b4 79 75 bc b7 1b f6 35 2f c0 56 19 c3 89 d8 27 98 f0 39 fc 38 32
и подпись: 4f d9 39 0d 7c 6f 8f d0 e5 f8 29 d7 ff 1a 0b 1e 35 3a 8c 5f ee a9 3a 21 fb e1 6a 4d 66 35 a8 7d 35 f9 d3 05 dc 88 6f 3a 97 5a e1 ca 08 a4 a9 94 8a ce 0f 0a 27 5c 50 c0 94 72 40 ba 49 17 db 03
=== Подлинность сервера bbserv подтверждена! ===
Соединение установлено, идентификатор сессии: dd 86 30 f0 80 b0 52 ab 56 a1 df 04 3e 47 c2 e4 1c a8 e3 48 f0 f6 83 ed 2a 6b 17 24 0a 76 71 27 47 13 fb c6 28 e4 6a b6 ca 90 f5 c5 b3 77 c5 21 a9 e9 41 d1 49 37 e4 14 61 a9 69 94 5f 6d 3a 84 a2 c6 7c f7 15 cc b2 42 1b 64 81 40 f9 c7 25 8a a7 22 da 33 51 2f 05 69 0e e1 da 82 4a 97 28 25 1f 85 1e e6 05 90 c0 72 33 48 b4 79 75 bc b7 1b f6 35 2f c0 56 19 c3 89 d8 27 98 f0 39 fc 38 32 97 9a 15 b8 d9 86 e8 fd 10 7c aa 87 52 ad 35 0f e8 4c 54 0d fe 13 01 c5 6e 19 a5 de 06 5c 28 d9 83 4b 5f 91 99 a4 b9 2a b1 a8 5d 6c 79 3a 91 75 f9 13 76 a0 4d a3 02 85 74 ca 9b fe a0 fe a1 25 45 0e bb a7 eb a0 e3 48 85 e0 3e 05 21 3b cb 53 c5 47 59 5e 53 22 fe 3f 81 2f 3a f9 ed b9 b0 c3 e7 b3 ca 62 d8 bf d7 1c 50 e8 ec 81 14 4d 5a f4 e7 97 d9 ff 79 bf 8b 6c 90 3d d6 76 05 90 11 8c
==== Диалог ====
Введите сообщение (EXIT - выход):
Привет! Решишь пример 200+30-120? Выглядит сложновато...
--> Отправили шифрованное сообщение: Ciphertext: b6 18 09 ff 95 4b 0d 63 60 d0 8f 75 72 cc d3 ee 93 c1 f2 d0 a9 7c 36 ec 2e 41 81 5d b0 59 5a e0 23 d1 41 bd de b0 07 a1 be 46 9f d8 0b 2d 79 33 6b d4 79 bb 61 29 08 74 b0 fc 2a e8 38 79 21 bf c3 c4 ce b9 eb ca ca 14 43 3f df 90 2b 8c 15 40 02 45 b5 97 bb 72 64 c5 91 74 db 46 14 21 40 1a
--> и HMAC для этого сообщения: 96 fa c1 d6 2d 50 f4 77 7c a5 76 66 a2 f6 5b 41 44 8a f8 f8 24 cf fd df 61 91 af 5a 93 f5 fb a2
Получили шифрованное сообщение и расшифровали: Добрый день!
HMAC корректен
Введите сообщение (EXIT - выход):
ну как?
--> Отправили шифрованное сообщение: Ciphertext: f6 ac cc a0 8e 8b a8 58 01 86 f5 92 16 ce ee f6
--> и HMAC для этого сообщения: 10 b2 02 ec c7 ab 53 5e 05 c3 00 67 64 d8 fe 71 b7 90 3b 19 d1 66 67 01 07 d6 98 ef 8b b6 96 ba
Получили шифрованное сообщение и расшифровали: Да, конечно! Ответ 110!
HMAC корректен
Введите сообщение (EXIT - выход):
Спасибо!!
--> Отправили шифрованное сообщение: Ciphertext: a5 15 f2 ea 8a e5 57 58 7e da 52 e9 7f ce ff 15 51 91 1a 41 bf 21 6f 48 4f 7b aa b4 f5 07 19 ef
--> и HMAC для этого сообщения: 38 6b c2 49 f7 72 02 bd c8 f2 da 7e 8e f2 1c 5b 6b c0 ab 00 4e 19 9b 6d 9a ed 0a ab 39 cd 2b 34
Получили шифрованное сообщение и расшифровали: решил-решил
HMAC корректен
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Итак, по итогу запуска, у нас появились 4 файла ключей (первые два - у клиента, вторые - у сервера): client_key_pub.pem
, client_key.pem
, server_key_pub.pem
, server_key.pem
, а также файлы: client_bbcli_info_bbserv
(этот файл появился, где запускался клиент: ./client client ...
) и client_bbserv_info_bbcli
(где сервер).
Теперь попробуем, используя старые ключи ещё раз запустить (будем запускать в режиме only_connection
, чтобы не обмениваться сообщениями) - теперь не придётся подтверждать открытые ключи, так как они уже сохранены в info-файлах.
Вывод в терминале Linux
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client server old_key only_connection
Запуск СЕРВЕРА
-----------
Пара открытый-закрытый ключ остаётся прежней
---> Серверу отправлено имя bbserv
Сервер прислал своё имя bbcli
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAvp3QNavVMaNP3JuBBLSTkB2qBCyL1XlFkwifaOlQ3Zo=
-----END PUBLIC KEY-----
Сервер bbcli найден!
Peer pubkey (ключ данного пира для общего секрета): 04 63 10 71 d3 45 03 c8 99 27 b6 78 0d f6 81 7e eb 5c 49 bd 11 06 66 07 ae 92 26 e3 29 5d 78 59 86 a0 0a 82 68 bd 3b 10 90 31 26 8c 2b 18 f8 63 62 a0 34 01 ef c0 f0 7d ac bc 83 3d c7 75 ac e0 62
---> Открытый ключ для общего секрета отправлен
Общий секрет: 2b 62 be 7b e2 13 4c 0b 90 50 9c 08 e0 3b 39 7d 24 27 14 48 c8 93 41 1d 65 9d 47 14 e8 e9 bf a8
AES-256 KEY: 27 15 53 4a 2b a1 86 83 02 7c c9 01 47 76 91 07 f8 e7 2e 51 47 6a 52 0a c3 74 ac 74 dc 00 98 79
AES-256 IV: fd 5d ff 6f 63 99 9e 55 7c 8c d6 0f eb b8 f9 f5 26 63 ec a5 22 16 50 46 0f 2a 84 5a 10 78 e4 d2 fe 5f 1f c3 f7 a8 62 ab
HMAC SECRET: fd 5d ff 6f 63 99 9e 55 7c 8c d6 0f eb b8 f9 f5 26 63 ec a5 22 16 50 46 0f 2a 84 5a 10 78 e4 d2 fe 5f 1f c3 f7 a8 62 ab
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 5b 26 18 e1 fe 22 f1 84 f1 4d 39 d7 55 28 5c 18 3a 14 44 b7 79 f8 16 5c 98 2d 3d 43 22 fb d1 eb 9a 81 70 97 59 23 4f e1 c0 03 51 0a 03 71 f8 a1 7d 0e 91 32 b8 b0 8c b9 a1 7b f7 8d 64 17 b2 dd 25 e1 87 03 3a 36 99 78 3a ab f6 ca 78 17 d8 c0 70 a5 34 cb 48 50 07 7d 48 3c 6e 73 0c bc 88 e9 35 16 ff a8 11 26 46 b1 6c 39 49 96 85 21 3d 7d 99 89 fa f5 78 de 88 d5 fe 7e e3 7e 35 c5 bd d1
---> и подпись: fd e4 94 c3 1f 40 72 9e 3d 40 79 82 5e ef f7 78 b2 56 e7 6e 80 c2 44 ff ca bc f4 c2 e1 a5 ca 21 ef 8c ac 67 c3 8a 6b 9e ce 98 d0 aa 56 67 0b b2 7f b0 02 51 68 ae ef 83 f5 c9 b8 27 b5 28 76 01
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: f2 81 c1 de d6 ec 53 b7 a2 d8 d1 61 23 fb 0c 07 03 50 ec 76 2d 65 3a eb 82 cb e1 be ea 1f 3b 28 2d a3 83 1f 77 3c 5a 5b 28 c3 d8 72 d4 fb 8d 13 3c b7 e5 7c 0b a9 5d 0d 14 a2 8e 30 16 f6 f6 f2 af 6b 99 a2 59 95 49 38 f7 1c 10 6c e0 98 0c 52 b2 7b b1 92 f3 83 5b 09 47 7f eb 7f 8e 97 e7 69 7c 13 46 a4 a1 ac 53 a9 09 9b 10 85 12 55 b0 9a 75 d3 8c eb c1 e0 85 40 10 60 79 b9 77 d9 09 b1 39 27 c4 c5 95 6a 32 c8 06 50 e3 b6 d3 48 e6 39
--> и HMAC для этого сообщения: 96 a1 1d f1 07 fd d1 c9 be 5c 00 77 a2 eb 4b db 68 0f 5e b6 00 32 9b 6b 2a c8 3b f4 d4 89 b3 37
--> Отправили шифрованное сообщение: Ciphertext: 49 e8 2b 9c d2 2b d5 46 86 19 fa d5 be c6 c6 7f e5 74 9b 81 e9 44 d3 1d 14 88 cf 94 c3 3b bf 18 a0 bc d9 9a 7d 89 24 2d c4 a6 fe cc 77 32 38 02 d4 15 69 c3 e4 fd 8c c8 13 67 22 5d f1 47 28 33 5c f3 2f 2d d3 3b 7a 08 1e e1 f9 98 88 40 3e 8e
--> и HMAC для этого сообщения: a5 c0 91 6b fb d1 55 bc ff 4f 83 e1 09 fa 8f 5c 60 0d 7e 7a b2 b8 85 f9 e7 38 99 52 0a 8f 6c 4c
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: �q;l�<�h"rmln��3#oO�����6}IM����5�OJ�^M˥�խ������Z�jY�i�S�^ٙv~�S˓�
��"��'���tq1n+h�HMAC корректен
Получили шифрованное сообщение и расшифровали: ���
m�Ez!���\a�0�湆�2�g��5D ���a�|h��d���暴�HMAC корректен�}��I
========================
Получили от сервера bbcli сообщение: c3 71 01 18 0f 3b 6c e6 3c fe 68 22 72 6d 6c 01 01 6e 1f b3 8e 33 23 6f 4f bd b6 af 8b 9a 0f 36 7d 49 4d 9c 82 f2 bc d3 35 e5 c2 08 02 64 47 97 78 7a d4 71 b3 8c 34 ba 1c c2 db 8b 8c e2 67 32 dd c8 d7 ce 53 ae 5e d9 99 76 10 7e f0 53 cb 93 ce 0d 0f 18 e3 4f 4a c4 5e 4d cb a5 82 d5 ad ef 8a f0 8f 9b ca e4 15 5a d8 6a 59 94 69 0b a1 95 22 ce 15 02 ab 27 92 95 f9 74 71 31 6e 2b 68 85
и подпись: ac e0 d5 0c 1e 97 66 03 28 85 e1 7d a4 d5 49 0d 6d b1 45 7a 21 1a bf c5 5c 61 98 19 30 9f e6 b9 86 ef 32 d1 67 1b 91 8f 99 13 35 44 0e 09 8e a9 8b 61 d8 7c 68 ba 9f 64 87 cc e7 e6 9a b4 a4 00
=== Подлинность сервера bbcli подтверждена! ===
Соединение установлено, идентификатор сессии: c3 71 01 18 0f 3b 6c e6 3c fe 68 22 72 6d 6c 01 01 6e 1f b3 8e 33 23 6f 4f bd b6 af 8b 9a 0f 36 7d 49 4d 9c 82 f2 bc d3 35 e5 c2 08 02 64 47 97 78 7a d4 71 b3 8c 34 ba 1c c2 db 8b 8c e2 67 32 dd c8 d7 ce 53 ae 5e d9 99 76 10 7e f0 53 cb 93 ce 0d 0f 18 e3 4f 4a c4 5e 4d cb a5 82 d5 ad ef 8a f0 8f 9b ca e4 15 5a d8 6a 59 94 69 0b a1 95 22 ce 15 02 ab 27 92 95 f9 74 71 31 6e 2b 68 85 5b 26 18 e1 fe 22 f1 84 f1 4d 39 d7 55 28 5c 18 3a 14 44 b7 79 f8 16 5c 98 2d 3d 43 22 fb d1 eb 9a 81 70 97 59 23 4f e1 c0 03 51 0a 03 71 f8 a1 7d 0e 91 32 b8 b0 8c b9 a1 7b f7 8d 64 17 b2 dd 25 e1 87 03 3a 36 99 78 3a ab f6 ca 78 17 d8 c0 70 a5 34 cb 48 50 07 7d 48 3c 6e 73 0c bc 88 e9 35 16 ff a8 11 26 46 b1 6c 39 49 96 85 21 3d 7d 99 89 fa f5 78 de 88 d5 fe 7e e3 7e 35 c5 bd d1
vselenaya@computer:~/SecureNet-main/crypto$
Вывод клиента:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client old_key only_connection
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Пара открытый-закрытый ключ остаётся прежней
---> Серверу отправлено имя bbcli
Сервер прислал своё имя bbserv
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAYj7LyGbhhlIZIK3NxCM/wEC5oEpjd89M195yIRDHDkM=
-----END PUBLIC KEY-----
Сервер bbserv найден!
Peer pubkey (ключ данного пира для общего секрета): 04 67 db 1b a2 1a ea 1f 42 6a 93 e4 2f dc 25 58 86 c4 cb 2e ce 1f e9 b4 34 bd e6 a3 b5 9b 8b 5d fb d3 94 45 97 1a c5 ac ea 95 b7 81 7f ab 0a 26 9e 60 aa 01 3b 1a ce 76 16 1b 70 eb b4 c0 a7 97 19
---> Открытый ключ для общего секрета отправлен
Общий секрет: 2b 62 be 7b e2 13 4c 0b 90 50 9c 08 e0 3b 39 7d 24 27 14 48 c8 93 41 1d 65 9d 47 14 e8 e9 bf a8
AES-256 KEY: 27 15 53 4a 2b a1 86 83 02 7c c9 01 47 76 91 07 f8 e7 2e 51 47 6a 52 0a c3 74 ac 74 dc 00 98 79
AES-256 IV: fd 5d ff 6f 63 99 9e 55 7c 8c d6 0f eb b8 f9 f5 26 63 ec a5 22 16 50 46 0f 2a 84 5a 10 78 e4 d2 fe 5f 1f c3 f7 a8 62 ab
HMAC SECRET: fd 5d ff 6f 63 99 9e 55 7c 8c d6 0f eb b8 f9 f5 26 63 ec a5 22 16 50 46 0f 2a 84 5a 10 78 e4 d2 fe 5f 1f c3 f7 a8 62 ab
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: c3 71 01 18 0f 3b 6c e6 3c fe 68 22 72 6d 6c 01 01 6e 1f b3 8e 33 23 6f 4f bd b6 af 8b 9a 0f 36 7d 49 4d 9c 82 f2 bc d3 35 e5 c2 08 02 64 47 97 78 7a d4 71 b3 8c 34 ba 1c c2 db 8b 8c e2 67 32 dd c8 d7 ce 53 ae 5e d9 99 76 10 7e f0 53 cb 93 ce 0d 0f 18 e3 4f 4a c4 5e 4d cb a5 82 d5 ad ef 8a f0 8f 9b ca e4 15 5a d8 6a 59 94 69 0b a1 95 22 ce 15 02 ab 27 92 95 f9 74 71 31 6e 2b 68 85
---> и подпись: ac e0 d5 0c 1e 97 66 03 28 85 e1 7d a4 d5 49 0d 6d b1 45 7a 21 1a bf c5 5c 61 98 19 30 9f e6 b9 86 ef 32 d1 67 1b 91 8f 99 13 35 44 0e 09 8e a9 8b 61 d8 7c 68 ba 9f 64 87 cc e7 e6 9a b4 a4 00
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: ac ea 2d ed 64 3f 1c 5c 2e 4b 27 a4 9c f5 3a e0 13 d5 de 3d 35 d5 10 b6 a9 f7 b2 fb c4 6f 5a 26 e8 a3 49 c4 a9 84 64 04 26 63 c3 ce 9d 5e d3 02 36 ec 39 3c c7 90 09 a7 2e 0b 16 37 33 be 5b 74 89 b6 5f d0 ac d7 cf b3 e2 29 c1 9b 3d 1c 51 28 3f c3 5f c9 f5 43 2e 10 45 ee 30 9b 8a c6 35 a3 8e fe a2 73 a7 97 7b 70 56 06 6a 2a 44 37 99 17 d1 b8 e0 ea 3d 32 6f 6d ef 9c bd e3 89 5d fd a2 de 96 33 2d f5 22 0f 8b 1e 21 1f c4 ae 0a be ab
--> и HMAC для этого сообщения: 2e b0 d3 51 40 6b f1 e0 79 61 2a b4 b2 9b b5 a7 0c f4 45 ee 84 1c e7 81 19 81 c6 c9 ec d7 e3 92
--> Отправили шифрованное сообщение: Ciphertext: ee 76 07 a1 fa 10 d8 5a 5d 99 d4 93 2e d0 ce 14 05 95 9e 42 d7 29 db e2 31 23 fe f4 f9 3e d4 d8 07 e3 a3 e7 1e 9e f6 e5 40 b8 ae 8a 81 50 68 06 c0 ae d3 d0 43 85 09 6c 90 03 0e 6e a4 66 77 ed 25 4a 49 e8 1d f0 c6 5d be 3a c8 ca 6e 73 26 2e
--> и HMAC для этого сообщения: b6 e0 72 1c 91 1b 61 4f f1 83 02 78 84 a5 4c fa 38 d1 d6 d3 ea 09 c1 b1 7d 7e 2c 10 a5 9c 80 55
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: [&��"��M9�U(\:D�y�\�-=C"��뚁p�Y#O��Q
q��}�2�����{��d��%�:6�x:���x��p�4�HP}H<ns
���5��&F�l9I��!=}����xވ��~�~5Ž�HMAC корректен
Получили шифрованное сообщение и расшифровали: ���@r�=@y�^��x�V�n��D�ʼ����!gÊk�ΘЪVg
��Qh���ɸ'�(vHMAC корректен
========================
Получили от сервера bbserv сообщение: 5b 26 18 e1 fe 22 f1 84 f1 4d 39 d7 55 28 5c 18 3a 14 44 b7 79 f8 16 5c 98 2d 3d 43 22 fb d1 eb 9a 81 70 97 59 23 4f e1 c0 03 51 0a 03 71 f8 a1 7d 0e 91 32 b8 b0 8c b9 a1 7b f7 8d 64 17 b2 dd 25 e1 87 03 3a 36 99 78 3a ab f6 ca 78 17 d8 c0 70 a5 34 cb 48 50 07 7d 48 3c 6e 73 0c bc 88 e9 35 16 ff a8 11 26 46 b1 6c 39 49 96 85 21 3d 7d 99 89 fa f5 78 de 88 d5 fe 7e e3 7e 35 c5 bd d1
и подпись: fd e4 94 c3 1f 40 72 9e 3d 40 79 82 5e ef f7 78 b2 56 e7 6e 80 c2 44 ff ca bc f4 c2 e1 a5 ca 21 ef 8c ac 67 c3 8a 6b 9e ce 98 d0 aa 56 67 0b b2 7f b0 02 51 68 ae ef 83 f5 c9 b8 27 b5 28 76 01
=== Подлинность сервера bbserv подтверждена! ===
Соединение установлено, идентификатор сессии: c3 71 01 18 0f 3b 6c e6 3c fe 68 22 72 6d 6c 01 01 6e 1f b3 8e 33 23 6f 4f bd b6 af 8b 9a 0f 36 7d 49 4d 9c 82 f2 bc d3 35 e5 c2 08 02 64 47 97 78 7a d4 71 b3 8c 34 ba 1c c2 db 8b 8c e2 67 32 dd c8 d7 ce 53 ae 5e d9 99 76 10 7e f0 53 cb 93 ce 0d 0f 18 e3 4f 4a c4 5e 4d cb a5 82 d5 ad ef 8a f0 8f 9b ca e4 15 5a d8 6a 59 94 69 0b a1 95 22 ce 15 02 ab 27 92 95 f9 74 71 31 6e 2b 68 85 5b 26 18 e1 fe 22 f1 84 f1 4d 39 d7 55 28 5c 18 3a 14 44 b7 79 f8 16 5c 98 2d 3d 43 22 fb d1 eb 9a 81 70 97 59 23 4f e1 c0 03 51 0a 03 71 f8 a1 7d 0e 91 32 b8 b0 8c b9 a1 7b f7 8d 64 17 b2 dd 25 e1 87 03 3a 36 99 78 3a ab f6 ca 78 17 d8 c0 70 a5 34 cb 48 50 07 7d 48 3c 6e 73 0c bc 88 e9 35 16 ff a8 11 26 46 b1 6c 39 49 96 85 21 3d 7d 99 89 fa f5 78 de 88 d5 fe 7e e3 7e 35 c5 bd d1
vselenaya@computer:~/SecureNet-main/crypto$
Ещё интересный пример, что будет, если у известного пользователя изменится открытй ключ:
Вывод в терминале Linux
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client server new_key only_connection
Запуск СЕРВЕРА
-----------
Генерируем новую пару открытый-закрытый ключ
---> Серверу отправлено имя bbserv
Сервер прислал своё имя bbcli
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAa75P20q6U4FsLupHF57W9fPjDUnJE+b25W0aLplIhIo=
-----END PUBLIC KEY-----
Подтвердите изменение открытого ключа сервера bbcli: новый ключ
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAa75P20q6U4FsLupHF57W9fPjDUnJE+b25W0aLplIhIo=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 32 00 63 0c 94 b4 95 19 87 09 48 e4 ea 67 8e 4d e8 51 48 61 2a 95 cf 3e 4a 28 fc c0 d0 45 23 fc 80 6f 60 06 f3 8d 28 70 81 4b 31 3f 6c aa a4 2b 2c 0d 73 6e 99 c9 e9 b6 a4 52 de 0f 4d 8b e8 a0
---> Открытый ключ для общего секрета отправлен
Общий секрет: 32 2a 91 7f a1 8e 27 dc c2 c8 05 94 6a 6c 29 8f 0e f9 20 aa 39 70 8d f0 f8 70 56 52 49 64 e3 e7
AES-256 KEY: 19 c7 06 ef 36 19 7b de 4a 0b 93 28 de 90 20 8b 80 c9 91 68 84 83 8c 63 48 fe 8d fe 7b 88 2a 2c
AES-256 IV: cf d9 88 7c 39 f5 e9 72 7a 35 3f e8 b5 d8 95 93 66 06 0b c8 6e db bb 2e a7 67 d4 1e 7a f7 10 45 4f 2e 5e 84 33 fa 10 53
HMAC SECRET: cf d9 88 7c 39 f5 e9 72 7a 35 3f e8 b5 d8 95 93 66 06 0b c8 6e db bb 2e a7 67 d4 1e 7a f7 10 45 4f 2e 5e 84 33 fa 10 53
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: f7 1c 4f 50 02 b4 ea ed 61 c3 df af a3 6f c5 04 a8 32 2e 7a bc 3a ab ce d5 55 fb 3e 76 40 c1 01 a8 78 6f 18 85 d0 ec b8 b9 a1 67 66 f6 51 35 4c 1c f4 c8 26 c9 cd bc 74 9e 0f ac 6e 93 31 f9 e4 f6 e8 74 9b 6a 18 fd 15 91 f7 67 82 2a f7 3e 80 eb e0 8a 04 5e 76 b1 82 03 37 1f 0a 5c 42 94 e8 21 43 91 8c 83 8b f9 1c 43 4f 74 ea d2 53 c1 a6 b7 0c 40 f0 40 e4 07 c8 7f d5 33 26 c5 94 fd fa
---> и подпись: f4 12 34 64 c6 8c e4 78 83 36 96 3a 0c 82 6d 6f b4 0a e1 a9 01 b5 bf 8b 3a fa 77 46 bb 40 4b ad 01 da a6 55 92 86 57 32 ed ff 17 61 40 55 ca b4 95 28 7e 7f 92 fb 77 9b 4d 03 91 43 76 14 c0 09
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 4c 88 aa 6f df ac 7d 94 31 10 8c 99 6a d3 f9 58 58 62 a3 f4 a5 c5 48 7d e1 8c 39 d8 c5 7b 8e 20 65 53 15 8d d7 15 d4 ba 97 88 1f 92 91 a9 e8 7a 90 e5 ed 90 80 37 fd bd 49 57 8f a6 c7 7d 7c b9 2a 03 2a eb a9 6b af 6d d5 8a 6b a7 f3 99 4a da 23 4a ad b8 1c 3e 84 e8 71 dd 99 7f 29 5c 1e 27 5f d1 02 eb a6 70 e5 0b 41 a6 8a 57 02 ba 31 58 33 fa 33 fc bf e1 96 ab d7 4e 9f 53 36 32 09 5e b2 86 41 eb 52 24 4c b1 46 ad 02 b0 59 07 1b 55
--> и HMAC для этого сообщения: ff 2d 1f 81 53 98 f9 e1 4a 88 45 87 b2 86 09 df 59 11 50 e1 a7 59 2f fc 09 28 42 30 78 7b 2f 96
--> Отправили шифрованное сообщение: Ciphertext: 22 62 fc d4 7c fe 15 b6 ef 69 48 e5 96 76 d6 17 b5 7e 15 c6 fe 0e 5a 11 84 de 0e dc b4 42 b5 fb 67 b0 5a 52 a0 8c 4a 43 e9 22 e2 22 b1 d3 11 af de 97 7a 90 f9 bd 61 af 7b 2c 47 c3 57 de a5 3f b0 e9 5f ca b8 50 06 b0 5f b2 af c7 95 af 75 ba
--> и HMAC для этого сообщения: 5a 8d 40 1f 2b 45 f1 41 ba 03 7a c3 2b f1 8f 21 df c9 8a 5c 89 dc ed c6 e0 48 c0 b8 b6 d6 79 77
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
��E��r���oифрованное сообщение и расшифровали: �2��$�P3#���*��`^�
)xAɢv%��N�Y�M9υ_q�HyaI�Z,��B?d����-�uO���
�%�h*[.�Dآ��,�\Z��.�7��<�=`Vϥ�oڼSv�HMAC корректен
Получили шифрованное сообщение и расшифровали: �˩��J���=��a��Ua�$�m�߶�HMAC корректен
========================
Получили от сервера bbcli сообщение: 82 32 01 b5 ab 24 97 13 50 33 01 23 a9 ff c7 2a b5 f0 b4 60 5e e2 0d e3 da 45 ad 8c 72 c1 d4 d6 6f 07 0c 29 0f 78 dc 08 0e 1f 41 c9 a2 76 25 a1 a6 4e 94 59 d6 4d 0e 39 cf 85 5f 71 1d 13 18 d0 48 79 61 49 80 5a 2c f7 b4 42 3f 64 a0 f6 ec c4 2d b6 75 4f 99 b8 7f ee a3 0c a7 25 e4 68 2a 5b 2e b0 44 d8 a2 c0 9d 2c bc 5c 5a 80 fb 2e b6 37 d7 f7 3c 86 3d 60 56 cf a5 ca 6f da bc 53 76 ff
и подпись: 8f 16 cb a9 f6 ef 16 4a 7f a9 8c 04 b8 3d fc c3 61 b4 e9 55 61 91 24 ce 6d 15 03 14 f1 8f 03 17 df b6 a7 15 00 8e ae 1a 16 4a 61 77 02 57 c0 39 40 8c 9c 8b a7 b5 9b 33 db 28 a1 da e5 e6 c6 0b
=== Подлинность сервера bbcli подтверждена! ===
Соединение установлено, идентификатор сессии: f7 1c 4f 50 02 b4 ea ed 61 c3 df af a3 6f c5 04 a8 32 2e 7a bc 3a ab ce d5 55 fb 3e 76 40 c1 01 a8 78 6f 18 85 d0 ec b8 b9 a1 67 66 f6 51 35 4c 1c f4 c8 26 c9 cd bc 74 9e 0f ac 6e 93 31 f9 e4 f6 e8 74 9b 6a 18 fd 15 91 f7 67 82 2a f7 3e 80 eb e0 8a 04 5e 76 b1 82 03 37 1f 0a 5c 42 94 e8 21 43 91 8c 83 8b f9 1c 43 4f 74 ea d2 53 c1 a6 b7 0c 40 f0 40 e4 07 c8 7f d5 33 26 c5 94 fd fa 82 32 01 b5 ab 24 97 13 50 33 01 23 a9 ff c7 2a b5 f0 b4 60 5e e2 0d e3 da 45 ad 8c 72 c1 d4 d6 6f 07 0c 29 0f 78 dc 08 0e 1f 41 c9 a2 76 25 a1 a6 4e 94 59 d6 4d 0e 39 cf 85 5f 71 1d 13 18 d0 48 79 61 49 80 5a 2c f7 b4 42 3f 64 a0 f6 ec c4 2d b6 75 4f 99 b8 7f ee a3 0c a7 25 e4 68 2a 5b 2e b0 44 d8 a2 c0 9d 2c bc 5c 5a 80 fb 2e b6 37 d7 f7 3c 86 3d 60 56 cf a5 ca 6f da bc 53 76 ff
vselenaya@computer:~/SecureNet-main/crypto$
Вывод клиента:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client new_key only_connection
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Генерируем новую пару открытый-закрытый ключ
---> Серверу отправлено имя bbcli
Сервер прислал своё имя bbserv
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAPxLvb4EjsZzLSjiQeBHTyYKwBJjtNNjTy2L63b+z1x8=
-----END PUBLIC KEY-----
Подтвердите изменение открытого ключа сервера bbserv: новый ключ
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAPxLvb4EjsZzLSjiQeBHTyYKwBJjtNNjTy2L63b+z1x8=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 1c ff 74 b3 a5 e8 bc 83 8f 61 17 ee 61 69 93 76 53 5a a6 66 d4 f2 a9 93 67 59 92 59 a1 64 a8 55 82 92 6f 4e 76 91 6a fd 9f 65 5c 17 c9 c0 aa c1 12 3f 71 b0 2b 25 dd a3 f6 46 77 ec 66 8b 25 3c
---> Открытый ключ для общего секрета отправлен
Общий секрет: 32 2a 91 7f a1 8e 27 dc c2 c8 05 94 6a 6c 29 8f 0e f9 20 aa 39 70 8d f0 f8 70 56 52 49 64 e3 e7
AES-256 KEY: 19 c7 06 ef 36 19 7b de 4a 0b 93 28 de 90 20 8b 80 c9 91 68 84 83 8c 63 48 fe 8d fe 7b 88 2a 2c
AES-256 IV: cf d9 88 7c 39 f5 e9 72 7a 35 3f e8 b5 d8 95 93 66 06 0b c8 6e db bb 2e a7 67 d4 1e 7a f7 10 45 4f 2e 5e 84 33 fa 10 53
HMAC SECRET: cf d9 88 7c 39 f5 e9 72 7a 35 3f e8 b5 d8 95 93 66 06 0b c8 6e db bb 2e a7 67 d4 1e 7a f7 10 45 4f 2e 5e 84 33 fa 10 53
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 82 32 01 b5 ab 24 97 13 50 33 01 23 a9 ff c7 2a b5 f0 b4 60 5e e2 0d e3 da 45 ad 8c 72 c1 d4 d6 6f 07 0c 29 0f 78 dc 08 0e 1f 41 c9 a2 76 25 a1 a6 4e 94 59 d6 4d 0e 39 cf 85 5f 71 1d 13 18 d0 48 79 61 49 80 5a 2c f7 b4 42 3f 64 a0 f6 ec c4 2d b6 75 4f 99 b8 7f ee a3 0c a7 25 e4 68 2a 5b 2e b0 44 d8 a2 c0 9d 2c bc 5c 5a 80 fb 2e b6 37 d7 f7 3c 86 3d 60 56 cf a5 ca 6f da bc 53 76 ff
---> и подпись: 8f 16 cb a9 f6 ef 16 4a 7f a9 8c 04 b8 3d fc c3 61 b4 e9 55 61 91 24 ce 6d 15 03 14 f1 8f 03 17 df b6 a7 15 00 8e ae 1a 16 4a 61 77 02 57 c0 39 40 8c 9c 8b a7 b5 9b 33 db 28 a1 da e5 e6 c6 0b
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 19 b1 91 01 5d 60 c5 cc 58 30 b7 0a eb ec 30 2e cf a9 dc 1f ea a3 63 bf 7d 63 a1 e8 04 0d df c9 bc 21 34 00 8e 1a 74 5f 0f 36 04 9b ab 0a 36 eb 5c fd 0a b9 5b f8 87 3f 3a 3e d9 1f 3e e6 38 15 a7 f6 1d 0a 3b b6 b9 0c 7c b3 3b 7d 47 29 db 9c 01 6f 68 6b 69 5c a4 cd 92 7d 28 5e bc 9f d7 b7 67 98 93 ab 28 b2 2d 9a 9d 82 ad f4 2c d8 1b b1 51 ea 9e f7 97 39 65 4b 19 db 27 00 56 22 83 a6 03 5b db f0 5e aa 0d ac f9 d9 8b fd ef 7d a7 6b
--> и HMAC для этого сообщения: 28 75 da c4 61 f3 06 cf e9 df aa 2d fd d3 34 5f 5d 75 90 2b 69 03 df 2c 9e 8f 12 bf 92 53 a3 d2
--> Отправили шифрованное сообщение: Ciphertext: a9 e5 73 c6 f9 9d af 05 c3 56 39 1e 12 a7 89 c8 21 09 71 aa 9e 27 47 c8 27 32 2e d6 7b 14 f5 62 d6 9c dc e3 93 60 ba bb 4c f5 d4 1b b9 01 be 2c 2a 30 39 a6 d3 01 e8 7f 6b 69 4a b6 7c d2 d1 f5 46 ca 3b f4 96 47 a9 cd 3a 96 1f 9b b2 9d fc b2
--> и HMAC для этого сообщения: bc ec 3f dd cc d1 7e e8 20 7e fe f6 e0 73 6e 51 d3 4d b1 a9 92 3c 67 41 78 71 6a fe 3d f1 fa 4e
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: �OP���a�߯�o��2.z�:���U�>v@��xo��츹�gf�Q5L��&�ͼt��n�1����t�j���g�*�>����^v��7
\B��!C�����COt��S���
@�@���3&Ŕ��HMAC корректен
Получили шифрованное сообщение и расшифровали: �4dƌ�x�6�:
�mo�
����:�wF�@K�ڦU��W2��a@Uʴ�(~��w�M�Cv� HMAC корректен
========================
Получили от сервера bbserv сообщение: f7 1c 4f 50 02 b4 ea ed 61 c3 df af a3 6f c5 04 a8 32 2e 7a bc 3a ab ce d5 55 fb 3e 76 40 c1 01 a8 78 6f 18 85 d0 ec b8 b9 a1 67 66 f6 51 35 4c 1c f4 c8 26 c9 cd bc 74 9e 0f ac 6e 93 31 f9 e4 f6 e8 74 9b 6a 18 fd 15 91 f7 67 82 2a f7 3e 80 eb e0 8a 04 5e 76 b1 82 03 37 1f 0a 5c 42 94 e8 21 43 91 8c 83 8b f9 1c 43 4f 74 ea d2 53 c1 a6 b7 0c 40 f0 40 e4 07 c8 7f d5 33 26 c5 94 fd fa
и подпись: f4 12 34 64 c6 8c e4 78 83 36 96 3a 0c 82 6d 6f b4 0a e1 a9 01 b5 bf 8b 3a fa 77 46 bb 40 4b ad 01 da a6 55 92 86 57 32 ed ff 17 61 40 55 ca b4 95 28 7e 7f 92 fb 77 9b 4d 03 91 43 76 14 c0 09
=== Подлинность сервера bbserv подтверждена! ===
Соединение установлено, идентификатор сессии: f7 1c 4f 50 02 b4 ea ed 61 c3 df af a3 6f c5 04 a8 32 2e 7a bc 3a ab ce d5 55 fb 3e 76 40 c1 01 a8 78 6f 18 85 d0 ec b8 b9 a1 67 66 f6 51 35 4c 1c f4 c8 26 c9 cd bc 74 9e 0f ac 6e 93 31 f9 e4 f6 e8 74 9b 6a 18 fd 15 91 f7 67 82 2a f7 3e 80 eb e0 8a 04 5e 76 b1 82 03 37 1f 0a 5c 42 94 e8 21 43 91 8c 83 8b f9 1c 43 4f 74 ea d2 53 c1 a6 b7 0c 40 f0 40 e4 07 c8 7f d5 33 26 c5 94 fd fa 82 32 01 b5 ab 24 97 13 50 33 01 23 a9 ff c7 2a b5 f0 b4 60 5e e2 0d e3 da 45 ad 8c 72 c1 d4 d6 6f 07 0c 29 0f 78 dc 08 0e 1f 41 c9 a2 76 25 a1 a6 4e 94 59 d6 4d 0e 39 cf 85 5f 71 1d 13 18 d0 48 79 61 49 80 5a 2c f7 b4 42 3f 64 a0 f6 ec c4 2d b6 75 4f 99 b8 7f ee a3 0c a7 25 e4 68 2a 5b 2e b0 44 d8 a2 c0 9d 2c bc 5c 5a 80 fb 2e b6 37 d7 f7 3c 86 3d 60 56 cf a5 ca 6f da bc 53 76 ff
vselenaya@computer:~/SecureNet-main/crypto$
Проект позволяет протестировать скорость создания защищённого соединения и скорость отправки сообщений. Для этого необходимо запустить сервер и клиент с параметром test_speed
. В этом случае пользователи выключат вывод всех функций (чтобы не засорять вывод огромным количеством справочной информации) и замерят скорость создания соединения, а также скорость обмена парой сообщений (время между началом отправки сообщения на сервер и окончанием получения ответа от сервера (при тестировании скорости сервер работает в режиме эхо: то есть посылает клиенту те же сообщения, что клиент отправил ему; клиент же посылает случайно сгенерированные сообщения)).
Количество итераций тестирования задаётся параметром TEST_ITERS
в файле client.c
.
С предыдущей демонстрации у нас уже есть .pem
-файлы, поэтому можем запускать.
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client server test_speed
Запуск СЕРВЕРА
-----------
Начинаем тестирование скорости...
Скорость создания сессии (защищенного соединения):
средняя скорость: 0.016899
стандартное отклонение: 0.003017
количество итераций: 20
Скорость обмена парой сообщений (длины 1000 байт):
средняя скорость: 0.003807
стандартное отклонение: 0.000442
количество итераций: 20
vselenaya@computer:~/SecureNet-main/crypto$
Вывод клиента:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client test_speed
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Начинаем тестирование скорости...
Скорость создания сессии (защищенного соединения):
средняя скорость: 0.018430
стандартное отклонение: 0.003697
количество итераций: 20
Скорость обмена парой сообщений (длины 1000 байт):
средняя скорость: 0.003959
стандартное отклонение: 0.000512
количество итераций: 20
vselenaya@computer:~/SecureNet-main/crypto$
Под скоростью имеется в виду время в секундах...
Вывод и результаты почти одинаковые, но всё же немного отличаются - из-за неточности замера возможно...
В данном проекте эта атака реализована следующим образом: клиент подключается к приложению mim, а приложение mim подключается к серверу.
Приложение mim может работать в двух режимах: proxy
и mim
:
-
Первый режим: простой ретранслятор, приложение передаёт сообщения от сервера к клиенту и обратно на всех этапах, выводя дамп каждого сообщение. Приложение предоставляет возможность по запросу изменить содержимое любого из сообщений перед отправкой (запрашивает у пользователя подтверждение ретрансляции каждого сообщения). Приложение не может дешифровать сообщения, так как защищённое соединение клиент и сервер по-прежнему устанавливают между собой, а mim лишь наблюдает.
Фактически с помощью данного режима следует протестировать устойчивость всех этапов работы протокола к модификации (порче) передаваемых сообщений. -
Второй режим - полноценная атака. Приложение mim передает свой открытый ключ каждому из пиров, устанавлиает собственное защищённое соединение и с клиентом, и с сервером. Каждое передаваемое сообщение расшифровывается, выводится на экран, по запросу модифицируется. От такой атаки должно как раз защитить подтверждение открытого ключа (есл пользователи будут внимательно сверять открытый ключ настоящего сервера с тем, что прислан, то на такую атаку они не попадутся).
Для демонстрации атаки MIM, необходимо явно перенаправить соединение клиента на приложение mim (в реальности такое перенаправление могут сделать мошеннические маршрутизаторы). Для этого в коде client.c
нужно изменить строчки 31-33
с таких:
#define SERVER_ADDR "localhost" // адрес, куда надо подключаться в режиме КЛИЕНТ
#define RUN_SERVER_PORT 8081 // номер порта, где будет работать код в режиме СЕРВЕР
#define CONNECT_SERVER_PORT 8081 // номер порта, куда подключается код в режиме КЛИЕНТ
// (если мы не хотим атаку Man-in-the-middle, то RUN_ и CONNECT_ SERVER_PORT должны совпадать)
на такие:
#define SERVER_ADDR "localhost" // у нас все приложения работает на localhost, поэтому тут не менем
#define RUN_SERVER_PORT 8081
#define CONNECT_SERVER_PORT 9091 // заменили порт на тот, где работает приложение MIM
После изменения кода клиента, нужно не забыть перекомпилировать: make client
Также необходимо скомпилировать само приложение mim. Для этого запускаем make mim
. В итоге появится исполняемое приложение mim
. Оно запускается с такими параметрами:
proxy
илиmim
- обязательный параметр: указывает на режим работы (описывали до этого)new_key
илиold_key
- обязательный параметр в случае режимаmim
: аналогично клиенту, указывает, нужно ли генерировать новые.pem
-файлы с ключами для приложения mim (именно этот открытый ключ будет подсунут настоящим клиентам и серверу, которыу, если будут невнимательны, подтвердят его и попадутся на атаку)
Для реализации атаки:
Запускаем сначала сервер: ./client server [new_key или old_key]
, затем приложение mim: ./mim [proxy или mim] [new_key или old_key, если mim]
, и потом клиент: ./client client [new_key или old_key]
.
Изначально у нас присутствуют 4 .pem
-файла и 2 info-файла с предыдущих демонстраций.
Вывод в терминале Linux
Вывод сервера:
Запуск СЕРВЕРА
-----------
Пара открытый-закрытый ключ остаётся прежней
---> Серверу отправлено имя bbserv
Сервер прислал своё имя bbcli
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAvp3QNavVMaNP3JuBBLSTkB2qBCyL1XlFkwifaOlQ3Zo=
-----END PUBLIC KEY-----
Сервер bbcli найден!
Peer pubkey (ключ данного пира для общего секрета): 04 c3 9a 65 96 a1 ef 3a 69 57 41 6e fe 07 18 bb 8e b6 61 47 c6 c1 bc a2 79 17 65 75 45 14 d8 2e ce e7 e4 93 e9 3b 0a 98 80 ae 23 23 9b 67 f4 84 e2 44 32 b5 8b 98 65 08 6a 86 aa 94 cf 8e a0 12 0c
---> Открытый ключ для общего секрета отправлен
Общий секрет: 4c c0 98 32 78 c7 e2 68 19 f0 7c a0 0d d4 d3 22 27 ba 32 19 c4 26 75 58 2c ee 35 13 23 cd a1 9e
AES-256 KEY: 4c 5b 47 b2 23 d9 e8 9a 05 e7 71 1b ee 06 83 ba 55 3f 9e 75 c9 81 de 39 d6 e7 05 bd e8 99 c5 ff
AES-256 IV: 08 e9 20 88 8e ad 88 49 5a 47 84 35 85 31 0f c1 8e 3b 4c 83 28 3c d5 b3 8e 8a 4a 42 f4 32 71 da 30 ed 4a 7b e5 75 66 26
HMAC SECRET: 08 e9 20 88 8e ad 88 49 5a 47 84 35 85 31 0f c1 8e 3b 4c 83 28 3c d5 b3 8e 8a 4a 42 f4 32 71 da 30 ed 4a 7b e5 75 66 26
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 4b fa a7 49 b5 ed 8f 69 31 d5 bd ad 2c 74 04 c1 09 4b 56 a3 b3 8d a7 37 a1 20 d5 43 67 a0 b8 12 fa c3 f0 6e 3f b0 e1 2c 31 d8 43 99 ba 6f b6 f9 fb 61 02 cf f1 2f 7c 33 8a 32 24 61 61 a1 a4 55 69 ae d0 b7 7d 36 32 9f 04 17 9c aa 60 af 2e 77 db 2c 7e 05 a5 0c c6 2b 0c 4c 74 e9 c9 41 b2 e0 b5 86 70 41 33 e8 59 55 b0 a6 15 c8 c2 de 73 32 b2 3e 41 b0 37 f1 8e 69 95 1d 4b 33 09 86 21 9c
---> и подпись: 4d 31 cb 36 37 ef 06 40 f7 1f 1e 5b 2d cf 3a bd 53 49 63 7a a7 6d 79 ef 73 64 bd fe 43 93 cd b5 e5 14 0e 70 65 b0 61 bc 9d 98 5d 74 ae b1 c1 3f 7a cb b0 98 9e 44 55 c9 da 45 4e 54 9c 0d 1c 0c
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 5a 5d 0b 0c 4e dc bf 01 4e ff 9d e8 97 62 f7 a0 7a f1 02 ab 5d be f7 da b5 1a f8 ff f5 44 d7 b2 82 40 ac 9a 2b f6 81 0d 25 8c 5f a4 6e 03 3c 42 23 5d c0 7d e6 45 fa 96 bd 9f cc 5e 12 36 ee b9 65 96 1b 02 b4 68 b8 06 11 0a f1 be 2a b6 6e 52 17 5e fa 7a cd b7 2a b8 d3 05 07 03 ea aa 02 d0 bc 5a 2a 19 16 54 2f cc a4 dd 26 d7 76 8a 3a fb fc 99 ca 7d d6 4b fc 4a 35 5d 68 e4 70 1c f1 c1 1d fe 10 ac 52 10 2f ef de cb f6 d7 d5 46 08 2e
--> и HMAC для этого сообщения: 9b 4f c4 51 5c 25 2f b5 33 60 74 d5 bf 9d 68 4c 1e 1f 17 eb df 09 fc 55 10 4e 2f 5b 79 43 49 ce
--> Отправили шифрованное сообщение: Ciphertext: e7 a8 0d 0c b3 f2 c2 f6 9f aa 35 6b 2e 21 5e 85 ec c5 0d 8f aa 63 75 ee cf 80 f4 dc 41 63 17 bc af de f9 bb 6d e9 86 53 57 43 1a d6 b0 41 19 9d 4d e6 1d ce 02 0f 31 2f 29 af 65 0d ab aa a0 cf 31 bb b5 d8 15 9d a1 4b bb 92 62 28 1f 40 2f 04
--> и HMAC для этого сообщения: 57 42 c2 60 56 7e 30 a8 9d 6b 9c e9 1d b5 9b 13 33 d7 82 a2 14 41 0c 6b 32 c0 aa 78 a5 f3 9d 93
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: ��`�gKsе�{�;Tr�2�
@�;+鮕��zN���~���{P�N�T�{�5�j�B�{P]���&����B��
��3���j�/��HMAC корректен
Получили шифрованное сообщение и расшифровали: 9s�Q5c�ch�w���滓�v����B�mY�q�l$$�>hԏy�m�����w�S��,�HMAC корректен
========================
Получили от сервера bbcli сообщение: 11 fc a4 60 f3 67 4b 73 d0 b5 9a 7b c6 3b 15 54 72 96 32 a2 0c 40 8f 3b 2b e9 ae 95 88 ee 7a 7f 4e 14 9e bf 89 7e 1d f5 e3 34 0d b9 cc 6a f4 27 0f 12 aa f9 11 a5 7d 08 1c 0e 6b 2c af 70 7e c2 7f b8 20 1e 41 81 7d f3 58 eb 26 b0 17 b5 ff b4 42 be 0e 05 06 fe 0d d9 7b 50 d0 4e dc 54 88 7b a5 35 02 88 6a b4 42 91 7b 50 18 04 5d e0 97 c3 1d 0c 84 ee 33 93 1f 1d fe 95 6a 10 b3 2f e3 c0
и подпись: 39 73 f1 a8 51 35 63 fd 63 10 68 e3 77 fa d4 14 ae e6 bb 93 de 76 f5 b2 ef d4 42 b3 ea 9f a7 6d 59 b3 71 ff 6c 07 24 24 c5 3e 68 d4 8f 79 c0 6d b9 ef 9b d9 e0 eb 96 77 c5 53 06 b7 c2 2c c9 00
=== Подлинность сервера bbcli подтверждена! ===
Соединение установлено, идентификатор сессии: 4b fa a7 49 b5 ed 8f 69 31 d5 bd ad 2c 74 04 c1 09 4b 56 a3 b3 8d a7 37 a1 20 d5 43 67 a0 b8 12 fa c3 f0 6e 3f b0 e1 2c 31 d8 43 99 ba 6f b6 f9 fb 61 02 cf f1 2f 7c 33 8a 32 24 61 61 a1 a4 55 69 ae d0 b7 7d 36 32 9f 04 17 9c aa 60 af 2e 77 db 2c 7e 05 a5 0c c6 2b 0c 4c 74 e9 c9 41 b2 e0 b5 86 70 41 33 e8 59 55 b0 a6 15 c8 c2 de 73 32 b2 3e 41 b0 37 f1 8e 69 95 1d 4b 33 09 86 21 9c 11 fc a4 60 f3 67 4b 73 d0 b5 9a 7b c6 3b 15 54 72 96 32 a2 0c 40 8f 3b 2b e9 ae 95 88 ee 7a 7f 4e 14 9e bf 89 7e 1d f5 e3 34 0d b9 cc 6a f4 27 0f 12 aa f9 11 a5 7d 08 1c 0e 6b 2c af 70 7e c2 7f b8 20 1e 41 81 7d f3 58 eb 26 b0 17 b5 ff b4 42 be 0e 05 06 fe 0d d9 7b 50 d0 4e dc 54 88 7b a5 35 02 88 6a b4 42 91 7b 50 18 04 5d e0 97 c3 1d 0c 84 ee 33 93 1f 1d fe 95 6a 10 b3 2f e3 c0
==== Диалог ====
Введите сообщение (EXIT - выход):
Добрый день!
--> Отправили шифрованное сообщение: Ciphertext: 75 6e a0 90 b1 e3 6b 25 51 9b 6c e1 95 1a 24 3c db c3 0e aa d7 28 71 2a be f6 56 ee d7 9e 30 ff
--> и HMAC для этого сообщения: bd 24 37 02 f3 bd 22 3d f8 58 75 f3 75 f3 fe 77 8b 08 a9 c0 c2 a2 81 bd 44 42 e8 b7 74 f3 df ed
Получили шифрованное сообщение и расшифровали: Привет!
HMAC не подходит!
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Вывод приложения mim:
vselenaya@computer:~/SecureNet-main/crypto$ ./mim proxy
Connecting to: 127.0.0.1
Подключен клиент!
КЛИЕНТ собирается послать данные: 62 62 63 6c 69
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 62 62 73 65 72 76
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
0
(распознан ответ: 0)
Введите новое сообщение (ctrl+D для ввода: не enter, так как перевод строки тоже учитывается):
NotServ---> Сообщение от сервера клиенту отправлено!
КЛИЕНТ собирается послать данные: 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 55 42 4c 49 43 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 43 6f 77 42 51 59 44 4b 32 56 77 41 79 45 41 76 70 33 51 4e 61 76 56 4d 61 4e 50 33 4a 75 42 42 4c 53 54 6b 42 32 71 42 43 79 4c 31 58 6c 46 6b 77 69 66 61 4f 6c 51 33 5a 6f 3d 0a 2d 2d 2d 2d 2d 45 4e 44 20 50 55 42 4c 49 43 20 4b 45 59 2d 2d 2d 2d 2d 0a
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 2d 2d 2d 2d 2d 42 45 47 49 4e 20 50 55 42 4c 49 43 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 43 6f 77 42 51 59 44 4b 32 56 77 41 79 45 41 59 6a 37 4c 79 47 62 68 68 6c 49 5a 49 4b 33 4e 78 43 4d 2f 77 45 43 35 6f 45 70 6a 64 38 39 4d 31 39 35 79 49 52 44 48 44 6b 4d 3d 0a 2d 2d 2d 2d 2d 45 4e 44 20 50 55 42 4c 49 43 20 4b 45 59 2d 2d 2d 2d 2d 0a
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 04 c3 9a 65 96 a1 ef 3a 69 57 41 6e fe 07 18 bb 8e b6 61 47 c6 c1 bc a2 79 17 65 75 45 14 d8 2e ce e7 e4 93 e9 3b 0a 98 80 ae 23 23 9b 67 f4 84 e2 44 32 b5 8b 98 65 08 6a 86 aa 94 cf 8e a0 12 0c
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
КЛИЕНТ собирается послать данные: 04 05 57 55 b1 62 04 bf 64 38 91 b9 64 ad fa d2 3d da 78 55 b9 51 29 39 76 a8 66 95 ef 3d c0 05 40 85 61 b2 3e 55 4a f6 49 62 d0 05 5c 9e 2a 71 66 2c 92 fb 7f bc 31 42 c1 9e 43 5e ba 4d 12 43 34
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
КЛИЕНТ собирается послать данные: 09 0a ac 09 a6 a1 76 8f 45 21 06 1d 6c 2b f5 6a 19 19 4b 9b 71 22 e8 59 80 38 e3 2f 8d 33 c9 f3 2d 58 6e a6 fd 02 49 eb e0 2d da 1f a5 6b ba 6c 43 88 29 4b ff b9 f1 da 96 6e 0e 65 01 34 ba 67 c7 f8 0e c7 12 08 69 6b 3a f3 49 05 cd d6 e0 b7 e4 13 37 e0 c0 fb c8 37 80 65 8c 1b e9 1f 07 3c cd ef fe 17 70 fa 73 13 10 43 82 95 dd 09 e7 96 e3 ca 1d eb f8 50 91 b7 11 1a 05 f3 6a 4f 9f 8c f0 dd cd c3 4a 2e 38 35 e0 6b d8 46 c9 6a 8b 22
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
КЛИЕНТ собирается послать данные: dd 66 0a 00 14 26 f0 65 43 3a 5a a3 ee 3b 7a ed 85 74 54 18 59 ab aa 6d 2f 7e 95 1e 0b 15 78 25
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
КЛИЕНТ собирается послать данные: 9b 00 0f 30 4f e7 8d 9b 23 27 b9 bc f1 8d 3f 9a 03 95 ad 49 a7 66 1a c3 ef 4c 45 75 c0 46 94 ea 24 b1 73 d7 2c 11 fb e2 3d 36 7c 70 d1 78 a7 fe 7f be 3c 3c 7a 63 c3 f0 d5 12 1b a5 25 c1 01 03 6e 0f 6e 89 0c f9 9e 9d ac e5 28 8e 16 6a 10 b6
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
КЛИЕНТ собирается послать данные: 65 0e 2f 5a f6 6f 47 5b df b5 1c 96 7f 9b 63 51 76 40 b5 9b 5c 15 ed b4 91 30 94 61 8d 57 66 c0
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 5a 5d 0b 0c 4e dc bf 01 4e ff 9d e8 97 62 f7 a0 7a f1 02 ab 5d be f7 da b5 1a f8 ff f5 44 d7 b2 82 40 ac 9a 2b f6 81 0d 25 8c 5f a4 6e 03 3c 42 23 5d c0 7d e6 45 fa 96 bd 9f cc 5e 12 36 ee b9 65 96 1b 02 b4 68 b8 06 11 0a f1 be 2a b6 6e 52 17 5e fa 7a cd b7 2a b8 d3 05 07 03 ea aa 02 d0 bc 5a 2a 19 16 54 2f cc a4 dd 26 d7 76 8a 3a fb fc 99 ca 7d d6 4b fc 4a 35 5d 68 e4 70 1c f1 c1 1d fe 10 ac 52 10 2f ef de cb f6 d7 d5 46 08 2e
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 9b 4f c4 51 5c 25 2f b5 33 60 74 d5 bf 9d 68 4c 1e 1f 17 eb df 09 fc 55 10 4e 2f 5b 79 43 49 ce
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: e7 a8 0d 0c b3 f2 c2 f6 9f aa 35 6b 2e 21 5e 85 ec c5 0d 8f aa 63 75 ee cf 80 f4 dc 41 63 17 bc af de f9 bb 6d e9 86 53 57 43 1a d6 b0 41 19 9d 4d e6 1d ce 02 0f 31 2f 29 af 65 0d ab aa a0 cf 31 bb b5 d8 15 9d a1 4b bb 92 62 28 1f 40 2f 04
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: 57 42 c2 60 56 7e 30 a8 9d 6b 9c e9 1d b5 9b 13 33 d7 82 a2 14 41 0c 6b 32 c0 aa 78 a5 f3 9d 93
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
КЛИЕНТ собирается послать данные: 9d ad b2 a3 cf 8e 16 fc 0e 49 80 ff ab 40 d5 9f
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от клиент серверу отправлено!
КЛИЕНТ собирается послать данные: 9a 19 7b 7e 4f 58 a4 61 62 26 31 7a 5e 9a 55 e8 93 60 ad a9 be c7 93 7e 49 f3 8d 04 e4 0f 33 1f
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
0
(распознан ответ: 0)
Введите новое сообщение (ctrl+D для ввода: не enter, так как перевод строки тоже учитывается):
random_data
---> Сообщение от клиент серверу отправлено!
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
=== таймаут ===
СЕРВЕР собирается послать данные: 75 6e a0 90 b1 e3 6b 25 51 9b 6c e1 95 1a 24 3c db c3 0e aa d7 28 71 2a be f6 56 ee d7 9e 30 ff
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
СЕРВЕР собирается послать данные: bd 24 37 02 f3 bd 22 3d f8 58 75 f3 75 f3 fe 77 8b 08 a9 c0 c2 a2 81 bd 44 42 e8 b7 74 f3 df ed
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
---> Сообщение от сервера клиенту отправлено!
=== таймаут ===
Дополнительная информация: Ошибка получения данных
==========================
vselenaya@computer:~/SecureNet-main/crypto$
Вывод клиента:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client old_key
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Пара открытый-закрытый ключ остаётся прежней
---> Серверу отправлено имя bbcli
Сервер прислал своё имя NotServ
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAYj7LyGbhhlIZIK3NxCM/wEC5oEpjd89M195yIRDHDkM=
-----END PUBLIC KEY-----
Подтвердите нового клиента NotServ с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAYj7LyGbhhlIZIK3NxCM/wEC5oEpjd89M195yIRDHDkM=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 05 57 55 b1 62 04 bf 64 38 91 b9 64 ad fa d2 3d da 78 55 b9 51 29 39 76 a8 66 95 ef 3d c0 05 40 85 61 b2 3e 55 4a f6 49 62 d0 05 5c 9e 2a 71 66 2c 92 fb 7f bc 31 42 c1 9e 43 5e ba 4d 12 43 34
---> Открытый ключ для общего секрета отправлен
Общий секрет: 4c c0 98 32 78 c7 e2 68 19 f0 7c a0 0d d4 d3 22 27 ba 32 19 c4 26 75 58 2c ee 35 13 23 cd a1 9e
AES-256 KEY: 4c 5b 47 b2 23 d9 e8 9a 05 e7 71 1b ee 06 83 ba 55 3f 9e 75 c9 81 de 39 d6 e7 05 bd e8 99 c5 ff
AES-256 IV: 08 e9 20 88 8e ad 88 49 5a 47 84 35 85 31 0f c1 8e 3b 4c 83 28 3c d5 b3 8e 8a 4a 42 f4 32 71 da 30 ed 4a 7b e5 75 66 26
HMAC SECRET: 08 e9 20 88 8e ad 88 49 5a 47 84 35 85 31 0f c1 8e 3b 4c 83 28 3c d5 b3 8e 8a 4a 42 f4 32 71 da 30 ed 4a 7b e5 75 66 26
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 11 fc a4 60 f3 67 4b 73 d0 b5 9a 7b c6 3b 15 54 72 96 32 a2 0c 40 8f 3b 2b e9 ae 95 88 ee 7a 7f 4e 14 9e bf 89 7e 1d f5 e3 34 0d b9 cc 6a f4 27 0f 12 aa f9 11 a5 7d 08 1c 0e 6b 2c af 70 7e c2 7f b8 20 1e 41 81 7d f3 58 eb 26 b0 17 b5 ff b4 42 be 0e 05 06 fe 0d d9 7b 50 d0 4e dc 54 88 7b a5 35 02 88 6a b4 42 91 7b 50 18 04 5d e0 97 c3 1d 0c 84 ee 33 93 1f 1d fe 95 6a 10 b3 2f e3 c0
---> и подпись: 39 73 f1 a8 51 35 63 fd 63 10 68 e3 77 fa d4 14 ae e6 bb 93 de 76 f5 b2 ef d4 42 b3 ea 9f a7 6d 59 b3 71 ff 6c 07 24 24 c5 3e 68 d4 8f 79 c0 6d b9 ef 9b d9 e0 eb 96 77 c5 53 06 b7 c2 2c c9 00
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 09 0a ac 09 a6 a1 76 8f 45 21 06 1d 6c 2b f5 6a 19 19 4b 9b 71 22 e8 59 80 38 e3 2f 8d 33 c9 f3 2d 58 6e a6 fd 02 49 eb e0 2d da 1f a5 6b ba 6c 43 88 29 4b ff b9 f1 da 96 6e 0e 65 01 34 ba 67 c7 f8 0e c7 12 08 69 6b 3a f3 49 05 cd d6 e0 b7 e4 13 37 e0 c0 fb c8 37 80 65 8c 1b e9 1f 07 3c cd ef fe 17 70 fa 73 13 10 43 82 95 dd 09 e7 96 e3 ca 1d eb f8 50 91 b7 11 1a 05 f3 6a 4f 9f 8c f0 dd cd c3 4a 2e 38 35 e0 6b d8 46 c9 6a 8b 22
--> и HMAC для этого сообщения: dd 66 0a 00 14 26 f0 65 43 3a 5a a3 ee 3b 7a ed 85 74 54 18 59 ab aa 6d 2f 7e 95 1e 0b 15 78 25
--> Отправили шифрованное сообщение: Ciphertext: 9b 00 0f 30 4f e7 8d 9b 23 27 b9 bc f1 8d 3f 9a 03 95 ad 49 a7 66 1a c3 ef 4c 45 75 c0 46 94 ea 24 b1 73 d7 2c 11 fb e2 3d 36 7c 70 d1 78 a7 fe 7f be 3c 3c 7a 63 c3 f0 d5 12 1b a5 25 c1 01 03 6e 0f 6e 89 0c f9 9e 9d ac e5 28 8e 16 6a 10 b6
--> и HMAC для этого сообщения: 65 0e 2f 5a f6 6f 47 5b df b5 1c 96 7f 9b 63 51 76 40 b5 9b 5c 15 ed b4 91 30 94 61 8d 57 66 c0
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: K��I��i1ս�,t� KV����7� �Cg�����n?��,1�C��o���a��/|3�2$aa��Ui�з}62���`�.w�,~�
�+
Lt��A�െpA3�YU�����s2�>A�7�i�K3 �!�HMAC корректен
Получили шифрованное сообщение и расшифровали: M1�67�@�[-�:�SIcz�my�sd��C�͵�pe�a���]t���?z˰��DU��ENT�
HMAC корректен
========================
Получили от сервера NotServ сообщение: 4b fa a7 49 b5 ed 8f 69 31 d5 bd ad 2c 74 04 c1 09 4b 56 a3 b3 8d a7 37 a1 20 d5 43 67 a0 b8 12 fa c3 f0 6e 3f b0 e1 2c 31 d8 43 99 ba 6f b6 f9 fb 61 02 cf f1 2f 7c 33 8a 32 24 61 61 a1 a4 55 69 ae d0 b7 7d 36 32 9f 04 17 9c aa 60 af 2e 77 db 2c 7e 05 a5 0c c6 2b 0c 4c 74 e9 c9 41 b2 e0 b5 86 70 41 33 e8 59 55 b0 a6 15 c8 c2 de 73 32 b2 3e 41 b0 37 f1 8e 69 95 1d 4b 33 09 86 21 9c
и подпись: 4d 31 cb 36 37 ef 06 40 f7 1f 1e 5b 2d cf 3a bd 53 49 63 7a a7 6d 79 ef 73 64 bd fe 43 93 cd b5 e5 14 0e 70 65 b0 61 bc 9d 98 5d 74 ae b1 c1 3f 7a cb b0 98 9e 44 55 c9 da 45 4e 54 9c 0d 1c 0c
=== Подлинность сервера NotServ подтверждена! ===
Соединение установлено, идентификатор сессии: 4b fa a7 49 b5 ed 8f 69 31 d5 bd ad 2c 74 04 c1 09 4b 56 a3 b3 8d a7 37 a1 20 d5 43 67 a0 b8 12 fa c3 f0 6e 3f b0 e1 2c 31 d8 43 99 ba 6f b6 f9 fb 61 02 cf f1 2f 7c 33 8a 32 24 61 61 a1 a4 55 69 ae d0 b7 7d 36 32 9f 04 17 9c aa 60 af 2e 77 db 2c 7e 05 a5 0c c6 2b 0c 4c 74 e9 c9 41 b2 e0 b5 86 70 41 33 e8 59 55 b0 a6 15 c8 c2 de 73 32 b2 3e 41 b0 37 f1 8e 69 95 1d 4b 33 09 86 21 9c 11 fc a4 60 f3 67 4b 73 d0 b5 9a 7b c6 3b 15 54 72 96 32 a2 0c 40 8f 3b 2b e9 ae 95 88 ee 7a 7f 4e 14 9e bf 89 7e 1d f5 e3 34 0d b9 cc 6a f4 27 0f 12 aa f9 11 a5 7d 08 1c 0e 6b 2c af 70 7e c2 7f b8 20 1e 41 81 7d f3 58 eb 26 b0 17 b5 ff b4 42 be 0e 05 06 fe 0d d9 7b 50 d0 4e dc 54 88 7b a5 35 02 88 6a b4 42 91 7b 50 18 04 5d e0 97 c3 1d 0c 84 ee 33 93 1f 1d fe 95 6a 10 b3 2f e3 c0
==== Диалог ====
Введите сообщение (EXIT - выход):
Привет!
--> Отправили шифрованное сообщение: Ciphertext: 9d ad b2 a3 cf 8e 16 fc 0e 49 80 ff ab 40 d5 9f
--> и HMAC для этого сообщения: 9a 19 7b 7e 4f 58 a4 61 62 26 31 7a 5e 9a 55 e8 93 60 ad a9 be c7 93 7e 49 f3 8d 04 e4 0f 33 1f
Получили шифрованное сообщение и расшифровали: Добрый день!
HMAC корректен
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Как можно заметить, приложение mim просто читает трафик в виде байтов и выводит его на экран. Каждое сообщение можно изменить - например, мы подменили имя сервера: вместо bbserv
стало NotServ
, а вот имя клиента мы не меняли. Из-за этого сервер клиента узнал (сообщение <<Сервер bbcli найден!>>), так как он уже был сохранён в info-файле, а вот клиент сервера не узнал и запросил подтверждение нового ключа (по хорошему клиент должен был пойти вручную к серверу для сверки информации и обнаружить подделку имени, после чего оборвать соединение).
Так как клиент подтвердлил новое имя, то теперь у нас появился 3-ий файл: client_bbcli_info_NotServ
- полностью совпадающий с файлом client_bbcli_info_bbserv
.
Далее все сообщения в приложении mim мы пропускали без изменений (просто потому что там была настройка защищённого соединения между клиентом и сервером: любое вмешательство просто бы вызвало ошибку и разрыв соединения).
И только после того, как было установлено защищённое соединение, мы подменили HMAC сообщения от клиента на строку <<random_data>>, что просто привело к тому, что у сервера вывелось сообщение <<HMAC не подходит!>> - аналогичное бы было, если изменить само сообщение. То есть незаметно подделать сообщение в таком режиме нельзя: у пользователя сразу выскочит несовпадение HMAC.
Таким образом, в режиме proxy приложение mim неопасно: оно может оборвать установку защищённого соединения, что-нибудь изменив (но это можно и проще сделать, вынув ethernet-кабель или настроив файрволл), может изменить сообщения (но это сразу будет понятно по несовпадению HMAC) - то есть может только пакастить, но реально подслушать передачу сообщений, нарушить целостность и тд оно не может. Единственное, mim может подменить имя пользователя и его открытый ключ, но если пользователь не будет лениться и при возникновении запроса на подтверждение открытого ключа будет сверять его и имя у настоящего сервера, то ничего не испортится.
Кстати, нужно заметить, что сообщения <<=== таймаут ===>> связаны с реализацией (приложение по очереди в течение секунды пытается прочитать сообщение то от клиента, то от севрера, и вот данное сообщение сообщает, что секунда прошла) и не несут значения для работы приложения.
Теперь настоящая атака. Можно считать, что никаких .pem
- и info-файлов не было.
Вывод в терминале Linux
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client server new_key
Запуск СЕРВЕРА
-----------
Генерируем новую пару открытый-закрытый ключ
---> Серверу отправлено имя bbserv
Сервер прислал своё имя MIM
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAtbp42zZRNXJML/f3k2HLZ8Ilwei1dcoOQYcmbjEBCGY=
-----END PUBLIC KEY-----
Подтвердите нового клиента MIM с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAtbp42zZRNXJML/f3k2HLZ8Ilwei1dcoOQYcmbjEBCGY=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 0a f2 bc cf 76 38 9b c5 fb e5 dc 67 2d 40 23 0c 06 16 4d 11 0f aa be b5 d5 0e 80 91 0d 41 8b 63 43 4a 43 46 cf fc 33 32 ca 8d bd 26 bf c4 0f 92 b6 13 f9 6d 4d 3d ba 45 71 9d 69 3d 1b bb a7 84
---> Открытый ключ для общего секрета отправлен
Общий секрет: 25 31 26 1c 96 57 38 8d fa cf ba 8c 4c c3 33 e7 1a da c2 1d 41 db a7 66 b6 95 4e 79 6d 98 1f bb
AES-256 KEY: c2 3e e1 16 2b ef 5b 57 b3 d2 4b 5c f9 3d 11 ea 75 f0 e3 11 b2 12 47 40 62 29 ed 96 90 21 b3 50
AES-256 IV: 16 cc 29 77 60 4d 40 27 aa b0 40 80 81 2d 00 86 12 fe 1f 83 ee 4e b3 69 d9 74 1e 4b 04 94 29 49 f0 48 70 70 63 92 3e 55
HMAC SECRET: 16 cc 29 77 60 4d 40 27 aa b0 40 80 81 2d 00 86 12 fe 1f 83 ee 4e b3 69 d9 74 1e 4b 04 94 29 49 f0 48 70 70 63 92 3e 55
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 15 f3 2a 0a 49 5d ee 56 62 c3 cc 77 36 e0 ce 44 6e 2a ab 61 dc f3 4c 8a f6 7b 74 f5 5e 01 46 16 f5 99 86 d6 99 a9 16 7d d6 01 fb 1c 0c e9 4a cf e4 80 6d 6c b4 1d 39 f3 7d 7f 24 25 96 3e 55 30 f8 76 9f cc c3 88 66 ad 44 89 e5 7d e6 8c bf ca db b1 72 37 b0 c5 a0 cb 96 d5 42 13 71 b9 e6 d3 2e c2 d7 a5 ab 44 60 18 63 4e c6 aa ce bd 67 69 e6 e2 77 d6 f9 26 93 be 36 55 ea 5e a1 f3 a3 82
---> и подпись: dd 04 1d a4 46 c2 cb 70 14 bb 9d 94 8c b9 29 fc ff 02 d5 9e 58 7f 36 9b 7c ed 16 ee 22 00 b1 26 92 ca 94 2a c3 7f 05 64 12 57 92 ec 4b 19 46 aa 75 a1 c2 d3 fd b1 57 0d 5b e5 0d ab 7d 65 30 00
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 4f 18 7d ba b1 66 08 1b 55 87 27 57 5d 96 29 6e 56 6d 2f 93 5d 18 a7 cd 4d 90 aa fd 75 fc 9c 81 be 9f 4d ad 95 e0 ca 96 87 e0 34 65 02 ea 9c b5 e6 94 fa 89 f7 0d c7 57 d5 71 82 eb e3 64 ef 6d 3d 88 c6 8c a2 0e 06 03 45 9d 6f c1 23 f7 76 93 c6 58 6a eb 94 41 5c 7e 7b 07 d0 87 6a 26 99 5f 95 9f 35 2e 31 79 22 c5 25 ac 18 fe 1f a7 90 dd 63 cc 6d 67 25 c5 03 f3 21 56 4d 27 2d b9 6d c7 bf f7 8d 32 77 06 90 43 38 ff aa d0 ad 69 21 79
--> и HMAC для этого сообщения: 58 83 96 3d 38 a0 e1 ac 6f 45 df f4 68 3b f7 a5 86 ab a3 84 8b da bc 85 d0 66 f7 d6 b7 2d c6 74
--> Отправили шифрованное сообщение: Ciphertext: 37 95 dd e3 be 73 9b b9 13 4f b7 d8 14 01 a4 2a 00 d3 56 82 1a d4 73 f9 44 b1 43 61 0f c6 0a 4f 3f d0 fc 82 a2 d7 74 bd 5b 2e 12 40 9e 06 4d bf 75 50 52 6c 55 67 88 54 86 19 7f 7a 9d 84 56 48 74 8d ea ba 89 8f 8d 98 5f ae 4e 09 42 1a 4e 50
--> и HMAC для этого сообщения: 34 db 34 c2 0f aa d3 5e 74 da 9d 81 98 d7 7f f1 63 33 9e bc a7 bc 58 3c 2d 2d 57 af ab 24 93 17
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: ����������a攐o�Y)�TyD��6�m%��dQ�"S��r#�G���?��aY�w9Tv���~2Bs�(�ʱ!#rSH�it��U%ʼ*S�� 9-�>�=_ �&1�����6��s�>HMAC корректен
Получили шифрованное сообщение и расшифровали: �+�,�~'VO�S�lb)��n��Q��\
I��~��f�}�#!O���HMAC корректен
========================
Получили от сервера MIM сообщение: a4 9c 90 88 bb b7 bf a6 f4 d8 11 61 e6 94 90 6f b7 59 1d 1f 11 29 f6 54 79 44 84 92 36 88 6d 25 9e 91 64 51 88 22 53 8e df 72 23 ae 47 ba eb d0 3f be de 61 03 59 db 77 39 1f 54 76 15 f4 1a 9c 7e 32 42 73 05 f5 28 fe 1b 53 ca b1 1b b1 21 23 72 53 48 95 69 74 ab e7 f1 08 55 13 25 ca bc 2a 06 16 53 05 c5 f0 20 39 2d 8c 3e a2 3d 5f 09 ca 0f 26 31 8c a9 fa fe d3 36 b4 e6 a3 73 fc 18 3e
и подпись: f1 b6 ac 2b b0 2c e5 7e 27 56 4f a2 53 9e 03 6c 1d 62 29 97 dc 6e fc e7 51 8d 83 5c 0c 49 d4 11 d7 7e 86 d9 1e 66 99 7d 3c 2a 8f 43 a6 28 df 06 30 54 84 e7 0d ad 23 21 4f 12 89 1b a6 ea df 0e
=== Подлинность сервера MIM подтверждена! ===
Соединение установлено, идентификатор сессии: a4 9c 90 88 bb b7 bf a6 f4 d8 11 61 e6 94 90 6f b7 59 1d 1f 11 29 f6 54 79 44 84 92 36 88 6d 25 9e 91 64 51 88 22 53 8e df 72 23 ae 47 ba eb d0 3f be de 61 03 59 db 77 39 1f 54 76 15 f4 1a 9c 7e 32 42 73 05 f5 28 fe 1b 53 ca b1 1b b1 21 23 72 53 48 95 69 74 ab e7 f1 08 55 13 25 ca bc 2a 06 16 53 05 c5 f0 20 39 2d 8c 3e a2 3d 5f 09 ca 0f 26 31 8c a9 fa fe d3 36 b4 e6 a3 73 fc 18 3e 15 f3 2a 0a 49 5d ee 56 62 c3 cc 77 36 e0 ce 44 6e 2a ab 61 dc f3 4c 8a f6 7b 74 f5 5e 01 46 16 f5 99 86 d6 99 a9 16 7d d6 01 fb 1c 0c e9 4a cf e4 80 6d 6c b4 1d 39 f3 7d 7f 24 25 96 3e 55 30 f8 76 9f cc c3 88 66 ad 44 89 e5 7d e6 8c bf ca db b1 72 37 b0 c5 a0 cb 96 d5 42 13 71 b9 e6 d3 2e c2 d7 a5 ab 44 60 18 63 4e c6 aa ce bd 67 69 e6 e2 77 d6 f9 26 93 be 36 55 ea 5e a1 f3 a3 82
==== Диалог ====
Введите сообщение (EXIT - выход):
Добрый день!
--> Отправили шифрованное сообщение: Ciphertext: 7c 1d af 69 1c 51 21 46 55 12 31 f9 3f de b2 83 58 82 b5 67 48 06 69 1d 1a d9 6a fc 01 52 62 0d
--> и HMAC для этого сообщения: 8e d0 4e f6 c9 1b 2e 94 dc 5e 46 22 7a 02 4e 15 dd 28 c8 13 fa d1 a3 43 c2 4a c3 72 fd 74 97 ac
Получили шифрованное сообщение и расшифровали: Привет! Как дела?
HMAC корректен
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Вывод приложения mim:
vselenaya@computer:~/SecureNet-main/crypto$ ./mim mim new_key
Connecting to: 127.0.0.1
Подключен клиент!
Генерируем новую пару открытый-закрытый ключ
========= УСТАНОВКА СОЕДИНЕНИЯ С КЛИЕНТОМ =========
---> Серверу отправлено имя MIM
Сервер прислал своё имя bbcli
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAnWDdx0ta2qkO4sn2vBfnsYxjEYAPBs8R5UEM87XSlDA=
-----END PUBLIC KEY-----
Подтвердите нового клиента bbcli с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAnWDdx0ta2qkO4sn2vBfnsYxjEYAPBs8R5UEM87XSlDA=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 27 a2 21 f4 64 90 b9 ce 6b f4 51 3a 38 01 10 5f 11 3b 8a f9 a9 ef fc 34 36 8a ba 47 0f 47 af 7b e9 76 5b b1 d0 06 f6 15 b3 60 cc 88 d0 90 db 63 96 d9 86 c9 03 50 d8 eb b4 5e f9 cb 27 3f 01 2f
---> Открытый ключ для общего секрета отправлен
Общий секрет: 63 ec ff 96 67 7e 59 78 92 01 43 2d 86 cf d8 bf 79 22 3a f1 7f 75 c8 fb a3 7e 84 12 16 b0 1a 42
AES-256 KEY: c6 b1 31 5a 77 fe c4 a7 d2 fc f8 79 d7 c7 17 05 77 5d 8f ca 75 6a ff b2 a3 20 aa 68 6b 3e e2 e8
AES-256 IV: 68 fb e4 92 e0 c0 ac 0d ed 58 57 b8 33 0e 42 33 34 2d 82 bf 11 15 bd e8 c1 3b 85 46 0c ca 0d b3 86 c0 dd d9 77 17 99 72
HMAC SECRET: 68 fb e4 92 e0 c0 ac 0d ed 58 57 b8 33 0e 42 33 34 2d 82 bf 11 15 bd e8 c1 3b 85 46 0c ca 0d b3 86 c0 dd d9 77 17 99 72
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: dd e5 d9 06 0e cf 0c ed 9c 22 3f f0 92 90 f4 eb 91 0b dc 5b 4e a7 73 39 6e 69 81 02 81 8f 49 06 e5 11 a3 3c 55 a8 6c e8 02 9d 8c 97 2a a8 fa f9 41 f2 88 f2 d6 a0 18 34 b7 21 27 e8 a1 de b5 9e 88 74 a6 bf c8 c7 33 f4 ac 89 b3 b6 c1 ba 16 ca 0c 43 31 6d 96 79 8d e9 6a 91 72 1e 4b 85 c8 49 95 3b 83 7d f0 29 fe e6 c9 d4 be da 5d 43 b0 4e 20 6b 6f 3a d1 d1 0f 62 73 b7 bd 50 46 7b ff 20
---> и подпись: 87 23 a8 7e b8 33 96 6d b5 74 5d 08 34 59 97 0c aa 30 17 d1 f9 8c 2d d7 55 08 8a aa 92 70 24 a5 93 d8 63 c0 80 b1 f1 92 b7 f8 4f ba 46 16 cf 65 70 95 3e 88 09 ef 29 4b e8 d6 55 5f f2 e9 90 05
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 1d a0 e4 59 c7 c5 32 29 38 8d 79 a6 ea f4 ae f1 ff ae e6 b6 34 b3 fd 3b d0 9b f2 28 39 60 ec be e9 74 f3 14 71 b1 80 14 92 55 12 1f 26 aa a8 96 db c0 c2 14 9d b9 ab ec 40 73 36 ce 8a 66 dd a8 45 b1 2a 8e 3d 3c 3d 16 df 29 1a e6 37 98 2a b9 51 25 31 9e ae f1 65 d0 10 bc 04 da 54 97 4e 68 8e 1e fd 5f f6 b0 6f cd 97 a4 2f 28 19 81 5a b0 1c 19 f4 e4 f7 8c 5d d1 70 5e b9 35 b3 47 de 18 93 60 94 2b 6b 37 89 38 b6 8c 0f 4f 84 19 7d 01
--> и HMAC для этого сообщения: 38 84 5f d6 49 70 6a 8c 9a ae 06 70 73 75 37 e6 36 9a 33 43 bc f3 0b 08 22 71 7f 0f 38 64 df 89
--> Отправили шифрованное сообщение: Ciphertext: 0b f6 ab 5d 66 84 0f 09 43 c2 2c 40 44 d8 70 36 37 7f 6a 78 14 ce 22 c0 f9 f0 15 65 7e 69 f1 a3 0d 62 8a bf 02 46 c0 7c 57 e6 38 aa 39 5d ff ec 46 01 ce cf 80 fc 96 c7 2f c8 4d 63 b9 94 2c 99 82 05 a0 89 fe d7 15 c0 e2 a6 ef 8d 62 31 6c 9b
--> и HMAC для этого сообщения: f1 82 52 55 4e 82 3e 17 74 1d 47 27 20 49 48 30 93 c9 df d9 00 34 cf d8 12 f4 69 00 fe 66 8c 49
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: � E��`<�/+��m���!p� ]G@,���:�!p�-�M�����{�H�L(D�^JcpĄ(�Ͼ=��X�����������fUH?�+c>�
�c4��� E
6�����:�]��u���q��HMAC корректен
Получили шифрованное сообщение и расшифровали: " | h����wZ#;������0J��ζ�G���Fq� ȞR+��Õ���5� �9�N��HMAC корректен
========================
Получили от сервера bbcli сообщение: 82 20 45 ec d9 60 3c a8 2f 2b 16 c0 eb 6d b2 b4 bf 21 70 cf 09 5d 14 07 7f 47 40 2c 94 e1 c6 3a 1a 21 70 d8 2d dd 4d 8e a1 ef 8f 0f 05 8f 15 ba 7b af 12 48 87 4c 12 28 44 b0 1e 5e 4a 63 70 c4 84 28 d9 cf be 05 3d ff b4 58 d7 c2 04 a0 b6 f6 7f 89 93 a3 a5 94 aa 66 55 48 3f 84 2b 63 3e f9 0c 45 03 0d 91 63 34 f0 f2 19 b1 0b 36 b6 ff e9 ee bc c1 3a 9d 5d 9b 1a 75 10 a6 b4 b5 71 94 b3
и подпись: 22 20 1c 7c 09 68 cc eb ff 83 77 11 5a 23 3b f5 f2 07 a2 df cb fb 02 30 4a d9 cf ce b6 e1 47 c3 03 a6 f4 46 7f 71 bb 09 d7 08 c8 9e 52 2b da d0 c3 95 a1 8e c1 35 d1 20 92 39 ab 4e a1 d3 06 0f
=== Подлинность сервера bbcli подтверждена! ===
Соединение установлено, идентификатор сессии: dd e5 d9 06 0e cf 0c ed 9c 22 3f f0 92 90 f4 eb 91 0b dc 5b 4e a7 73 39 6e 69 81 02 81 8f 49 06 e5 11 a3 3c 55 a8 6c e8 02 9d 8c 97 2a a8 fa f9 41 f2 88 f2 d6 a0 18 34 b7 21 27 e8 a1 de b5 9e 88 74 a6 bf c8 c7 33 f4 ac 89 b3 b6 c1 ba 16 ca 0c 43 31 6d 96 79 8d e9 6a 91 72 1e 4b 85 c8 49 95 3b 83 7d f0 29 fe e6 c9 d4 be da 5d 43 b0 4e 20 6b 6f 3a d1 d1 0f 62 73 b7 bd 50 46 7b ff 20 82 20 45 ec d9 60 3c a8 2f 2b 16 c0 eb 6d b2 b4 bf 21 70 cf 09 5d 14 07 7f 47 40 2c 94 e1 c6 3a 1a 21 70 d8 2d dd 4d 8e a1 ef 8f 0f 05 8f 15 ba 7b af 12 48 87 4c 12 28 44 b0 1e 5e 4a 63 70 c4 84 28 d9 cf be 05 3d ff b4 58 d7 c2 04 a0 b6 f6 7f 89 93 a3 a5 94 aa 66 55 48 3f 84 2b 63 3e f9 0c 45 03 0d 91 63 34 f0 f2 19 b1 0b 36 b6 ff e9 ee bc c1 3a 9d 5d 9b 1a 75 10 a6 b4 b5 71 94 b3
========= УСТАНОВКА СОЕДИНЕНИЯ С СЕРВЕРОМ =========
---> Серверу отправлено имя MIM
Сервер прислал своё имя bbserv
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAACXJM0b/+sT4pV+mxXKz+ut1Qf2eZfUENcIc9ESlz3I=
-----END PUBLIC KEY-----
Подтвердите нового клиента bbserv с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAACXJM0b/+sT4pV+mxXKz+ut1Qf2eZfUENcIc9ESlz3I=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 c6 39 eb 0c 67 fb 8c 4a 57 bc b4 78 bf c0 98 ae 5c 27 f5 25 4d 4f 05 21 dc a0 98 af 2e f2 fa 63 d6 84 73 68 2e 85 0e c7 38 b2 0b 94 96 fe 31 d1 fd 5f 08 65 0f 48 65 9f 00 66 db eb b8 03 81 4c
---> Открытый ключ для общего секрета отправлен
Общий секрет: 25 31 26 1c 96 57 38 8d fa cf ba 8c 4c c3 33 e7 1a da c2 1d 41 db a7 66 b6 95 4e 79 6d 98 1f bb
AES-256 KEY: c2 3e e1 16 2b ef 5b 57 b3 d2 4b 5c f9 3d 11 ea 75 f0 e3 11 b2 12 47 40 62 29 ed 96 90 21 b3 50
AES-256 IV: 16 cc 29 77 60 4d 40 27 aa b0 40 80 81 2d 00 86 12 fe 1f 83 ee 4e b3 69 d9 74 1e 4b 04 94 29 49 f0 48 70 70 63 92 3e 55
HMAC SECRET: 16 cc 29 77 60 4d 40 27 aa b0 40 80 81 2d 00 86 12 fe 1f 83 ee 4e b3 69 d9 74 1e 4b 04 94 29 49 f0 48 70 70 63 92 3e 55
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: a4 9c 90 88 bb b7 bf a6 f4 d8 11 61 e6 94 90 6f b7 59 1d 1f 11 29 f6 54 79 44 84 92 36 88 6d 25 9e 91 64 51 88 22 53 8e df 72 23 ae 47 ba eb d0 3f be de 61 03 59 db 77 39 1f 54 76 15 f4 1a 9c 7e 32 42 73 05 f5 28 fe 1b 53 ca b1 1b b1 21 23 72 53 48 95 69 74 ab e7 f1 08 55 13 25 ca bc 2a 06 16 53 05 c5 f0 20 39 2d 8c 3e a2 3d 5f 09 ca 0f 26 31 8c a9 fa fe d3 36 b4 e6 a3 73 fc 18 3e
---> и подпись: f1 b6 ac 2b b0 2c e5 7e 27 56 4f a2 53 9e 03 6c 1d 62 29 97 dc 6e fc e7 51 8d 83 5c 0c 49 d4 11 d7 7e 86 d9 1e 66 99 7d 3c 2a 8f 43 a6 28 df 06 30 54 84 e7 0d ad 23 21 4f 12 89 1b a6 ea df 0e
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: de 8a cc c8 34 7d ab 63 b7 11 91 31 d2 dd 04 cb 6f 95 e2 ce a5 9a eb 09 1c da 3e cf 5f 66 05 06 23 14 97 11 28 1b f8 8f 86 d2 d7 08 b1 d8 f3 83 86 fe b7 8b 4a fc 78 52 d3 51 f1 40 9e a3 ca e2 14 33 d0 0d 1b 0f f8 0f 06 a0 1b 99 f5 d8 4e c1 7b 50 8a c3 fe 31 08 75 1b f9 e8 a5 4d c7 2f 67 8e ec 8d 6c 5c da 72 9b db 9b 59 c4 4b 28 45 0f d9 d1 64 fe c0 0a c2 4a cf e0 4a 99 32 82 4e eb fc 27 5e 94 4e d6 a2 4f 1b ef c6 0a e1 af ed 0b
--> и HMAC для этого сообщения: 99 8d 64 eb 99 31 0b 5a a3 2c 6f 43 e7 0d b0 7d dd 57 1e f4 dd 0e 24 9d 29 5b 1a af 0d 8e ad 8f
--> Отправили шифрованное сообщение: Ciphertext: b3 96 6d 44 e5 5e fe 91 9d f1 29 a7 6d db e4 84 29 92 fa 9c a7 30 0c da e9 90 67 e3 e9 64 f2 d4 4d d6 c3 a1 ca 53 ff aa c3 0c 99 d0 54 7b 1c e4 54 c4 7e 95 2b 72 4b 4d 36 d3 69 05 52 da 12 5f 5e 08 2d cd ea fd 8f 85 ed 47 2c ad 6c 6c b2 1c
--> и HMAC для этого сообщения: 72 8e 20 9e 62 f8 dc dc 8d 5a 5f f3 e8 f6 45 fc 5e ab d3 20 00 77 0b 34 07 39 32 6f eb ad 1b 8f
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: �*
I]�Vb��w6��Dn*�a��L��{t�^F���֙�}��
�J��ml�9�}$%�>U0�v��Èf�D��}挿�۱r7�Š˖�Bq���.�ץ�D`cNƪνgi��w��&��6U�^��HMAC корректен
Получили шифрованное сообщение и расшифровали: ��F��p�����)��՞X6�|��"HMAC корректен
========================
Получили от сервера bbserv сообщение: 15 f3 2a 0a 49 5d ee 56 62 c3 cc 77 36 e0 ce 44 6e 2a ab 61 dc f3 4c 8a f6 7b 74 f5 5e 01 46 16 f5 99 86 d6 99 a9 16 7d d6 01 fb 1c 0c e9 4a cf e4 80 6d 6c b4 1d 39 f3 7d 7f 24 25 96 3e 55 30 f8 76 9f cc c3 88 66 ad 44 89 e5 7d e6 8c bf ca db b1 72 37 b0 c5 a0 cb 96 d5 42 13 71 b9 e6 d3 2e c2 d7 a5 ab 44 60 18 63 4e c6 aa ce bd 67 69 e6 e2 77 d6 f9 26 93 be 36 55 ea 5e a1 f3 a3 82
и подпись: dd 04 1d a4 46 c2 cb 70 14 bb 9d 94 8c b9 29 fc ff 02 d5 9e 58 7f 36 9b 7c ed 16 ee 22 00 b1 26 92 ca 94 2a c3 7f 05 64 12 57 92 ec 4b 19 46 aa 75 a1 c2 d3 fd b1 57 0d 5b e5 0d ab 7d 65 30 00
=== Подлинность сервера bbserv подтверждена! ===
Соединение установлено, идентификатор сессии: a4 9c 90 88 bb b7 bf a6 f4 d8 11 61 e6 94 90 6f b7 59 1d 1f 11 29 f6 54 79 44 84 92 36 88 6d 25 9e 91 64 51 88 22 53 8e df 72 23 ae 47 ba eb d0 3f be de 61 03 59 db 77 39 1f 54 76 15 f4 1a 9c 7e 32 42 73 05 f5 28 fe 1b 53 ca b1 1b b1 21 23 72 53 48 95 69 74 ab e7 f1 08 55 13 25 ca bc 2a 06 16 53 05 c5 f0 20 39 2d 8c 3e a2 3d 5f 09 ca 0f 26 31 8c a9 fa fe d3 36 b4 e6 a3 73 fc 18 3e 15 f3 2a 0a 49 5d ee 56 62 c3 cc 77 36 e0 ce 44 6e 2a ab 61 dc f3 4c 8a f6 7b 74 f5 5e 01 46 16 f5 99 86 d6 99 a9 16 7d d6 01 fb 1c 0c e9 4a cf e4 80 6d 6c b4 1d 39 f3 7d 7f 24 25 96 3e 55 30 f8 76 9f cc c3 88 66 ad 44 89 e5 7d e6 8c bf ca db b1 72 37 b0 c5 a0 cb 96 d5 42 13 71 b9 e6 d3 2e c2 d7 a5 ab 44 60 18 63 4e c6 aa ce bd 67 69 e6 e2 77 d6 f9 26 93 be 36 55 ea 5e a1 f3 a3 82
========= СОЕДИНЕНИЯ УСТАНОВЛЕНЫ =========
КЛИЕНТ пытается отправить серверу сообщение:
Привет! Как дела?
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
1
(распознан ответ: 1)
--> СЕРВЕРУ отправлено сообщение
СЕРВЕР пытается отправить серверу сообщение:
Добрый день!
Введите 1, если разрешить пересылку и 0, если хотите изменить сообщение:
0
(распознан ответ: 0)
Введите новое сообщение:
Сервер занят!
--> КЛИЕНТУ отправлено сообщение
Дополнительная информация: Нет сообщения от сервера
==========================
vselenaya@computer:~/SecureNet-main/crypto$
Вывод сервера:
vselenaya@computer:~/SecureNet-main/crypto$ ./client client new_key
Запуск КЛИЕНТА
---------------
Connecting to: 127.0.0.1
Генерируем новую пару открытый-закрытый ключ
---> Серверу отправлено имя bbcli
Сервер прислал своё имя MIM
---> Серверу отправлен публичный ключ
Сервер прислал свой ключ:
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAtbp42zZRNXJML/f3k2HLZ8Ilwei1dcoOQYcmbjEBCGY=
-----END PUBLIC KEY-----
Подтвердите нового клиента MIM с открытым ключом
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAtbp42zZRNXJML/f3k2HLZ8Ilwei1dcoOQYcmbjEBCGY=
-----END PUBLIC KEY-----
(введите 1)
1
Peer pubkey (ключ данного пира для общего секрета): 04 e7 8d 23 80 09 c5 60 b7 0b f6 a6 f8 c9 55 89 dc b9 92 8e ff 5e e9 86 5d fb 49 38 6c 16 20 c1 87 ec b5 5a cf 8b 15 57 ef 45 af 1c 7b e5 f7 d0 0d 46 ac 96 34 9a d1 c3 e6 23 d6 33 b8 10 63 be f9
---> Открытый ключ для общего секрета отправлен
Общий секрет: 63 ec ff 96 67 7e 59 78 92 01 43 2d 86 cf d8 bf 79 22 3a f1 7f 75 c8 fb a3 7e 84 12 16 b0 1a 42
AES-256 KEY: c6 b1 31 5a 77 fe c4 a7 d2 fc f8 79 d7 c7 17 05 77 5d 8f ca 75 6a ff b2 a3 20 aa 68 6b 3e e2 e8
AES-256 IV: 68 fb e4 92 e0 c0 ac 0d ed 58 57 b8 33 0e 42 33 34 2d 82 bf 11 15 bd e8 c1 3b 85 46 0c ca 0d b3 86 c0 dd d9 77 17 99 72
HMAC SECRET: 68 fb e4 92 e0 c0 ac 0d ed 58 57 b8 33 0e 42 33 34 2d 82 bf 11 15 bd e8 c1 3b 85 46 0c ca 0d b3 86 c0 dd d9 77 17 99 72
Начинаем процедуру проверки подлинности открытого ключа...
---> Серверу отправлено сообщение: 82 20 45 ec d9 60 3c a8 2f 2b 16 c0 eb 6d b2 b4 bf 21 70 cf 09 5d 14 07 7f 47 40 2c 94 e1 c6 3a 1a 21 70 d8 2d dd 4d 8e a1 ef 8f 0f 05 8f 15 ba 7b af 12 48 87 4c 12 28 44 b0 1e 5e 4a 63 70 c4 84 28 d9 cf be 05 3d ff b4 58 d7 c2 04 a0 b6 f6 7f 89 93 a3 a5 94 aa 66 55 48 3f 84 2b 63 3e f9 0c 45 03 0d 91 63 34 f0 f2 19 b1 0b 36 b6 ff e9 ee bc c1 3a 9d 5d 9b 1a 75 10 a6 b4 b5 71 94 b3
---> и подпись: 22 20 1c 7c 09 68 cc eb ff 83 77 11 5a 23 3b f5 f2 07 a2 df cb fb 02 30 4a d9 cf ce b6 e1 47 c3 03 a6 f4 46 7f 71 bb 09 d7 08 c8 9e 52 2b da d0 c3 95 a1 8e c1 35 d1 20 92 39 ab 4e a1 d3 06 0f
=== шифрованный вид: ===
--> Отправили шифрованное сообщение: Ciphertext: 07 5e 6f b0 2d d2 88 e5 b7 6a 24 81 0b 7e d9 1a ac 69 f7 6f 73 7e d3 49 8b 7b 15 69 66 aa 11 64 80 75 9f b7 c8 70 4b 9c 2e 3c 6c 80 c2 8a d8 a2 8b c0 5c 5c 6f 6a ad 15 1b 82 1f 62 f1 39 63 1b db 42 3c e6 70 24 8f 7a e2 c4 0f cf 88 5f c9 b4 3b 96 58 00 9b 25 ee c5 21 91 46 84 f5 63 86 91 a9 8b 32 9a 87 44 86 aa a1 84 c3 33 03 d5 28 ac 3a ec 8b 07 3c b9 8e 5d ed d4 77 bd c1 53 20 0a 1d e4 4d 9a 33 76 b3 aa 8f 1d b4 90 d6 c0 82 ad
--> и HMAC для этого сообщения: a6 d6 87 0f 00 e9 2d 8b b0 d2 97 b4 98 48 b8 57 b6 bd b7 2f 9c 2f 3f b0 94 ca 13 5f 94 7a cd 52
--> Отправили шифрованное сообщение: Ciphertext: f8 2e 9e 49 53 fe 3f f9 1d 4b 2d 01 cf 69 08 96 52 1c e1 c1 23 60 81 dd d1 33 4f 05 93 87 bd 40 8b b6 7b ba 60 be 2b 3c b0 60 fc ea e1 ee b7 22 75 1c 0d c9 6a 8d d8 a4 06 b1 8c fb 3d aa 0f f8 55 38 eb b4 72 f6 f5 7a da 7f e8 c4 5c 69 02 45
--> и HMAC для этого сообщения: 84 da 86 a8 74 fd 70 b1 97 5e a4 c0 2d 40 3e 7d 5f 72 04 19 05 7a 88 6b 94 1d 22 23 91 f7 a2 6e
========================
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: ����
�"?���
�[N�s9ni���I��<U�l����*���A��֠4�!'���t����3��������
C1m�y��j�rK��I�;�}�)���Ծ�]C�N ko:��bs��PF{� HMAC корректен
Получили шифрованное сообщение и расшифровали: �#�~�3�m�t4Y�
�0���-����p$���c�����O�F�ep�>� �)K��U_��HMAC корректен
========================
Получили от сервера MIM сообщение: dd e5 d9 06 0e cf 0c ed 9c 22 3f f0 92 90 f4 eb 91 0b dc 5b 4e a7 73 39 6e 69 81 02 81 8f 49 06 e5 11 a3 3c 55 a8 6c e8 02 9d 8c 97 2a a8 fa f9 41 f2 88 f2 d6 a0 18 34 b7 21 27 e8 a1 de b5 9e 88 74 a6 bf c8 c7 33 f4 ac 89 b3 b6 c1 ba 16 ca 0c 43 31 6d 96 79 8d e9 6a 91 72 1e 4b 85 c8 49 95 3b 83 7d f0 29 fe e6 c9 d4 be da 5d 43 b0 4e 20 6b 6f 3a d1 d1 0f 62 73 b7 bd 50 46 7b ff 20
и подпись: 87 23 a8 7e b8 33 96 6d b5 74 5d 08 34 59 97 0c aa 30 17 d1 f9 8c 2d d7 55 08 8a aa 92 70 24 a5 93 d8 63 c0 80 b1 f1 92 b7 f8 4f ba 46 16 cf 65 70 95 3e 88 09 ef 29 4b e8 d6 55 5f f2 e9 90 05
=== Подлинность сервера MIM подтверждена! ===
Соединение установлено, идентификатор сессии: dd e5 d9 06 0e cf 0c ed 9c 22 3f f0 92 90 f4 eb 91 0b dc 5b 4e a7 73 39 6e 69 81 02 81 8f 49 06 e5 11 a3 3c 55 a8 6c e8 02 9d 8c 97 2a a8 fa f9 41 f2 88 f2 d6 a0 18 34 b7 21 27 e8 a1 de b5 9e 88 74 a6 bf c8 c7 33 f4 ac 89 b3 b6 c1 ba 16 ca 0c 43 31 6d 96 79 8d e9 6a 91 72 1e 4b 85 c8 49 95 3b 83 7d f0 29 fe e6 c9 d4 be da 5d 43 b0 4e 20 6b 6f 3a d1 d1 0f 62 73 b7 bd 50 46 7b ff 20 82 20 45 ec d9 60 3c a8 2f 2b 16 c0 eb 6d b2 b4 bf 21 70 cf 09 5d 14 07 7f 47 40 2c 94 e1 c6 3a 1a 21 70 d8 2d dd 4d 8e a1 ef 8f 0f 05 8f 15 ba 7b af 12 48 87 4c 12 28 44 b0 1e 5e 4a 63 70 c4 84 28 d9 cf be 05 3d ff b4 58 d7 c2 04 a0 b6 f6 7f 89 93 a3 a5 94 aa 66 55 48 3f 84 2b 63 3e f9 0c 45 03 0d 91 63 34 f0 f2 19 b1 0b 36 b6 ff e9 ee bc c1 3a 9d 5d 9b 1a 75 10 a6 b4 b5 71 94 b3
==== Диалог ====
Введите сообщение (EXIT - выход):
Привет! Как дела?
--> Отправили шифрованное сообщение: Ciphertext: 48 be 0e 75 da 69 41 5e 95 1d 38 a3 3e 44 6c 11 9b 3d 89 95 5a be a1 b9 f7 04 10 be 20 89 20 d3
--> и HMAC для этого сообщения: 26 2b f9 50 0d 7d 5a 55 8e 1a c2 1b e8 49 ba 99 4c 5e 62 6b ad 7a a8 de 30 44 14 61 89 c2 cc 45
Получили шифрованное сообщение и расшифровали: Сервер занят!
HMAC корректен
Введите сообщение (EXIT - выход):
EXIT
vselenaya@computer:~/SecureNet-main/crypto$
Тут приложение mim установило защищённое соединение сначала с клиентом, потом с сервером. Обоим высветилось подтверждение открытого ключа приложения с именем MIM
, и оба его подтвердили, а потому попались на атаку: приложение mim читало весь трафик между клиентом и сервером и даже смогло подделать сообщение: вместо <<Добрый день!>> от сервера пришло сообщение <<Сервер занят!>>, при этом проверка HMAC была успешна.
- Размер всех сообщений не должен быть больше
BUFFER_LEN
, который установлен в 1024 байт. Если точнее, это размер отправляемых сообщений, в том числе шифротекста, который чуть больше исходного сообщения... поэтому сами сообщения должны быть поменьше: меньше 1000 байт достаточно. - Для отправки/получения сообщений из сокетов, используются просто команды
recv
иsend
. Чтобы сообщения не смешивались, они разделяются специальным флагом (небольшой строкой) - это не так надёжно, как в реализации с TLS, где заранее длина сообщения отправляется, но зато здесь идёт чтение в цикле по одному байту пока не встретится флаг конца сообщения (то есть сообщение не потеряется)... Но как и в реализации с TLS, тут нет таймаутов в сокетах или каких-нибудь действий, если кто-то испортит формат сообщений (скорее всего будет ошибка при очередном чтении и просто программа закончит работу). - Как и в реализации с TLS при любых ошибках программп просто падает.
- Теперь самое интересное. Так как данная реализация - это всё же рукописный протокол установления защищённого соединения, то тут есть некоторые дыры в безопасности (они были найдены не сразу, поэтому не исправлены, хотя это не так сложно):
- Для подтверждения открытых ключей пользователи отправляют случайное сообщение и подпись для него своим закрытым ключом. Так как сообщение и подпись шифруются, то остальные не знают их, однако адресат (клиент или сервер) получает себе это сообщение и подпись к нему. Тогда потом этот адресат может сам провести атаку mim: он может перехватить соединение и притвориться тем пользователем, от которого до этого получил сообщение и подпись. Когда дело в установлении соединения дойдёт до проверки открытого ключа, этот адресат просто подсунет те же самые сообщение и подпись, которые получил сам.
Поэтому в данной реализации необходимо доверять тем серверам, с которыми устанавливается соединение, так как они получают сообщение и подпись к нему, которые потом могут использовать, чтобы притвориться тем клиентом, от которого их получили...
Исправить это не так сложно: можно подписывать, например, не сообщение, а шифр, получающийся из него (так как считается, что блочный шифр из сообщения делает почти случайный набор байтов), или же можно генерировать случайное сообщение и просить адресата подписать его (то есть пользователи генеируют случаные сообщения, а потом подписывают сообщения друг друга, после чего проверяют подпись... тогда к адресату всё равно попадёт сообщение и подпись, но он не сможет использовать их, так как ему придётся подписать то, что ему сгенерировал собеседник). - При общении клиент и сервер снабжают свои сообщения имитовставкой, которая учитывает секрет, сообщение, счётчики, идентификатор сессии. Но даже этого недостаточно! Тут проходит так называемая reply-атака: а именно если в данный момент счётчик отправленных и полученных сообщений совпадает, то новое сообщение от пользователя можно развернуть и направить ему же обратно (как будто от сервера): тогда проврека HMAC не сломается, ведь секрет тот же самый, идетификатор сессии тот же, счётчики те же, сообщение не поменялось... и пользователь реально будет думать, что ему прислали такое же сообщение, что и он.
Исправить это просто: достаточно использовать два разных секрета HMAC для отправки от клиента к серверу и в обратную сторону.
- Для подтверждения открытых ключей пользователи отправляют случайное сообщение и подпись для него своим закрытым ключом. Так как сообщение и подпись шифруются, то остальные не знают их, однако адресат (клиент или сервер) получает себе это сообщение и подпись к нему. Тогда потом этот адресат может сам провести атаку mim: он может перехватить соединение и притвориться тем пользователем, от которого до этого получил сообщение и подпись. Когда дело в установлении соединения дойдёт до проверки открытого ключа, этот адресат просто подсунет те же самые сообщение и подпись, которые получил сам.
- Иногда в процессе создания защищённого соединения программа может как будто зависнуть... например, в такой момент:
...
=== попытка расшифровать сообщение от сервера (скорее всего какая-то ерунда, так как это случайное сообщение): ===
Получили шифрованное сообщение и расшифровали: �o��e���
��:�5�fs�ɤ���VY!���ZD����E�+��8+��I����
�qٙ����*^E���G8_ú�"\Hy.���3��90^���RN(ͧ��4̢�7�!mT�S��|�r�V�i*�HMAC корректен
Получили шифрованное сообщение и расшифровали: ��~�I�"����(���ξ
Видимо, это происходит из-за того, что в случайных сообщениях, которые выводятся на экран есть спец символы, которые немного мешают выводу... проще всего просто перезапустить программу.