यह चुनौती पहले जवाब देने के लिए 200 अंकों का इनाम देती है और कम से कम 3 दिनों तक नाबाद रहती है।User3080953 द्वारा दावा किया गया ।
एंड-टू-एंड एन्क्रिप्शन के बारे में हाल ही में बहुत सी बात हुई है, और कंपनियों पर अपने उत्पादों से इसे हटाने का दबाव है। मुझे उस के अधिकारों और गलतताओं में कोई दिलचस्पी नहीं है, लेकिन मैंने सोचा: कोड कितना छोटा हो सकता है जो किसी कंपनी को इसका उपयोग न करने के लिए दबाव डाले?
यहां चुनौती दो नेटवर्क सिस्टम के बीच एक डिफी हेलमैन कुंजी विनिमय को लागू करना है , फिर उपयोगकर्ताओं को उत्पन्न सममित कुंजी का उपयोग करके आगे-पीछे संवाद करने की अनुमति देता है। इस कार्य के उद्देश्य के लिए, किसी अन्य सुरक्षा की आवश्यकता नहीं है (उदाहरण के लिए कुंजी को चक्रित करने, पहचान सत्यापित करने, DoS से सुरक्षा करना, आदि) की आवश्यकता नहीं है और आप एक खुला इंटरनेट मान सकते हैं (आपके द्वारा सुने जाने वाले सभी पोर्ट सभी के लिए उपलब्ध हैं)। बिल्डिंस के उपयोग की अनुमति और प्रोत्साहित किया जाता है!
आप दो में से एक मॉडल चुन सकते हैं:
- एक सर्वर और एक क्लाइंट: क्लाइंट सर्वर से कनेक्ट होता है, फिर सर्वर या क्लाइंट दूसरे को संदेश भेज सकते हैं। दोनों के बीच तीसरे पक्ष के संदेश पढ़ने में असमर्थ होना चाहिए। एक उदाहरण प्रवाह हो सकता है:
- उपयोगकर्ता ए सर्वर लॉन्च करता है
- उपयोगकर्ता बी क्लाइंट लॉन्च करता है और इसे उपयोगकर्ता ए के सर्वर (जैसे आईपी / पोर्ट के माध्यम से) को निर्देशित करता है, प्रोग्राम एक कनेक्शन खोलता है
- उपयोगकर्ता ए के कार्यक्रम कनेक्शन को स्वीकार करता है (वैकल्पिक रूप से उपयोगकर्ता पहले सहमति के लिए पूछ रहा है)
- उपयोगकर्ता बी का कार्यक्रम एक डीएच सीक्रेट की पीढ़ी शुरू करता है, और आवश्यक डेटा (सार्वजनिक कुंजी, प्राइम, जनरेटर, कुछ और आपके कार्यान्वयन की आवश्यकता के लिए) उपयोगकर्ता A को भेजता है
- उपयोगकर्ता ए का कार्यक्रम साझा किए गए रहस्य को पूरा करने के लिए भेजे गए डेटा का उपयोग करता है और उपयोगकर्ता बी को आवश्यक डेटा (सार्वजनिक कुंजी) वापस भेजता है। इस बिंदु से, उपयोगकर्ता ए संदेश (जैसे स्टड के माध्यम से) दर्ज कर सकता है जिसे एन्क्रिप्ट किया जाएगा और उपयोगकर्ता को भेजा जाएगा बी (उदाहरण के लिए stdout)।
- उपयोगकर्ता बी का कार्यक्रम साझा रहस्य की पीढ़ी को पूरा करता है। इस बिंदु से, उपयोगकर्ता B उपयोगकर्ता A को संदेश भेज सकता है।
- या: एक सर्वर जिसमें दो क्लाइंट जुड़े हैं: प्रत्येक क्लाइंट सर्वर से बात करता है, जो दूसरे क्लाइंट को अपना संदेश भेज देता है। स्वयं सर्वर (और बीच में कोई भी तृतीय-पक्ष) संदेशों को पढ़ने में असमर्थ होना चाहिए। प्रारंभिक कनेक्शन के अलावा, प्रक्रिया वही है जो पहले विकल्प में वर्णित है।
विस्तृत नियम:
- आप एक कार्यक्रम, या कई कार्यक्रम (जैसे सर्वर और क्लाइंट) प्रदान कर सकते हैं। आपका स्कोर सभी कार्यक्रमों में कुल कोड आकार है।
- आपका कार्यक्रम सैद्धांतिक रूप से एक नेटवर्क पर संचार करने में सक्षम होना चाहिए (लेकिन परीक्षण के लिए, लोकलहोस्ट ठीक है)। यदि आपकी पसंद की भाषा नेटवर्किंग का समर्थन नहीं करती है, तो आप इसे किसी ऐसी चीज़ के साथ जोड़ सकते हैं (जैसे शेल स्क्रिप्ट); इस स्थिति में आपका स्कोर उपयोग की जाने वाली सभी भाषाओं में कुल कोड आकार है।
- डिफी हेलमैन प्रमुख पीढ़ी हार्ड-कोडित "पी" और "जी" मूल्यों का उपयोग कर सकती है।
- उत्पन्न साझा कुंजी कम से कम 1024 बिट होनी चाहिए।
- एक बार कुंजी साझा करने के बाद, सममित-कुंजी एन्क्रिप्शन का विकल्प आप पर निर्भर है, लेकिन आपको ऐसी विधि नहीं अपनानी चाहिए, जो वर्तमान में इसके खिलाफ एक व्यावहारिक हमला करने के लिए जानी जाती है (उदाहरण के लिए एक सीज़र शिफ्ट कुंजी के ज्ञान के बिना रिवर्स करने के लिए तुच्छ है )। उदाहरण के लिए अनुमत एल्गोरिदम:
- एईएस (कोई भी महत्वपूर्ण आकार)
- RC4 (सैद्धांतिक रूप से टूटा हुआ है, लेकिन कोई भी व्यावहारिक हमला नहीं है जिसका मैं उल्लेख कर सकता हूं, इसलिए यह यहां स्वीकार्य है)
- उपयोगकर्ता A और B दोनों को एक-दूसरे को (दो-तरफ़ा संचार) संदेश भेजने में सक्षम होना चाहिए (जैसे स्टड से लाइनें पढ़ना, लगातार संकेत देना, या एक बटन दबाने जैसी घटनाएं)। यदि यह आसान हो जाता है, तो आप एक वैकल्पिक वार्तालाप मान सकते हैं (जैसे कि उपयोगकर्ता द्वारा संदेश भेजे जाने के बाद, उन्हें अपना अगला संदेश भेजने से पहले प्रतिक्रिया की प्रतीक्षा करनी चाहिए)
- भाषा बिल्डरों को अनुमति दी जाती है (यदि वे पहले से ही समर्थित हैं तो अपने स्वयं के क्रिप्टोग्राफिक या नेटवर्किंग विधियों को लिखने की आवश्यकता नहीं है)।
- अंतर्निहित संचार प्रारूप आपके ऊपर है।
- ऊपर दिए गए संचार चरण एक उदाहरण हैं, लेकिन आपको उनका पालन करने की आवश्यकता नहीं है (जब तक आवश्यक जानकारी साझा नहीं की जाती है, और कोई भी मध्य-पुरुष साझा कुंजी या संदेशों की गणना करने में सक्षम नहीं हैं)
- यदि आपके सर्वर से जुड़ने के लिए आवश्यक विवरण पहले से ज्ञात नहीं हैं (जैसे कि यदि यह यादृच्छिक पोर्ट पर सुनता है), तो इन विवरणों को मुद्रित किया जाना चाहिए। आप मान सकते हैं कि मशीन का आईपी पता ज्ञात है।
- त्रुटि से निपटने (जैसे अमान्य पते, खो कनेक्शन, आदि) की आवश्यकता नहीं है।
- चुनौती कोड गोल्फ है, इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।
p
औरg
अनुमति है?