
إطار عمل للتحكم في أجهزة QKD وإدارة المفاتيح المتناظرة. انظر [صفحة المشروع هنا](https://qcomms.gitlab.io/cqptoolkit/)
يوفر النظام مكونات متنوعة لدمج QKD في نظام أمني. وهو مكتوب بلغة C++11 ولكنه يستخدم واجهات [GRPC][] مما يسمح بالدمج مع الكثير من اللغات المختلفة.
لتشغيل البرنامج محليًا، إما:
لاستنساخ المصدر بما في ذلك الوحدات الفرعية:```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" عن طريق بدء site agent وتوصيل Alice "dummy driver" به: (إذا تم تثبيت الملفات الثنائية، فاحذف المسارات إلى الأوامر من التعليمات.)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a
Please provide the Markdown content to translate.```bash
./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8001 &
./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8001 -b
لن يبدأ هذا في إنتاج المفتاح فورًا حيث أن هذا النظام مصمم ليكون تحت سيطرة نظام إدارة، يجب إنشاء الاتصال باستخدام الأمر SiteAgentCtl.
والذي يجب أن ينتج شيئًا مشابهًا لهذا افتراضيًا، إذا تم إطلاق *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"
}
]
}
- الآن، يمكن الآن إجراء الاتصال عن طريق الاستدعاء:```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 -khostname:8001
يمكن إيقاف الرابط باستخدام أمر unjoin:```bash
./src/Tools/SiteAgentCtl/SiteAgentCtl -c localhost:8000 -u localhost:8001
لاحظ أن المفتاح لا يزال متاحًا على الرغم من توقف التوليد، طالما أن عوامل الموقع قيد التشغيل. يمكن طلبه باستخدام أمر طلب المفتاح نفسه أعلاه.
مثال التشفير
بعد تشغيل عوامل الموقع وبرامج التشغيل على نفس الكمبيوتر المحلي كما هو موضح أعلاه وبعد بدء رابط تبادل المفاتيح، يمكن أيضًا اختبار ميزات التشفير.
hostname:8001الآن ابدأ جانب 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
وواحد على الآخر:```
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. |
الميزات المخطط لها والمكتملة
نأمل أن يكون هذا المشروع مفيدًا لكل من العمل البحثي العلمي والمشاريع الكبيرة. يمكن العثور على مزيد من التفاصيل حول المشروع في هذه الورقة.
للمساهمة في هذا المشروع، يُرجى الاطلاع على ملف المساهمة.
النظام يعمل حاليًا على لينكس - ويندوز مخطط له في المستقبل. أسهل طريقة حاليًا هي البناء من المصدر
توجد صورة 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
### Ubuntu 18.04+