
Фреймворк для управления устройствами QKD и управления симметричными ключами. См. [страницу проекта здесь](https://qcomms.gitlab.io/cqptoolkit/)
Система предоставляет различные компоненты для интеграции QKD в систему безопасности. Она написана на C++11, но использует интерфейсы [GRPC][], поэтому может быть интегрирована с множеством различных языков.
Для запуска программного обеспечения нативно, либо:
Для клонирования исходного кода, включая подмодули:
git clone --recurse-submodules https://gitlab.com/QComms/cqptoolkit.git
``````bash
git clone --recurse-submodules [email protected]:QComms/cqptoolkit.git
Если вы клонировали без использования
--recurse-submodules, подмодули можно обновить, выполнивgit submodule update --initиз папки исходного кода.
Вот список зависимостей, необходимых для компиляции проекта (пожалуйста, ознакомьтесь с подробностями установки ниже):```bash
sudo apt install pkg-config ca-certificates file build-essential cmake ninja-build libusb-1.0-0-dev libcurl4-openssl-dev
libcrypto++-dev libcap-dev uuid-dev libssl-dev libsqlite3-dev libprotobuf-dev libgrpc++-dev
libssl-dev protobuf-compiler protobuf-compiler-grpc checkinstall
mkdir build-cqptoolkit
cd build-cqptoolkit
cmake -G Ninja ../cqptoolkit && ninja
**Быстрый тест**
Из папки сборки, чтобы запустить два сайта (на одном локальном компьютере) каждый с устройством QKD, сначала запустите сайт «A», запустив агент сайта и подключив к нему «фиктивный драйвер» Alice:
*(Если бинарные файлы установлены, опустите пути к командам из инструкций.)*```bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a
-n, --ipv4 / --ipv6 / --pkt)
и затем запустите сканирование:
флаг тип пример использования
tcp/1000 tcp/1000
tcp/open `tcp/Open````bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8001 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8001 -b
Это не начнет сразу создавать ключ, поскольку эта система предназначена для управления через систему управления, соединение должно быть установлено с помощью команды *SiteAgentCtl*.
- Во-первых, вы можете проверить список доступных устройств с помощью:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -d -c localhost:8000
что по умолчанию должно дать нечто подобное этому, если SiteAgentRunner и DummyQKDDriver были запущены без указания аргумента конфигурационного файла строки JSON:```json { "url": ":8000", "devices": [ { "config": { "id": "dummyqkd__0__16_alice", "kind": "dummyqkd" }, "controlAddress": ":34219" } ] }
и порт `8001` должен выдать что-то похожее на```json
{
"url": "<hostname>:8001",
"devices": [
{
"config": {
"id": "dummyqkd__0__16_bob",
"side": "Bob",
"kind": "dummyqkd"
},
"controlAddress": "<hostname>:38367"
}
]
}
Это создаст один переход от одного сайта к другому, более сложные маршруты могут быть определены с помощью опции `-a` с JSON-строкой, определяющей путь.
Через несколько секунд должен быть доступен ключ, который можно проверить, запросив ключ.
> ПРИМЕЧАНИЕ: Параметр -k должен быть URL-адресом, указанным в деталях второго сайта, а не "localhost:8001"```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -k `hostname`:8001
Ссылку можно остановить командой unjoin:```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001
> Несмотря на то, что генерация остановлена, ключ по-прежнему доступен, пока агенты сайта работают.
> Его можно запросить с помощью той же команды запроса ключа, указанной выше.
**Пример шифрования**
Запустив агенты сайта и драйверы на одном локальном компьютере, как описано выше, и после запуска ссылки для обмена ключами, можно также протестировать функции шифрования.
- Сначала запустите одну сторону "VPN" на bob, который будет слушать порт 9010 и подключаться к хранилищу ключей Bob:```
./src/Tools/QTunnelServer/QTunnelServer -p 9010 --keystore-url=`hostname`:8001
Теперь запустите сторону Алисы VPN, определив туннель для создания. Будут открыты два порта, по одному для каждой стороны на 9000 и 9001. Всё, что поступает на эти порты, будет зашифровано, передано на другую сторону, расшифровано и выведено на другой порт.```
./src/Tools/QTunnelServer/QTunnelServer --keystore-url=hostname:8000 --remote=localhost:9010 --start-node=tcpsrv://0.0.0.0:9000 --end-node=tcpsrv://0.0.0.0:9001
Любое приложение, использующее TCP-соединения, может затем использовать этот порт. Netcat — это простая программа, которая будет отправлять данные через порты. Запустите одну на одной стороне:```
nc localhost 9000
и один на другом:``` nc localhost 9001
Все, что вводится на одной стороне, появится на другой после нажатия Enter. Проверка пакетов, проходящих через порты `9000` и `9001`, с помощью такого инструмента, как Wireshark, покажет, что данные зашифрованы и используется идентификатор ключа.
Могут быть созданы другие формы соединения, вместо `tcpserv`:
| Пример | Описание |
| ============================= | ===================================================== |
| tcpserv://0.0.0.0:1234 | Создается порт прослушивания на порту 1234 |
| tcp://127.0.01:1234 | Устанавливается соединение с TCP-портом 1234 на localhost |
| udp://0.0.0.0:1234 | UDP-пакеты отправляются с этого порта |
| tun://192.168.101.1/?netmask=255.255.255.0 | Создается туннельное устройство на уровне IP с IP-адресом |
| tap://192.168.101.1/?netmask=255.255.255.0 | Создается tap-устройство на уровне Ethernet |
| eth://eth0/?level=tcp | Создается сырой сокет, уровень может быть tcp, ip или eth. |
# Прогресс
Запланированные и реализованные функции