Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CQPToolkit — إطار عمل للتحكم في أجهزة QKD وإدارة المفاتيح المتناظرة. انظر [صفحة المشروع هنا](https://qcomms.gitlab.io/cqptoolkit/) | Kitploit
أدوات/GitLabGitLab/qcomms/cqptoolkit
أمان الأنظمة المدمجةأدوات التشفير/فك التشفيرأمن الشبكاتالتشفيرأمن الأجهزة
GitLabqcomms/cqptoolkit

CQPToolkit

إطار عمل للتحكم في أجهزة QKD وإدارة المفاتيح المتناظرة. انظر [صفحة المشروع هنا](https://qcomms.gitlab.io/cqptoolkit/)

عرض المستودع
61منذ 4 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
الموقع الإلكتروني

CQP Tool kit

يوفر النظام مكونات متنوعة لدمج QKD في نظام أمني. وهو مكتوب بلغة C++11 ولكنه يستخدم واجهات GRPC مما يسمح بالدمج مع الكثير من اللغات المختلفة.

بداية سريعة

لتشغيل البرنامج محليًا، إما:

  • تنزيل وتثبيت حزم دبيان لنظام أوبونتو أو
  • استنساخ المصدر مع ضمان تحديث الوحدات الفرعية وبناء البرنامج محليًا

لاستنساخ المصدر بما في ذلك الوحدات الفرعية:```bash git clone --recurse-submodules [email protected]:QComms/cqptoolkit.git

root@kitploit:~
> إذا قمت بالاستنساخ دون استخدام `--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" عن طريق بدء site agent وتوصيل Alice "dummy driver" به: (إذا تم تثبيت الملفات الثنائية، فاحذف المسارات إلى الأوامر من التعليمات.)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a

root@kitploit:~
Please provide the Markdown content to translate.```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
root@kitploit:~
والذي يجب أن ينتج شيئًا مشابهًا لهذا افتراضيًا، إذا تم إطلاق *SiteAgentRunner* و *DummyQKDDriver* دون تحديد وسيطة ملف سلسلة تكوين JSON:```json
{
 "url": "<hostname>:8000",
 "devices": [
  {
   "config": {
    "id": "dummyqkd__0__16_alice",
    "kind": "dummyqkd"
   },
   "controlAddress": "<hostname>:34219"
  }
 ]
}

و يجب أن يُنتج المنفذ 8001 شيئًا مشابهًا لـ```json { "url": ":8001", "devices": [ { "config": { "id": "dummyqkd__0__16_bob", "side": "Bob", "kind": "dummyqkd" }, "controlAddress": ":38367" } ] }

root@kitploit:~
- الآن، يمكن الآن إجراء الاتصال عن طريق الاستدعاء:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -j localhost:8001

سيؤدي هذا إلى إنشاء قفزة واحدة من موقع إلى آخر، ويمكن تعريف مسارات أكثر تعقيدًا باستخدام الخيار -a مع سلسلة JSON تحدد المسار.

بعد بضع ثوانٍ، يجب أن يكون هناك مفتاح متاح يمكن اختباره عن طريق طلب مفتاح.

ملاحظة: يجب أن تكون المعلمة -k هي عنوان URL الموضح في تفاصيل الموقع الثاني، وليس "localhost:8001"```bash ./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -k hostname:8001

root@kitploit:~
يمكن إيقاف الرابط باستخدام أمر unjoin:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001

لاحظ أن المفتاح لا يزال متاحًا على الرغم من توقف التوليد، طالما أن عوامل الموقع قيد التشغيل. يمكن طلبه باستخدام أمر طلب المفتاح نفسه أعلاه.

مثال التشفير

بعد تشغيل عوامل الموقع وبرامج التشغيل على نفس الكمبيوتر المحلي كما هو موضح أعلاه وبعد بدء رابط تبادل المفاتيح، يمكن أيضًا اختبار ميزات التشفير.

  • أولاً، ابدأ جانبًا واحدًا من "VPN" على البوب الذي سيستمع على المنفذ 9010 ويتصل بمخزن مفاتيح بوب:``` ./src/Tools/QTunnelServer/QTunnelServer -p 9010 --keystore-url=hostname:8001
root@kitploit:~
الآن ابدأ جانب Alice من 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

root@kitploit:~
وواحد على الآخر:```
nc localhost 9001

أي شيء يُكتب في أحد الجانبين سيظهر على الجانب الآخر عند الضغط على Enter. فحص الحزم التي تمر عبر المنفذين 9000 و 9001 باستخدام أداة مثل Wireshark سيُظهر البيانات المشفرة ومعرف المفتاح المستخدم.

يمكن إنشاء أشكال أخرى من الاتصال بدلاً من tcpserv:

| مثال | الوصف | | ============================= | ===================================================== | | tcpserv://0.0.0.0:1234 | يتم إنشاء منفذ استماع على المنفذ 1234 | | tcp://127.0.01:1234 | يتم إنشاء اتصال بمنفذ TCP 1234 على المضيف المحلي | | 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 | يتم إنشاء جهاز نقر على مستوى الإيثرنت | | eth://eth0/?level=tcp | إنشاء مأخذ توصيل خام، يمكن أن يكون المستوى tcp أو ip أو eth. |

التقدم

الميزات المخطط لها والمكتملة

  • برامج تشغيل الأجهزة
    • برامج تشغيل التوافق لـ IDQ Clavis 2
      • ردود فعل الجهاز
    • برامج تشغيل التوافق لـ IDQ Clavis 3
    • جهاز الفضاء الحر المحمول بجامعة بريستول
    • جهاز على شريحة بجامعة بريستول
  • المعالجة اللاحقة
    • المحاذاة للأنظمة غير المتزامنة
    • الغربلة للأنظمة المتزامنة
    • تصحيح الأخطاء
    • تضخيم الخصوصية
  • إدارة المفاتيح متعددة المواقع (وكلاء الموقع)
    • التحكم بأجهزة QKD لتبادل المفاتيح
    • توفير مفتاح مشترك مسبقًا على واجهة قياسية: cqp::remote::IKey
      • يمكن تقييد المفاتيح للاستخدام من قبل مستخدمين محددين

نأمل أن يكون هذا المشروع مفيدًا لكل من العمل البحثي العلمي والمشاريع الكبيرة. يمكن العثور على مزيد من التفاصيل حول المشروع في هذه الورقة.

للمساهمة في هذا المشروع، يُرجى الاطلاع على ملف المساهمة.

التثبيت

النظام يعمل حاليًا على لينكس - ويندوز مخطط له في المستقبل. أسهل طريقة حاليًا هي البناء من المصدر

صورة Docker

توجد صورة Docker جاهزة للتشغيل في [سجل gitlab][]. يمكنك تشغيلها باستخدام sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime. أضف أمرًا في النهاية لتشغيل شيء مباشرة، على سبيل المثال لتشغيل محاكاة لتوليد مفاتيح QKD باستخدام QKDSim:```bash sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime AlignmentTests

root@kitploit:~
### Ubuntu 18.04+

يمكنك تثبيت الحزم الثنائية من [Gitlab](https://gitlab.com/QComms/cqptoolkit/-/jobs/artifacts/master/download?job=package%3Adeb). قم باستخراج ملف zip وتثبيت الأدوات باستخدام `dpkg`، سيشكو من التبعيات المفقودة لكن لا تقلق، السطر الثاني سيقوم بإصلاحها.```bash
sudo dpkg -i setup/*.deb build/gcc/CQP-*-Linux-{Algorithms,Networking,CQPToolkit,KeyManagement,QKDInterfaces,CQPUI,Simulate,Tools,UI,Drivers,IDQDevices}.deb
sudo apt install -fy

لتثبيت ملفات التطوير (الرؤوس والمكتبات الثابتة) قم بتشغيل sudo dpkg -i build/gcc/CQP-*-Linux-*-dev.deb ; sudo apt install -fy بدلاً من ذلك.

من المصدر

بالطبع، إذا كنت لا تريد تغيير إصدارات مكتبات النظام والتبعيات، يمكنك البناء داخل حاوية دوكر والتي تحتوي بالفعل على جميع التبعيات المثبتة باستخدام:```bash sudo docker run -it registry.gitlab.com/qcomms/cqptoolkit/buildenv

root@kitploit:~
خلاف ذلك، يتطلب البناء من المصدر تثبيت التبعيات المدرجة في `setup/setupbuild.sh`، وهو يعمل حاليًا على Ubuntu و Arch Linux.

استنسخ المصدر من [gitlab](https://gitlab.com/QComms/cqptoolkit.git) باستخدام [git][] ثم ابنِ باستخدام [CMake][] و [gnu make](https://www.gnu.org/software/make/):
يضيف `--recurse-submodules` الإضافات الاختيارية - الوصول إلى بعضها مقيد بـUoB وشركائها، لكن البناء سيعمل بدونها.```bash
git clone --recurse-submodules https://gitlab.com/QComms/cqptoolkit.git

إذا كنت ترغب في الحصول على جميع الوحدات الفرعية، ولديك بيانات الدخول المناسبة، قم بتشغيل:```bash git submodule update --checkout

root@kitploit:~
الآن، يمكنك الذهاب إلى المستودع المحلي الخاص بك وتثبيت التبعيات باستخدام السكريبت (ربما تحتاج إلى تغيير صلاحيات الملف):```bash
cd cqptoolkit/setup
./setupbuild.sh

ثم، يمكنك بناء المشروع في مجلد جديد:```bash mkdir build-cqptoolkit cd build-cqptoolkit cmake ../cqptoolkit && nice make -s -j

this can be installed with

sudo make install

root@kitploit:~
يستخدم البناء [CMake][] لإنشاء ملفات makefile/حلول إلخ لمنصات مختلفة ويتم استدعاؤه من مجلد بناء فارغ يحتوي على جميع ملفات المخرجات. ستنتج إصدارات التصحيح حزمًا تنتهي بالحرف "D".
يمكن التحكم في البناء عن طريق تمرير خيارات إلى cmake، مثل `-DBUILD_TESTING=OFF`. قم بتشغيل cmake مع الخيار `-LH` لعرض المفاتيح المتاحة.

لإجراء تغييرات وتطوير المكتبة، يُنصح بتثبيت [QT Creator](http://doc.qt.io/qtcreator/) وفتح المشروع عن طريق [اختيار ملف CMakeLists.txt](https://codeyarns.com/2016/01/26/how-to-import-cmake-project-in-qt-creator/). يُفضل استخدام البناء المتوازي بالذهاب إلى Projects->Build Steps-> Details وإضافة `-j<number>` إلى معلمات الأداة، انظر [so](https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator). بعد البناء، تكون الملفات افتراضيًا في نفس مستوى مجلد المشروع باسم `build-<اسم المشروع>-<المنصة>-<الهدف>`.

> **ملاحظة حول protobuf + QT على Ubuntu**
> المكتبة `qt5-gtk-platformtheme` مرتبطة بإصدار قديم من protobuf مما سيمنع تشغيل برامج QT الخاصة بنا.
> يمكن إزالة هذا الاعتماد الاختياري باستخدام `apt-get remove qt5-gtk-platformtheme`

## استكشاف المكتبة

    @startuml
        title Applicaiton Overview

        component "QKD Device Drivers" as drv
        interface IDevice as idev
        drv - idev

        component "Device contol and\n Key storage" as sa
        interface IKey as ikey
        sa - ikey
        sa ..> idev

    package "Key consumers" as kc {
        component "Custom VPN" as tun
        component "Custom\nWeb Server" as nginx
        component "HSM bridge" as hsm
    }
    tun ..> ikey
    nginx ..> ikey
    hsm ..> ikey

    package Utilities {
        component "Config/Control GUI" as gui
        component "Simulators/Testing" as sim
        component "Data extraction" as stats

        gui -[hidden]down- sim
        sim -[hidden]down- stats
    }
    @enduml

أدناه مخطط انسيابي للمساعدة في العثور على المنطقة ذات الصلة بك، حيث يغطي المشروع جوانب مختلفة من QKD وإدارة المفاتيح - نرحب بالمساهمين لدفع هذا المشروع ليكون أكثر تخصصًا.
تتطلب QKD شكلاً من أشكال الاتصال [غير المستنسخ](https://en.wikipedia.org/wiki/No-cloning_theorem)، عادةً باستخدام فوتونات فردية عبر كابل ألياف بصرية. يمكنها العمل نقطة إلى نقطة أو واحد إلى متعدد ولكنها بطبيعتها لها موقع مادي (حيث تنتهي الألياف) - لا يمكن افتراضيتها! النقطة التي يتم عندها إرسال الفوتون أو اكتشافه هي حدود النظام الآمن - تقريبًا مثل [جدار الحماية](https://en.wikipedia.org/wiki/Firewall_(computing)) للشبكة. بمجرد تحويل الفوتونات غير القابلة للتقسيم إلى سلسلة من البتات لتشكيل [مفتاح متماثل](https://en.wikipedia.org/wiki/Key_(cryptography))، تنطبق القواعد القياسية لأمن الكمبيوتر مثل المصادقة والتحكم في الوصول وما إلى ذلك. الفرق هو أنه بمجرد إنتاج هذه المفاتيح، يكون لكل جهاز من أجهزة QKD رقم [لا يعرفه أحد آخر](https://en.wikipedia.org/wiki/Shared_secret) [مثبت علميًا](https://arxiv.org/pdf/quant-ph/0003004.pdf).

طبيعة تأثير "جدار الحماية" هذا هي أن الأنظمة التي تتحكم في أجهزة QKD تحتاج إلى أن تكون آمنة وتعتبر موثوقة - وتسمى أيضًا "العقدة الموثوقة" - حيث وكيف ترسم الخط يمكن أن يتراوح من الحراس المسلحين إلى مجرد [قفل باب غرفة الخادم](https://www.youtube.com/watch?v=rnmcRTnTNC8).

إذا لم تتمكن من رؤية المخطط أدناه، يرجى الانتقال إلى [التوثيق عبر الإنترنت](https://qcomms.gitlab.io/cqptoolkit/)، يمكن أيضًا بناؤه بواسطة الهدف `doc`.

    @startuml
    title Where to start \n

    skinparam activity {
      StartColor #EF476F
      BarColor #FFD166
      EndColor #EF476F
      BackgroundColor #06D6A0
      BorderColor #118AB2
    }

    start
    if (Do you have a QKD Device?) then (Yes)
        if (Does your QKD device have a driver?) then (No)
            :You will need to [[./index.html#CreatingDrivers create a driver]] which implements the
            <b>IDriver</b> and <b>IReporting</b> interfaces.;
            if (Use the library?) then (Yes)
                :See the [[./index.html#RunningDummyQKDDriver DummyQKDDriver]] for an example.;
            else (No)
            endif
        else (Yes)
        endif
    else (No)
        :Check out how to run the
        [[./index.html#RunningDummyQKDDriver DummyQKDDriver]];
    endif

    if (Do you want keys for multiple
    locations in a network?) then (Yes: Sites)
        :[[./index.html#Registering Register your driver]] with the site agent
        using the <b>ISiteAgent</b> Interface
        Keys can be obtained by using the [[./index.html#IKeyInterface IKey]] interface;

        if(Do you want keys to be stored/persist between restarts?) then (Yes)
            if (Do the keys need to be secured?) then (Yes)
                :Use the [[./index.html#HSMs HSM storage]] options;
                if (Is your HSM supported?) then (No)
                    :Create a driver that implements
                    the <b>IBackingStore</b> interface.
                    Add the driver creation to the
                    <b>BackingStoreFactory</b>;
                else (Yes)
                endif
            else (No)
                : When running SiteAgentRunner,
                use the option ""-b file"" or
                set ""backingStoreUrl"" to
                ""file:///filename.db"";
            endif
        else (No)
        endif
    else (No: Point-to-Point)
        :Use the [[./index.html#IDeviceInterface IDevice interface]] to
        control the driver for your system.
        As keys become available they will
        be sent via the call to <b>WaitForSession</b>.;
    endif

    if (Do you want to use the key for anything?) then (Yes)
        :See the [[./index.html#Encryption encryption section]]
        for an example of using the [[./index.html#IKeyInterface IKey interface]];
    else (No)
    endif
    stop

    @enduml


### تشغيل DummyQKDDriver <a name="RunningDummyQKDDriver" />

هذا القسم هو مجرد تعليق على الوظيفة المفيدة لـ DummyQKDDriver لمحاكاة مخرجات جهاز QKD. يرجى الرجوع إلى القسم التالي للحصول على مثال إرشادي لإعداد رابط بسيط باستخدامها.
كما هو الحال مع معظم البرامج، فإن تمرير `-h` إليه سيعرض الخيارات المتاحة. يقوم DummyQKDDriver بتشغيل مجموعة قياسية من خطوات المعالجة اللاحقة على اكتشافات الفوتون المحاكاة باستخدام فئة cqp::DummyQKD. يجب أن يكون هناك مثيلان للبرنامج قيد التشغيل، واحد لـ Alice وآخر لـ Bob.

قم بتشغيل Bob أولاً على المنفذ 8000 عن طريق استدعاء:```bash
DummyQKDDriver -b -k 0.0.0.0:8000

الآن قم بتشغيل Alice، مع إخبارها بالاتصال بـ Bob وبدء تبادل المفتاح (في الوضع اليدوي):```bash DummyQKDDriver -a -m localhost:8000

root@kitploit:~
إذا نجح الأمر، فستحصل على فيض من رسائل الخطأ مثل هذه: `ERROR: OnKeyGeneration No listener for generated key`. وذلك لأنه عند تشغيل النظام بهذه الطريقة، من الجيد رؤيته يقوم بشيء ما، لكنه ليس مفيدًا جدًا، فلا يوجد مكان لوضع المفتاح الذي تم إنشاؤه. صُممت المشغلات لاستخدامها بواسطة شيء ما.
يحتوي المشروع على نظام لإدارة المفاتيح يُسمى [وكلاء الموقع](#SiteAgents) أو يمكنك التواصل مع المشغلات مباشرة باستخدام [واجهة IDevice](#IDeviceInterface)

### تكوين وكلاء الموقع <a name="SiteAgents" />

يحتاج وكلاء الموقع والمشغلات وأنفاق VPN إلى تحديد معايير لكل عقدة في الشبكة باستخدام ملفات سلسلة JSON، حيث أن الأمر الافتراضي بدون وسائط لا يحدد جميع الحقول الضرورية افتراضيًا ولا يعمل إلا للاختبار على نفس الجهاز المحلي.

يمكن تشغيل وكلاء الموقع باستخدام SiteAgentRunner، يمكننا تشغيل موقعين باستخدام:```bash
SiteAgentRunner -c site-a.json

و:```bash SiteAgentRunner -c site-b.json

root@kitploit:~
مع كل ملف JSON يشير بشكل مناسب إلى منفذ مختلف لـ Alice و Bob (على سبيل المثال 9000/9001). يبدو سلسلة JSON كما يلي:```json
		{
		    "name":"",
		    "id":"",
		    "netManUri":"",
		    "bindAddress":"0.0.0.0",
		    "listenPort":9000,
		    "connectionAddress":"",
		    "credentials": {},
		    "useAutoDiscover":false,
		    "backingStoreUrl":"",
		    "fallbackKey":""
		}

الآن يمكننا إرفاق DummyQKDDriver's الخاص بنا، واحد لكل موقع:```bash DummyQKDDriver -c driver_config-a.json # run as Alice, register with site agent

root@kitploit:~
و:```bash
DummyQKDDriver -c driver_config-b.json # run as Bob, register with site agent

مع كل ملف JSON يشير بشكل مناسب إلى منفذ مختلف لـ Alice و Bob (على سبيل المثال 9000/9001). تبدو سلسلة JSON كما يلي:```json {
"controlParams": { "config": { "id": "dummyqkd__0__16_alice", "side": "Alice", "switchName": "", "switchPort": "", "kind": "dummyqkd", "bytesPerKey": 0 }, "controlAddress": "'hostnameIP':4423", "siteAgentAddress": "127.0.0.1:9000" }, }

root@kitploit:~
> يمكن أن يكون حقل عنوان التحكم 0.0.0.0:0 إذا لم يكن هناك جدار ناري للتعامل معه. إذا كان الأمر كذلك، فيجب الإشارة إلى عنوان IP الفعلي للمضيف واختيار منفذ مناسب لن يقوم جدار النار بحظره.

لن يحدث شيء بعد لأن عوامل الموقع لا تعرف ماذا تفعل بهذه الأجهزة. يمكننا توجيههم لبدء إنشاء المفاتيح (-b كبداية) عن طريق إرسال الأمر cqp::ISiteAgent::StartNode:```bash
SiteAgentCtl -c localhost:9000 -b '{"hops":[{"first":{"site":"'hostname':9000","deviceId":"dummyqkd__0__16_alice"},"second":{"site":"'hostname':9001","deviceId":"dummyqkd__0__16_bob"}}]}'

يجب أن تكون أجهزة الكمبيوتر قادرة على تحليل أسماء المضيفات ويجب استخدام هذا بدلاً من عنوان IP الثابت. لذا ينبغي تعديل ملف /etc/hostnames على كلا الجهازين إذا لم يكن الأمر كذلك.

هذه طريقة طويلة لقول توصيل A بـ B لكنها قوية جدًا، مما يسمح بتحديد قفزات متعددة لإنتاج مفتاح آمن من طرف إلى طرف من سلسلة من الأجهزة. يمكن تحديد سلسلة JSON هذه في حقل التكوين "staticHops" في وكلاء الموقع للسماح بحدوث ذلك تلقائيًا بمجرد توفر جميع الأجهزة. يمكن بعد ذلك إيقاف الرابط باستخدام:```bash SiteAgentCtl -c localhost:9000 -e '{"hops":[{"first":{"site":"'hostname':9000","deviceId":"dummyqkd__0__16_alice"},"second":{"site":"'hostname':9001","deviceId":"dummyqkd__0__16_bob"}}]}'

root@kitploit:~
> لاحظ استخدام `-e` بدلاً من `-b` لـ *إنهاء* الرابط بدلاً من *بدئه*.

يمكن تحقيق إعدادات أكثر تعقيداً من خلال تنفيذ واجهة cqp::remote::INetworkManager بنفسك لإصدار الأوامر. تأتي التعليقات من الأجهزة عبر واجهة cqp::remote::IReporting على نفس المقبس بحيث يمكنك التفاعل مع التغييرات في النظام. [هنا](#Reporting) يمكنك رؤية كيفية استخراج البيانات من واجهة التقارير باستخدام أداة StatsDump.

### إنشاء برامج التشغيل <a name="CreatingDrivers" />

تطبيق برنامج التشغيل هو جسر بين واجهات الجهاز الداخلية (cqp::IQKDDevice) والواجهة الخارجية cqp::remote::IDevice. تقوم فئة cqp::RemoteQKDDevice بمعالجة معظم العمل نيابة عنك، ويجب على التطبيق التعامل مع تكوين الجهاز وإنشائه.

العمل الحقيقي هو في إنشاء برنامج تشغيل لإعداد الجهاز وقراءة المفتاح. إذا كان جهازك ينتج اكتشافات خام فقط، فستحتاج إلى تكوين [خط أنابيب معالجة](#ProcessingPipelines) مثل cqp::DummyQKD أو cqp::PhotonDetectorMk1 و cqp::LEDAliceMk1. إذا كان جهازك يولد مفتاحًا جاهزًا للاستخدام مثل cqp::Clavis3Device، فأنت بحاجة إلى قراءته ونشره عبر واجهة cqp::IKeyCallback (استخدم cqp::KeyPublisher).

كلا النهجين يتطلبان شكلاً من إدارة الجلسة، يتم توفيره بواسطة cqp::session::SessionController و cqp::session::AliceSessionController، حيث يقومان بتنفيذ واجهتي cqp::ISessionController و cqp::remote::ISession ويتم استخدامهما بواسطة cqp::RemoteQKDDevice لبدء وإيقاف الجهاز ونظيره. هذه عادةً كل ما هو مطلوب ولكن في بعض الحالات يحتاجان إلى التخصص لمواكبة متطلبات الجهاز.

    @startuml Readme_Drivers
    title Anatomy of a driver
        package Application {
            namespace cqp #DDDDDD {
                class RemoteQKD
                interface IQKDDevice {
                    GetSessionController()
                }
                class "SessionController" as session
                interface "IDetector::Service" as detServ {
                    StartDetecting()
                    StopDetecting()
                }
                class "Provider<IDetectionEventCallback>" as provider {
                    Attach()
                    Dettach()
                    Emit()
                }

                RemoteQKD .r.> IQKDDevice : uses
                IQKDDevice -r[hidden]-> session
            }
            class Main {
                main()
            }
            class MyDriver
            class Detector

            MyDriver .u.|> cqp.IQKDDevice
            MyDriver o-u-> cqp.session
            Detector .u.|> cqp.detServ
            Detector -u-|> cqp.provider

            Main o-> MyDriver
            MyDriver o-> Detector
            Main o-u-> cqp.RemoteQKD

            note bottom of MyDriver
                In this case the driver is a simple detector
                which produces detection. Post processing detail not shown.
                MyDriver pull together all the parts to run the driver.
            end note

            note bottom of Detector
                The detector controls the device
                and outputs the data using the Provider
            end note
        }
    @enduml

### تسجيل برنامج تشغيل <a name="Registering" />

في وقت كتابة هذا، يمكن تسجيل جميع برامج التشغيل مع وكيل الموقع باستخدام المفتاح `-r`. يؤدي ذلك إلى جعل cqp::RemoteQKDDevice يستدعي cqp::remote::ISiteAgent::RegisterDevice على cqp::SiteAgent، ثم يستخدم واجهة cqp::remote::ISession لبدء/إيقاف الجهاز.

### واجهة IDevice <a name="IDeviceInterface" />

تتيح هذه الواجهة وصولاً أكثر مباشرة إلى الجهاز بدلاً من المرور عبر وكلاء الموقع. يتم إرجاع المفاتيح التي يولدها الجهاز فوراً إلى المتصل. قم أولاً باستدعاء cqp::remote::IDevice::WaitForSession، ثم cqp::remote::IDevice::RunSession. اتصل بـ cqp::remote::IDevice::EndSession لإيقاف توليد المفاتيح.

### وحدات أمان الأجهزة (HSMs) <a name="HSMs" />

[وحدات أمان الأجهزة (HSMs)](https://en.wikipedia.org/wiki/Hardware_security_module) هي أجهزة تخزين تعمل كخزائن رقمية آمنة مادياً. توجد واجهة قياسية لها تسمى [PKCS#11](https://en.wikipedia.org/wiki/PKCS_11). لكل مصنع واجهاته الخاصة ودعم PKCS#11 غير مؤكد، ومع ذلك هناك تطبيق برمجي نستخدمه كمرجع يسمى [SoftHSM2](https://www.opendnssec.org/softhsm/). توفر فئة cqp::keygen::HSMStore تطبيقاً يربط cqp::SiteAgent مع واجهة cqp::IBackingStore.

### واجهة IKey <a name="IKeyInterface" />

توفر المواقع مفاتيح للعديد من نقاط النهاية (يمكن استرداد مخازن المفاتيح المتاحة عن طريق استدعاء cqp::remote::IKey::GetKeyStores)، ويمكن طلبها باستخدام واجهة cqp::remote::IKey. بمجرد طلب مفتاح جديد، يمكن للطرف الآخر استرداده فقط كمفتاح موجود - وهذا يمنع التعارض وسوء استخدام المفاتيح.

### التشفير <a name="Encryption" />

يمكن العثور على مزيد من التفاصيل حول التطبيقات المحددة في:
* [Tunnels](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/Tunnels.md)

### التقارير <a name="Reporting" />

يتم نشر التغييرات في القيم في النظام خارجياً عبر واجهة cqp::remote::IReporting وداخلياً باستخدام فئة cqp::stats::Stat. يمكنك التسجيل للحصول على جميع الإحصائيات عن طريق استدعاء cqp::remote::IReporting::GetStatistics مع تعيين حقل cqp::remote::ReportingFilter::listIsExclude على `true` أو يمكن تحديد عوامل تصفية محددة.

### خطوط أنابيب المعالجة <a name="ProcessingPipelines" />

يتطلب بروتوكول [BB84 QKD](https://en.wikipedia.org/wiki/BB84) القياسي خطوات معالجة لاحقة لتحويل الاكتشافات الخام إلى مفاتيح قابلة للاستخدام.

- **المحاذاة** إيجاد بداية ونهاية الإرسال الحقيقي.
    + ضبط فروق التوقيت/الانحراف إلخ.
    + تعويض الفروق في الطور أو غيرها بين المرسل والمستقبل، إلخ
- **الغربلة** التخلص من الاكتشافات غير الصالحة
- **تصحيح الأخطاء** تصحيح الاكتشافات غير الصحيحة - دون الكشف عن القيم
- **تكثيف الخصوصية** تجزئة المفتاح لجعل أي بتات تم الكشف عنها غير مجدية

يمكن رؤية مثال على خط أنابيب المعالجة في cqp::DummyQKD::ProcessingChain.

## Building

تتم إدارة عمليات البناء بواسطة [نظام التكامل المستمر](https://about.gitlab.com/product/continuous-integration/) في GitLab المعرفة في ملف `.gitlab-ci.yml`.

يمكن بناء صور Docker يدويًا عن طريق تشغيل `setup/makeDocker.sh`.

### Windows

هذا العمل قيد التقدم. تم اختبار هذا الإعداد على Windows 10 و Windows Server 2016 مع Visual Studio 15 (2016). التكوينات التالية مدعومة:

| نظام التشغيل | VS 2017   | QT Creator    | Codeblocks    |
|:----------|-----------|---------------|---------------|
| Linux     |           | gcc           | gcc           |
| Windows   | MSVC      | MSVC / MSYS2  | MSYS2-Mingw   |

#### IDE

- [Visual Studio 2016][]
    + قم بتشغيل البرنامج النصي [InstallVcPkg.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/InstallVcPkg.bat) مرة واحدة لتثبيت vcpkg في C:\vcpkg
    + قم بتشغيل البرنامج النصي [SetupMSBuild.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/SetupMSBuild.bat)
    + افتح الحل [cqp.sln](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/cqp.sln)
    + اختر Build->Solution
- [QT Creator for windows][]
    + يمكن لـ QT Creator استخدام إما مترجم Microsoft الأصلي أو MSYS2. قم بتثبيت MSYS2 بشكل منفصل، لا تحتاج إلى تثبيت مترجم minGW الذي يأتي مع مثبت QTCreator. أو قم بتثبيت [Windows 10 SDK][]
    + ضمن قائمة المكونات، حدد المكونات للمترجم الذي تستخدمه. على سبيل المثال msvc2017
    + باستخدام "Open Project"، حدد ملف `CMakeLists.txt` في قاعدة شجرة المصادر.
- [MSYS2][] and [Codeblocks][]
    + قم بتثبيت حزمة [MSYS2][].
    + قم بتشغيل البرنامج النصي [installMSYS2Dependencies.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/installMSYS2Dependencies.bat)
    + ضمن Settings->Debugger -> "Create config" باسم "MSYS2 GDB"
        - قم بتغيير المصحح ليشير إلى gdb.exe (مثال: C:\\msys64\\mingw64\\bin\\gdb.exe)
    + ضمن Settings->Compiler
        + انسخ إعدادات مترجم GCC، أطلق عليه "GCC - Old"
        + قم بتغيير دليل تثبيت سلسلة الأدوات إلى موقع تثبيت mingw64 الخاص بـ MSYS2 (مثال: C:\\msys64\\mingw64)
        + في كل حقل ضمن "Program Files" باستثناء برنامج "make"، قم بإزالة البادئة `mingw32-`.
        + في حقل make، أضف المفتاح -j للسماح بالبناء متعدد النوى: `mingw32-make.exe -j`
        + حدد المصحح "MSYS2 GDB" الذي تم إنشاؤه سابقاً
        + إذا كنت تفضل مخرجات قابلة للقراءة من المترجم، قم بتعيين "Other Settings"->"Compiler Logging" إلى "Task   description"
    + في دليل بناء CodeBlock (\build\CodeBlocks)
    + قم بتشغيل ملف `SetupCodeBlocks-MSYS2.bat`
    + افتح ملف مشروع CodeBlocks "CQP.cbp".

إذا كان ملف مشروعك يحتوي على هيكل مجلدات عميق (هذا خلل)، يمكن تحسينه عن طريق النقر بزر الماوس الأيمن على مساحة العمل و:
- إلغاء تحديد "Display folders as on disk"
- تحديد "Hide Folder Name"

## الاستشهاد بهذا البرنامج```
@Manual{,
title = {CQPToolkit: A QKD toolkit library},
author = {{Richard Collins, University of Bristol, UK}},
organization = {University of Bristol},
address = {Bristol, UK},
year = 2018,
url = {https://gitlab.com/QComms}
}

قراءة إضافية

لمزيد من التفاصيل حول كتابة الكود لمجموعة الأدوات، اطلع على دليل البرمجة للأسئلة والمشاكل، راجع الأسئلة الشائعة

تنزيل الأداة
  • إنشاء مفتاح غير مباشر بناءً على XOR لمفاتيح من مواقع أخرى
  • التكوين عبر ملف الإعدادات، وسيطات سطر الأوامر أو واجهة الشبكة.
  • اكتشاف وكلاء الموقع تلقائيًا باستخدام Zeroconf
  • حل المفاتيح عبر الروابط بين المواقع الموثوقة (القضية رقم 8)
  • إدارة الشبكة لوكلاء الموقع
    • يمكن التحكم بالمواقع عبر الواجهات
    • التحكم الثابت/الديناميكي بوكلاء الموقع لإنشاء مفاتيح بين المواقع بناءً على قواعد
  • وحدة تحكم النفق المشفر (مثل stunnel)
    • يستخدم واجهة IKey للحصول على المفاتيح المشتركة.
    • إعداد أنفاق التشفير باستخدام
      • مأخذ TCP/UDP
      • جهاز TUN/TAP (المعروف أيضًا باسم VPN)
      • واجهة فعلية مخصصة
    • التكوين عبر ملف الإعدادات، وسيطات سطر الأوامر أو واجهة الشبكة.
    • اكتشاف وكلاء الموقع ووحدات تحكم النفق تلقائيًا باستخدام Zeroconf
  • منصات متعددة
    • لينكس
    • ويندوز (انظر القضية رقم 2)