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/)

रिपॉजिटरी देखें
614 साल पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें
वेबसाइट

CQP टूल किट

यह सिस्टम सुरक्षा प्रणाली में QKD को एकीकृत करने के लिए विभिन्न घटक प्रदान करता है। यह C++11 में लिखा गया है लेकिन GRPC इंटरफ़ेस का उपयोग करता है इसलिए इसे विभिन्न भाषाओं के साथ एकीकृत किया जा सकता है।

त्वरित आरंभ

सॉफ्टवेयर को मूल रूप से चलाने के लिए, या तो:

  • Ubuntu deb पैकेज डाउनलोड और इंस्टॉल करें या
  • स्रोत को क्लोन करें, सबमॉड्यूल को अपडेट करना सुनिश्चित करें और स्थानीय रूप से बिल्ड करें

सबमॉड्यूल सहित स्रोत को क्लोन करने के लिए:```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" को एक साइट एजेंट शुरू करके और उससे एक एलिस "डमी ड्राइवर" कनेक्ट करके शुरू करें: (यदि बाइनरी स्थापित हो चुके हैं, तो निर्देशों से कमांड के पथ हटा दें।)```bash ./src/Tools/SiteAgentRunner/SiteAgentRunner -p 8000 & ./src/Drivers/DummyQKDDriver/DummyQKDDriver -r localhost:8000 -a

root@kitploit:~
## पर्यावरण सेटअप

### पर्यावरण चर```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

यह एक साइट से दूसरी साइट तक एक single hop बनाएगा, फिर से -a विकल्प का उपयोग करके पथ निर्दिष्ट करने वाली JSON स्ट्रिंग के साथ अधिक जटिल रूट परिभाषित किए जा सकते हैं।

कुछ सेकंड के बाद एक key उपलब्ध होनी चाहिए, जिसे key का अनुरोध करके परखा जा सकता है।

नोट: -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:~
- अब 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

एक तरफ टाइप की गई कोई भी चीज़ एंटर दबाने पर दूसरी तरफ दिखाई देगी। पोर्ट 9000 और 9001 के माध्यम से यात्रा करने वाले पैकेटों का wireshark जैसे उपकरण से निरीक्षण करने पर डेटा एन्क्रिप्टेड और उपयोग किए गए कुंजी आईडी को दिखाएगा।

tcpserv के बजाय कनेक्शन के अन्य रूप बनाए जा सकते हैं:

| उदाहरण | विवरण | | ============================= | ===================================================== | | tcpserv://0.0.0.0:1234 | पोर्ट 1234 पर एक श्रवण पोर्ट बनाया जाता है | | tcp://127.0.01:1234 | लोकलहोस्ट पर टीसीपी पोर्ट 1234 से एक कनेक्शन बनाया जाता है | | udp://0.0.0.0:1234 | इस पोर्ट से यूडीपी पैकेट भेजे जाते हैं | | tun://192.168.101.1/?netmask=255.255.255.0 | एक आईपी स्तर का टनल डिवाइस एक आईपी पते के साथ बनाया जाता है | | 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
      • कुंजियों को विशिष्ट उपयोगकर्ताओं द्वारा उपयोग के लिए प्रतिबंधित किया जा सकता है

उम्मीद है कि यह परियोजना वैज्ञानिक अनुसंधान कार्य और बड़ी परियोजनाओं दोनों के लिए उपयोगी साबित हो सकती है। परियोजना के बारे में अधिक जानकारी इस पेपर में पाई जा सकती है।

इस परियोजना में योगदान करने के लिए कृपया योगदान फ़ाइल देखें।

स्थापना

सिस्टम वर्तमान में लिनक्स पर काम करता है - भविष्य में विंडोज की योजना है। फिलहाल सबसे आसान स्रोत से निर्माण करना है

डॉकर इमेज

gitlab registry में एक चलने के लिए तैयार डॉकर इमेज है। आप sudo docker run -it --rm registry.gitlab.com/qcomms/cqptoolkit/runtime के साथ चला सकते हैं। अंत में एक कमांड जोड़कर सीधे कुछ चलाएं, उदाहरण के लिए QKDSim के साथ QKD कुंजी पीढ़ी का सिमुलेशन चलाने के लिए:```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) से बाइनरी पैकेज स्थापित कर सकते हैं। ज़िप फ़ाइल निकालें और `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 के लिए काम करता है।

[git](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][] का उपयोग करके विभिन्न प्लेटफार्मों के लिए makefiles/समाधान/आदि तैयार करता है और इसे एक खाली बिल्ड फ़ोल्डर से चलाया जाता है जिसमें सभी आउटपुट फ़ाइलें होंगी। डीबग बिल्ड पैकेज तैयार करेंगे जिनके नाम में "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>` जोड़कर समानांतर बिल्ड का उपयोग करना उचित है, [देखें](https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator)।
बिल्ड होने के बाद फ़ाइलें, डिफ़ॉल्ट रूप से, प्रोजेक्ट फ़ोल्डर के समान स्तर पर `build-<project name>-<platform>-<target>` नामक फ़ोल्डर में होती हैं।

> **Ubuntu पर protobuf + QT के बारे में नोट**
> लाइब्रेरी `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" />

यह अनुभाग QKD उपकरण के आउटपुट का अनुकरण करने के लिए DummyQKDDriver की उपयोगी कार्यक्षमता पर एक टिप्पणी मात्र है। कृपया अगले अनुभाग को देखें जहाँ उनके साथ एक सरल लिंक स्थापित करने का एक मार्गदर्शित उदाहरण दिया गया है।
अधिकांश प्रोग्रामों की तरह, इसे `-h` पास करने से उपलब्ध विकल्प प्रदर्शित होंगे। DummyQKDDriver cqp::DummyQKD वर्ग का उपयोग करके अनुकरणित फोटॉन पहचान पर प्रसंस्करण के बाद के मानक चरणों का एक सेट चलाता है। प्रोग्राम के दो उदाहरण चलने चाहिए, एक एलिस के लिए और एक बॉब के लिए।

बॉब को पोर्ट 8000 पर पहले चलाएँ, इस प्रकार कॉल करें:```bash
DummyQKDDriver -b -k 0.0.0.0:8000

अब ऐलिस को चलाएँ, उसे बॉब से कनेक्ट करने और कुंजी का आदान-प्रदान शुरू करने के लिए कहें (मैनुअल मोड में):```bash DummyQKDDriver -a -m localhost:8000

root@kitploit:~
यदि यह काम करता है तो आपको इस तरह के त्रुटि संदेशों की बाढ़ आ जाएगी: `ERROR: OnKeyGeneration No listener for generated key`. ऐसा इसलिए है क्योंकि इस तरह से सिस्टम को चलाना यह देखने के लिए अच्छा है कि यह कुछ कर रहा है, लेकिन यह बहुत उपयोगी नहीं है, उत्पन्न कुंजी को रखने के लिए कोई जगह नहीं है। ड्राइवरों को किसी चीज़ द्वारा उपयोग करने के लिए डिज़ाइन किया गया है।
प्रोजेक्ट में कुंजियों के प्रबंधन के लिए [Site Agents](#SiteAgents) नामक एक प्रणाली है, या आप [IDevice interface](#IDeviceInterface) का उपयोग करके सीधे ड्राइवरों से बात कर सकते हैं।

### Site Agents को कॉन्फ़िगर करना <a name="SiteAgents" />

नेटवर्क के प्रत्येक नोड के लिए Site agents, ड्राइवर, और VPN टनल को JSON स्ट्रिंग फ़ाइलों के साथ पैरामीट्रिज़ करने की आवश्यकता होती है क्योंकि बिना तर्कों के डिफ़ॉल्ट कमांड डिफ़ॉल्ट रूप से सभी आवश्यक फ़ील्ड निर्दिष्ट नहीं करता है और केवल उसी स्थानीय मशीन पर परीक्षण के लिए काम करता है।

Site agents को 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 इंगित करना होगा और एक उपयुक्त पोर्ट चुनना होगा जिसे फ़ायरवॉल अवरुद्ध न करे।

अभी कुछ नहीं होगा क्योंकि साइट एजेंटों को पता नहीं है कि इन उपकरणों के साथ क्या करना है। हम उन्हें cqp::ISiteAgent::StartNode कमांड भेजकर कुंजी बनाना शुरू करने के लिए निर्देशित कर सकते हैं (-b शुरू करने के लिए):```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"}}]}'

कंप्यूटरों को होस्टनेम हल करने में सक्षम होना चाहिए और यहां हार्ड आईपी पते के बजाय इसका उपयोग किया जाना चाहिए। इसलिए यदि ऐसा नहीं है तो दोनों मशीनों पर /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::SiteAgent पर cqp::remote::ISiteAgent::RegisterDevice को कॉल करता है, फिर यह डिवाइस को शुरू/रोकने के लिए cqp::remote::ISession इंटरफ़ेस का उपयोग करेगा।

### IDevice इंटरफ़ेस <a name="IDeviceInterface" />

यह इंटरफ़ेस साइट एजेंटों के माध्यम से जाने की तुलना में डिवाइस तक अधिक सीधी पहुँच की अनुमति देता है। डिवाइस द्वारा उत्पन्न कुंजी तुरंत कॉलर को वापस दी जाती है। पहले cqp::remote::IDevice::WaitForSession को कॉल करें, फिर cqp::remote::IDevice::RunSession को। कुंजी उत्पन्न करना बंद करने के लिए cqp::remote::IDevice::EndSession को कॉल करें।

### HSM <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 में देखा जा सकता है।

## निर्माण

निर्माण gitlab [सतत एकीकरण प्रणाली](https://about.gitlab.com/product/continuous-integration/) द्वारा प्रबंधित किए जाते हैं जो `.gitlab-ci.yml` फ़ाइल में परिभाषित है।

डॉकर इमेज को `setup/makeDocker.sh` चलाकर मैन्युअल रूप से बनाया जा सकता है।

### विंडोज

यह कार्य प्रगति पर है।
यह सेटअप विंडोज 10 और विंडोज सर्वर 2016 पर विजुअल स्टूडियो 15 (2016) के साथ परीक्षण किया गया है।
निम्नलिखित कॉन्फ़िगरेशन समर्थित हैं

| ओएस        | VS 2017   | QT Creator    | Codeblocks    |
|:----------|-----------|---------------|---------------|
| Linux     |           | gcc           | gcc           |
| Windows   | MSVC      | MSVC / MSYS2  | MSYS2-Mingw   |

#### आईडीई

- [Visual Studio 2016][]
    + C:\vcpkg में vcpkg स्थापित करने के लिए [InstallVcPkg.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/vs2017_x64/InstallVcPkg.bat) स्क्रिप्ट एक बार चलाएं
    + [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) समाधान खोलें
    + बिल्ड->समाधान चुनें
- [QT Creator for windows][]
    + QT Creator या तो मूल Microsoft कंपाइलर या MSYS2 का उपयोग कर सकता है। MSYS2 को अलग से स्थापित करें, आपको QTCreator इंस्टॉलर के साथ आने वाले minGW कंपाइलर को स्थापित करने की आवश्यकता नहीं है। या [Windows 10 SDK][] स्थापित करें
    + घटक मेनू के अंतर्गत, अपने उपयोग किए जा रहे कंपाइलर के लिए घटक चुनें। जैसे msvc2017
    + "Open Project" का उपयोग करके, स्रोत ट्री के आधार पर `CMakeLists.txt` फ़ाइल चुनें।
- [MSYS2][] और [Codeblocks][]
    + [MSYS2][] पैकेज स्थापित करें।
    + [installMSYS2Dependencies.bat](https://gitlab.com/qcomms/cqptoolkit/-/blob/master/build/installMSYS2Dependencies.bat) स्क्रिप्ट चलाएं
    + सेटिंग्स->डीबगर के अंतर्गत -> "MSYS2 GDB" नामक "कॉन्फिग बनाएं"
        - डीबगर को gdb.exe की ओर इंगित करने के लिए बदलें (जैसे C:\\msys64\\mingw64\\bin\\gdb.exe)
    + सेटिंग्स->कंपाइलर के अंतर्गत
        + GCC कंपाइलर सेटिंग्स कॉपी करें, इसे "GCC - Old" नाम दें
        + टूलचेन इंस्टॉलेशन निर्देशिका को MSYS2 के mingw64 स्थापना स्थान पर बदलें (जैसे C:\\msys64\\mingw64)
        + "Program Files" के अंतर्गत प्रत्येक फ़ील्ड में, "make" प्रोग्राम को छोड़कर, `mingw32-` उपसर्ग हटाएं।
        + make फ़ील्ड में, मल्टी-कोर बिल्डिंग की अनुमति देने के लिए -j स्विच जोड़ें: `mingw32-make.exe -j`
        + पहले बनाए गए "MSYS2 GDB" डीबगर का चयन करें
        + यदि आप कंपाइलर से पढ़ने योग्य आउटपुट पसंद करते हैं, तो "अन्य सेटिंग्स"->"कंपाइलर लॉगिंग" को "कार्य विवरण" पर सेट करें
    + CodeBlock बिल्ड निर्देशिका (\\build\\CodeBlocks) में
    + `SetupCodeBlocks-MSYS2.bat` फ़ाइल चलाएं
    + "CQP.cbp" CodeBlocks प्रोजेक्ट फ़ाइल खोलें।

यदि आपकी प्रोजेक्ट फ़ाइल में गहरी फ़ोल्डर संरचना है (यह एक बग है), तो इसे वर्कस्पेस पर राइट-क्लिक करके और निम्नलिखित करके सुधारा जा सकता है:

- "डिस्क पर फ़ोल्डर्स दिखाएं" को अनचेक करें
- "फ़ोल्डर का नाम छुपाएं" को चेक करें

## इस सॉफ्टवेयर का उद्धरण```
@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}
}

और अधिक पढ़ना

टूल किट के लिए कोड लिखने के अधिक विवरण के लिए कोडिंग गाइड देखें प्रश्न और समस्याओं के लिए FAQ देखें

टूल डाउनलोड करें
  • अन्य साइटों से कुंजी के XOR पर आधारित अप्रत्यक्ष कुंजी का निर्माण
  • कॉन्फ़िग फ़ाइल, कमांड लाइन आर्गुमेंट या नेटवर्क इंटरफ़ेस के माध्यम से कॉन्फ़िगरेशन।
  • Zeroconf का उपयोग कर स्वचालित साइट एजेंट खोज
  • विश्वसनीय साइटों के बीच लिंक पर कुंजियों का समाधान (issue #8)
  • साइट एजेंटों का नेटवर्क प्रबंधन
    • साइटों को इंटरफ़ेस के माध्यम से नियंत्रित किया जा सकता है
    • नियमों के आधार पर साइटों के बीच कुंजी बनाने के लिए साइट एजेंटों का स्थैतिक/गतिशील नियंत्रण
  • एन्क्रिप्टेड टनल नियंत्रक (stunnel की तरह)
    • साझा कुंजी प्राप्त करने के लिए IKey इंटरफ़ेस का उपयोग करता है।
    • निम्नलिखित का उपयोग कर एन्क्रिप्शन टनल की सेटअप:
      • TCP/UDP सॉकेट
      • TUN/TAP डिवाइस (उर्फ VPN)
      • समर्पित भौतिक इंटरफ़ेस
    • कॉन्फ़िग फ़ाइल, कमांड लाइन आर्गुमेंट या नेटवर्क इंटरफ़ेस के माध्यम से कॉन्फ़िगरेशन।
    • Zeroconf का उपयोग कर स्वचालित साइट एजेंट और टनल नियंत्रक खोज
  • एकाधिक प्लेटफ़ॉर्म
    • Linux
    • विंडोज (issue #2 देखें)