
पीयर-टू-पीयर एन्क्रिप्टेड मैसेंजर, Rust में, Noise IK और UDP NAT होल पंचिंग के साथ।
एंड-टू-एंड एन्क्रिप्टेड पीयर-टू-पीयर चैट UDP पर। कोई खाता नहीं, कोई केंद्रीय सर्वर संदेशों को रिले/स्टोर नहीं करता, कोई बीच का व्यक्ति नहीं। बस दो पीयर, एक सीधा कनेक्शन, और नॉइज़ प्रोटोकॉल एन्क्रिप्शन।
https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05
दो लोग अपनी मशीनों पर punchline connect <peer> चलाते हैं। Punchline उनके NAT के माध्यम से छेद करता है, एक एन्क्रिप्टेड हैंडशेक करता है, और उन्हें एक निजी चैट में डाल देता है - यह सब कुछ मिलीसेकंड में। शामिल STUN और सिग्नल सर्वर खोज को संभालते हैं, फिर रास्ते से हट जाते हैं।

cargo build --release
सर्वर शुरू करें (एक मशीन पर जहां दोनों पीयर पहुंच सकते हैं), या मेरे सार्वजनिक सर्वरों का उपयोग करें जो 64.225.107.28 पर होस्ट किए गए हैं (STUN: पोर्ट 3478, सिग्नलिंग: पोर्ट 8743):
punchline-stund # STUN सर्वर - पीयर को उनका सार्वजनिक IP बताता है
punchline-signald # सिग्नल सर्वर - उन पीयर को मिलाता है जो बात करना चाहते हैं
प्रत्येक पीयर की मशीन पर:
# अपनी पहचान उत्पन्न करें (X25519 कुंजी जोड़ी)
punchline keygen
# अपनी सार्वजनिक कुंजी अपने पीयर के साथ साझा करें
punchline pubkey
# उनकी कुंजी सहेजें
punchline peers add alice a1b2c3d4...64_hex_chars
# कनेक्ट करें (दोनों पीयर यह चलाते हैं, एक-दूसरे को लक्षित करते हुए)
punchline connect alice --stun <server>:3478 --signal <server>:8743
TUI लाइव कनेक्शन प्रगति दृश्य के साथ लॉन्च होता है:
STUN खोज - punchline-stund के माध्यम से आपका बाहरी पता हल करना
सिग्नल सर्वर - punchline-signald से कनेक्ट होना
पीयर की प्रतीक्षा - सिग्नल सर्वर दोनों पीयर को मिलाता है
होल पंच - सीधा UDP पथ स्थापित करना
नॉइज़ हैंडशेक - एन्क्रिप्टेड कुंजी विनिमय
एक बार पूरा होने पर, आप चैट में हैं। टाइप करें और Enter दबाएँ। बाहर निकलने के लिए Esc दबाएँ।
पूरी प्रणाली तीन बाइनरी से मिलकर बनी है, सभी इसी रिपॉजिटरी में शामिल हैं:
| बाइनरी | भूमिका | कब उपयोग किया जाता है |
|---|
प्रारंभिक सेटअप के बाद, STUN और सिग्नल सर्वर से अब संपर्क नहीं किया जाता है। सब कुछ सीधे पीयर-टू-पीयर प्रवाहित होता है।
punchlineवैश्विक फ़्लैग:
| फ़्लैग | विवरण |
|---|---|
-v | लॉग वर्बोसिटी बढ़ाएं (-v = डीबग, -vv = ट्रेस). |
-q, --quiet | सभी लॉग आउटपुट दबाएं। |
punchline-stundpunchline-signaldहर बार --stun और --signal पास करने के बजाय, ~/.config/punchline/config.toml बनाएँ:
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"
punchline peers # सभी सूचीबद्ध करें
punchline peers add alice a1b2c3d4... # जोड़ें
punchline peers remove alice # हटाएं
उपनाम ~/.punchline/known_peers.toml में संग्रहीत किए जाते हैं। आप सीधे 64-अक्षर हेक्स कुंजी के साथ भी कनेक्ट कर सकते हैं।
punchline status
आपकी पहचान, कॉन्फ़िग, सर्वर पहुँच क्षमता (एक वास्तविक STUN जांच और TCP कनेक्ट भेजता है), और पीयर संख्या दिखाता है।
दोनों सर्वर -v (डीबग), -vv (ट्रेस), -q (मौन), --address, और --port का समर्थन करते हैं:
punchline-stund -v --port 3478
punchline-signald -v --port 8743
TUI को ~/.config/punchline/style.toml के माध्यम से अनुकूलित करें
वीडियो में उपयोग की गई शैलियाँ:
[colors]
my_text = "#ebdbb2"
peer_text = "#bdae93"
input_text = "#ebdbb2"
border = "#ebdbb2"
sidebar_key = "#ebdbb2"
sidebar_value = "#bdae93"
[padding]
chat_horizontal = 2
chat_vertical = 1
सभी रंग हेक्स RGB हैं। यदि फ़ाइल अनुपस्थित है, तो टर्मिनल के डिफ़ॉल्ट रंगों का उपयोग किया जाता है।
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish
पूर्ण प्रोटोकॉल नाम: Noise_IK_25519_ChaChaPoly_SHA256
| घटक | भूमिका |
|---|---|
IK पैटर्न का अर्थ है कि आरंभकर्ता हैंडशेक शुरू होने से पहले प्रतिक्रियाकर्ता की स्थिर सार्वजनिक कुंजी जानता है। दोनों पीयर के पास पहले से ही एक-दूसरे की कुंजियाँ होती हैं (बैंड के बाहर या पीयर रजिस्ट्री के माध्यम से आदान-प्रदान), इसलिए पहले उपयोग पर कोई विश्वास आवश्यक नहीं है।
Punchline प्रत्येक पीयर की सार्वजनिक कुंजी के पहले 8 बाइट्स की तुलना बड़े-एंडियन u64 के रूप में करके निर्धारित रूप से आरंभकर्ता का चयन करता है। छोटे मान वाला पीयर आरंभकर्ता बन जाता है। दोनों पक्ष स्वतंत्र रूप से इसकी गणना करते हैं।
पहचान एक 32-बाइट X25519 गुप्त कुंजी है जो ~/.punchline/id_x25519 पर Unix अनुमतियों 0600 के साथ संग्रहीत है। सार्वजनिक कुंजी लोड होने पर व्युत्पन्न होती है। कुंजी उत्पादन x25519-dalek के साथ OsRng का उपयोग करता है।
प्रत्येक UDP पैकेट का पहला बाइट उसके प्रकार की पहचान करता है:
दोनों पीयर एक साथ एक ही एल्गोरिथ्म निष्पादित करते हैं:
PROBE (0x00) भेजें।PROBE प्राप्त करने पर, ACK (0x01) भेजने पर स्विच करें।ACK प्राप्त करने पर, एक अंतिम ACK भेजें और सफलता घोषित करें।संदेश (0x02) Noise-एन्क्रिप्टेड UTF-8 पेलोड ले जाते हैं। Keepalive (0x03) एन्क्रिप्टेड खाली पेलोड हैं जो सिफर नॉन्स सिंक्रोनाइज़ेशन बनाए रखने के लिए हर 10 सेकंड में भेजे जाते हैं। 30 सेकंड बिना किसी पैकेट के डिस्कनेक्ट हो जाता है।
WebSocket पर JSON:
// PairRequest (क्लाइंट -> सर्वर)
{ "external_addr": "203.0.113.5:48291", "public_key": "a1b2...", "target_public_key": "d4e5..." }
// PairResponse (सर्वर -> क्लाइंट)
{ "target_external_addr": "198.51.100.7:51003", "target_public_key": "d4e5..." }
RFC 5389 (सरलीकृत) का पालन करता है: XOR-MAPPED-ADDRESS के साथ बाइंडिंग अनुरोध/प्रतिक्रिया। केवल IPv4।
चार क्रैट्स के साथ Cargo वर्कस्पेस:
crates/
├── proto/ # साझा लाइब्रेरी: क्रिप्टो, STUN, सिग्नल प्रकार, ट्रांसपोर्ट ट्रेट
├── client/ # P2P क्लाइंट: CLI, TUI, कनेक्शन तर्क, पीयर प्रबंधन
├── signald/ # सिग्नल सर्वर: WebSocket पीयर मिलान
└── stund/ # STUN सर्वर: बाहरी पता खोज
cargo install punchline # TUI क्लाइंट
cargo install punchline-signald # सिग्नल सर्वर
cargo install punchline-stund # STUN सर्वर
आवश्यकताएँ: Rust 2024 संस्करण (rustc 1.85+)
git clone https://github.com/michal-pielka/punchline.git
cd punchline
cargo build --release
बाइनरी को target/release/ में रखा गया है:
punchlinepunchline-signaldpunchline-stundcargo test
परीक्षण क्रिप्टोग्राफ़िक संचालन, STUN एन्कोडिंग/डिकोडिंग, सिग्नल प्रोटोकॉल क्रमांकन, कॉन्फ़िग पार्सिंग, पीयर प्रबंधन, स्टाइल थीमिंग, और Noise IK हैंडशेक को कवर करते हैं।
MIT - देखें LICENSE.
punchline-stund | STUN सर्वर (UDP) - क्लाइंट के बाहरी IP:port के साथ प्रतिक्रिया करता है | केवल सेटअप के दौरान |
punchline-signald | सिग्नल सर्वर (WebSocket) - पीयर को मिलाता है और पतों का आदान-प्रदान करता है | केवल सेटअप के दौरान |
punchline | स्वयं मैसेंजर - CLI, TUI, क्रिप्टो, होल पंचिंग | हमेशा |
| कमांड | विवरण |
|---|
keygen [--force] [-i path] | एक नई X25519 पहचान कुंजी जोड़ी उत्पन्न करें। बिना पूछे अधिलेखित करने के लिए --force का उपयोग करें। आउटपुट पथ निर्दिष्ट करने के लिए -i का उपयोग करें। |
pubkey [-i path] | अपनी सार्वजनिक कुंजी प्रिंट करें (64 हेक्स अक्षर)। किसी विशिष्ट कुंजी फ़ाइल से व्युत्पन्न करने के लिए -i का उपयोग करें। |
connect <peer> [-i path] [--stun addr] [--signal addr] | उपनाम या कच्ची हेक्स कुंजी द्वारा किसी पीयर से कनेक्ट करें। पहचान कुंजी निर्दिष्ट करने के लिए -i का उपयोग करें। TUI लॉन्च करता है। |
peers | सभी ज्ञात पीयर की सूची बनाएं। |
peers add <name> <key> | किसी पीयर की सार्वजनिक कुंजी को उपनाम के अंतर्गत सहेजें। |
peers remove <name> | उपनाम द्वारा किसी पीयर को हटाएं। |
config path | कॉन्फ़िग फ़ाइल पथ प्रिंट करें। |
config show | वर्तमान कॉन्फ़िगरेशन मान दिखाएं। |
status | पहचान, कॉन्फ़िग, सर्वर पहुँच क्षमता और पीयर संख्या दिखाएं। |
completions <shell> | शेल पूर्णता उत्पन्न करें (bash, zsh, या fish). |
| फ़्लैग | विवरण |
|---|
--address <addr> | बाइंड पता (डिफ़ॉल्ट: 0.0.0.0). |
--port <port> | बाइंड पोर्ट (डिफ़ॉल्ट: 3478). |
-v / -vv | डीबग / ट्रेस लॉगिंग। |
-q | मौन मोड। |
| फ़्लैग | विवरण |
|---|
--address <addr> | बाइंड पता (डिफ़ॉल्ट: 0.0.0.0). |
--port <port> | बाइंड पोर्ट (डिफ़ॉल्ट: 8743). |
-v / -vv | डीबग / ट्रेस लॉगिंग। |
-q | मौन मोड। |
| हैंडशेक पैटर्न - आरंभकर्ता प्रतिक्रियाकर्ता की सार्वजनिक कुंजी जानता है। 2 संदेशों में पूरा होता है। |
| X25519 | एलिप्टिक-कर्व डिफी-हेलमैन कुंजी विनिमय (RFC 7748)। 128-बिट सुरक्षा, स्थिर-समय। |
| ChaCha20-Poly1305 | संदेश एन्क्रिप्शन के लिए AEAD सिफर (RFC 8439)। TLS 1.3 और WireGuard में उपयोग किया जाने वाला वही सिफर। |
| SHA-256 | कुंजी व्युत्पत्ति और हैंडशेक हैशिंग के लिए Noise द्वारा आंतरिक रूप से उपयोग किया जाता है। |
| उपसर्ग | प्रकार | चरण | विवरण |
|---|
0x00 | PROBE | होल पंच | NAT पिनहोल खोलने के लिए हर 200ms पर भेजा जाता है |
0x01 | ACK | होल पंच | PROBE की प्राप्ति की पुष्टि करता है |
| (कोई नहीं) | हैंडशेक | हैंडशेक | रॉ Noise-एन्क्रिप्टेड हैंडशेक पेलोड |
0x02 | Message | ट्रांसपोर्ट | एन्क्रिप्टेड चैट संदेश |
0x03 | Keepalive | ट्रांसपोर्ट | एन्क्रिप्टेड खाली पेलोड (हार्टबीट) |
| क्रैट | उद्देश्य |
|---|
snow | Noise प्रोटोकॉल फ्रेमवर्क (हैंडशेक + ट्रांसपोर्ट एन्क्रिप्शन) |
x25519-dalek | X25519 कुंजी उत्पादन और व्युत्पत्ति |
ratatui | टर्मिनल UI फ्रेमवर्क |
crossterm | टर्मिनल ईवेंट हैंडलिंग |
clap | CLI तर्क पार्सिंग + शेल पूर्णता |
tungstenite | WebSocket क्लाइंट/सर्वर |
tracing | संरचित लॉगिंग |