<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cryptography on kenji.blog</title><link>http://kenji.blog/hi/tags/cryptography/</link><description>Recent content in Cryptography on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 21:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/tags/cryptography/index.xml" rel="self" type="application/rss+xml"/><item><title>जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का गणितीय अंतर्ज्ञान</title><link>http://kenji.blog/hi/p/lattice-based-cryptography-math-intuition/</link><pubDate>Fri, 11 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/lattice-based-cryptography-math-intuition/</guid><description>&lt;img src="http://kenji.blog/p/lattice-based-cryptography-math-intuition/img/eyecatch.jpg" alt="Featured image of post जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का गणितीय अंतर्ज्ञान" />&lt;h1 id="1-परचय-पसट-कवटम-करपटगरफ-pqc-क-शरआत-और-जल-आधरत-करपटगरफ-lattice-based-cryptography-क-उदय">1. परिचय: पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) की शुरुआत और जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography) का उदय
&lt;/h1>&lt;p>आधुनिक समाज के डिजिटल बुनियादी ढांचे का आधार RSA और एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) जैसी पब्लिक-की क्रिप्टोग्राफी (Public-key cryptography) तकनीकें हैं। इन क्रिप्टोग्राफी विधियों की सुरक्षा &amp;ldquo;प्राइम फैक्टराइजेशन प्रॉब्लम (Prime Factorization Problem)&amp;rdquo; और &amp;ldquo;डिस्क्रीट लॉगरिथम प्रॉब्लम (Discrete Logarithm Problem)&amp;rdquo; जैसी गणितीय कठिनाइयों पर निर्भर करती है, जिनके बारे में माना जाता है कि पारंपरिक क्लासिकल कंप्यूटरों द्वारा उन्हें कुशलतापूर्वक हल नहीं किया जा सकता है (इसमें एक्सपोनेंशियल समय लगता है)।&lt;/p>
&lt;p>हालाँकि, 1994 में पीटर शोर (Peter Shor) द्वारा प्रस्तुत &amp;ldquo;शोर का एल्गोरिदम (Shor&amp;rsquo;s Algorithm)&amp;rdquo; ने क्रिप्टोग्राफी की दुनिया में तहलका मचा दिया। इस एल्गोरिदम ने गणितीय रूप से यह साबित कर दिया कि जब बड़े पैमाने पर क्वांटम कंप्यूटर वास्तविकता बन जाएंगे, तो वे प्राइम फैक्टराइजेशन और डिस्क्रीट लॉगरिथम समस्याओं को पॉलीनोमियल समय (Polynomial time) में हल कर देंगे। इसका अर्थ है कि वर्तमान में व्यापक रूप से उपयोग की जाने वाली पब्लिक-की क्रिप्टोग्राफी भविष्य में पूरी तरह से डिक्रिप्ट (decrypt) की जा सकेगी।&lt;/p>
&lt;p>इस तरह के &amp;ldquo;क्वांटम खतरे (Quantum Threat)&amp;rdquo; का मुकाबला करने के लिए, नई क्रिप्टोग्राफिक विधियों पर शोध करना एक तत्काल आवश्यकता बन गई, जिन्हें क्वांटम कंप्यूटरों का उपयोग करके भी तोड़ना मुश्किल हो। इस क्षेत्र को &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (Post-Quantum Cryptography: PQC)&amp;rdquo; या &amp;ldquo;क्वांटम-प्रतिरोधी क्रिप्टोग्राफी&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>PQC के लिए कई मजबूत उम्मीदवार मौजूद हैं। इनमें हैश-आधारित क्रिप्टोग्राफी, कोड-आधारित क्रिप्टोग्राफी, मल्टीवेरिएट पॉलीनोमियल क्रिप्टोग्राफी, और आइसोजेनी-आधारित क्रिप्टोग्राफी शामिल हैं। लेकिन इनमें से जिसने वर्तमान में सबसे अधिक ध्यान आकर्षित किया है और जो NIST (नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड्स एंड टेक्नोलॉजी, USA) की PQC मानकीकरण प्रक्रिया के केंद्र में है, वह &amp;ldquo;जाली-आधारित क्रिप्टोग्राफी (Lattice-based cryptography)&amp;rdquo; है। अन्य विधियों की तुलना में, जाली-आधारित क्रिप्टोग्राफी में एन्क्रिप्शन और डिक्रिप्शन की गति बहुत तेज है। इसके अलावा, इसकी एक उत्कृष्ट विशेषता यह है कि इसमें &amp;ldquo;सबसे खराब स्थिति की जटिलता (Worst-case complexity)&amp;rdquo; से &amp;ldquo;औसत स्थिति की जटिलता (Average-case complexity)&amp;rdquo; में कमी (reduction) का गुण है, जो क्रिप्टोग्राफिक सिद्धांत में सुरक्षा का एक अत्यंत शक्तिशाली प्रमाण प्रदान करता है।&lt;/p>
&lt;p>इस लेख में, हम जाली-आधारित क्रिप्टोग्राफी की नींव, &amp;ldquo;जाली (Lattice)&amp;rdquo; की गणितीय परिभाषा से शुरू करेंगे, और फिर जाली पर कठिन समस्याओं जैसे कि SVP (सबसे छोटा वेक्टर समस्या / Shortest Vector Problem) और CVP (सबसे करीबी वेक्टर समस्या / Closest Vector Problem) पर चर्चा करेंगे। अंत में, हम &amp;ldquo;LWE समस्या (Learning With Errors)&amp;rdquo; के बारे में विस्तार से जानेंगे, जिसे आधुनिक जाली-आधारित क्रिप्टोग्राफी का हृदय कहा जा सकता है। हम गणितीय सूत्रों, ज्यामितीय अंतर्ज्ञान और ठोस संख्यात्मक उदाहरणों के साथ इसका गहराई से विश्लेषण करेंगे।&lt;/p>
&lt;h1 id="2-जल-lattice-क-गणतय-परभष-और-जयमतय-अतरजञन">2. जाली (Lattice) की गणितीय परिभाषा और ज्यामितीय अंतर्ज्ञान
&lt;/h1>&lt;h2 id="21-वकटर-सपस-और-जल">2.1 वेक्टर स्पेस और जाली
&lt;/h2>&lt;p>गणित में, &amp;ldquo;जाली (Lattice)&amp;rdquo; $n$-आयामी वास्तविक वेक्टर स्पेस $\mathbb{R}^n$ के भीतर नियमित रूप से व्यवस्थित असतत (discrete) बिंदुओं का एक सेट है। यह लीनियर अलजेब्रा में सीखे गए वेक्टर स्पेस (Vector Space) के समान है, लेकिन इनमें एक महत्वपूर्ण अंतर है। जबकि एक वेक्टर स्पेस एक सतत (continuous) स्थान है जिसे बेसिस (आधार) वेक्टरों के &amp;ldquo;वास्तविक संख्या (real number) गुणांक&amp;rdquo; वाले रैखिक संयोजन (linear combination) द्वारा दर्शाया जाता है, एक जाली एक असतत स्थान है जिसे बेसिस वेक्टरों के &amp;ldquo;पूर्णांक (integer) गुणांक&amp;rdquo; वाले रैखिक संयोजन द्वारा दर्शाया जाता है।&lt;/p>
&lt;p>आइए एक सख्त गणितीय परिभाषा दें। $m$-आयामी वास्तविक वेक्टर स्पेस $\mathbb{R}^m$ में $n$ ($n \le m$) रैखिक रूप से स्वतंत्र (linearly independent) वेक्टरों $\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n$ पर विचार करें। मान लें कि एक मैट्रिक्स $B = [\mathbf{b}_1, \mathbf{b}_2, \dots, \mathbf{b}_n] \in \mathbb{R}^{m \times n}$ है, जिसके कॉलम में ये वेक्टर हैं। इस $B$ को जाली का &amp;ldquo;बेसिस (Basis)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>इस बेसिस $B$ द्वारा उत्पन्न जाली $\mathcal{L}(B)$ को इस प्रकार परिभाषित किया गया है:&lt;/p>
$$
\mathcal{L}(B) = \left\{ \sum_{i=1}^{n} x_i \mathbf{b}_i \mathrel{\bigg|} x_i \in \mathbb{Z} \right\} = \{ B \mathbf{x} \mid \mathbf{x} \in \mathbb{Z}^n \}
$$
&lt;p>यहाँ महत्वपूर्ण बात यह है कि गुणांक $x_i$ वास्तविक संख्याओं $\mathbb{R}$ तक सीमित नहीं हैं, बल्कि पूर्णांकों $\mathbb{Z}$ तक सीमित हैं। इसके परिणामस्वरूप, अंतरिक्ष में मौजूद अनगिनत सतत बिंदुओं के बजाय, समान दूरी पर स्थित चौराहों की तरह &amp;ldquo;असतत बिंदुओं का एक सेट&amp;rdquo; बनता है।&lt;/p>
&lt;h2 id="22-जयमतय-छव">2.2 ज्यामितीय छवि
&lt;/h2>&lt;p>आइए 2-आयामी तल $\mathbb{R}^2$ के एक उदाहरण पर विचार करें। यदि हम बेसिस वेक्टर के रूप में $\mathbf{b}_1 = \begin{pmatrix} 1 \\ 0 \end{pmatrix}$ और $\mathbf{b}_2 = \begin{pmatrix} 0 \\ 1 \end{pmatrix}$ चुनते हैं, तो उनके द्वारा उत्पन्न जाली, निर्देशांक तल पर सभी पूर्णांक निर्देशांकों $(x, y) \in \mathbb{Z}^2$ का सेट होगी। यह सबसे सरल &amp;ldquo;वर्गाकार जाली (square lattice)&amp;rdquo; है।&lt;/p>
&lt;p>हालाँकि, जालियाँ हमेशा ऑर्थोगोनल (समकोण पर) नहीं होती हैं। उदाहरण के लिए, यदि हम बेसिस $\mathbf{b}_1 = \begin{pmatrix} 2 \\ 1 \end{pmatrix}$ और $\mathbf{b}_2 = \begin{pmatrix} 1 \\ 3 \end{pmatrix}$ पर विचार करें, तो उत्पन्न बिंदु एक तिरछे (skewed) जाल के चौराहों की तरह दिखेंगे।&lt;/p>
&lt;h2 id="23-बसस-क-गर-अदवतयत-non-uniqueness-और-यनमडयलर-टरसफरमशन">2.3 बेसिस की गैर-अद्वितीयता (Non-uniqueness) और यूनिमॉड्युलर ट्रांसफॉर्मेशन
&lt;/h2>&lt;p>जाली-आधारित क्रिप्टोग्राफी की सुरक्षा के मूल में एक महत्वपूर्ण गुण निहित है: &amp;ldquo;एक ही जाली उत्पन्न करने वाले अनगिनत बेसिस मौजूद होते हैं।&amp;rdquo;&lt;/p>
&lt;p>उदाहरण के लिए, ऊपर बताई गई बेसिस $\mathbf{b}_1 = (1, 0)^T, \mathbf{b}_2 = (0, 1)^T$ द्वारा उत्पन्न $\mathbb{Z}^2$ जाली, बिल्कुल उसी $\mathbb{Z}^2$ जाली को उत्पन्न करती है जिसे बेसिस $\mathbf{b}'_1 = (1, 1)^T, \mathbf{b}'_2 = (2, 3)^T$ का उपयोग करके भी उत्पन्न किया जा सकता है।&lt;/p>
&lt;p>एक बेसिस $B$ और दूसरे बेसिस $B'$ द्वारा समान जाली उत्पन्न करने के लिए आवश्यक और पर्याप्त शर्त (necessary and sufficient condition) यह है कि एक पूर्णांक घटकों वाला मैट्रिक्स $U \in \mathbb{Z}^{n \times n}$ मौजूद हो, जिसका डिटरमिनेंट $\det(U) = \pm 1$ हो, और जिसे इस प्रकार व्यक्त किया जा सके:
&lt;/p>
$$ B' = B U $$
&lt;p>
इस प्रकार के मैट्रिक्स $U$ को &amp;ldquo;यूनिमॉड्युलर मैट्रिक्स (Unimodular matrix)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>क्रिप्टोग्राफी में इसके अनुप्रयोग का मूल विचार एक &amp;ldquo;अच्छे बेसिस&amp;rdquo; (जो लगभग ऑर्थोगोनल हो और छोटे वेक्टरों से बना हो) को सीक्रेट की (गुप्त कुंजी) के रूप में उपयोग करना है, और एक &amp;ldquo;बुरे बेसिस&amp;rdquo; (जो अत्यधिक तिरछा हो और बहुत लंबे वेक्टरों से बना हो) को पब्लिक की (सार्वजनिक कुंजी) के रूप में उपयोग करना है। उच्च आयामों में एक बुरे बेसिस से एक अच्छे बेसिस की गणना करना बहुत मुश्किल हो जाता है। यही जाली-आधारित क्रिप्टोग्राफी का मूलभूत अंतर्ज्ञान है।&lt;/p>
&lt;h1 id="3-जल-म-गणन-सबध-कठन-समसयए">3. जाली में गणना संबंधी कठिन समस्याएं
&lt;/h1>&lt;p>जाली-आधारित क्रिप्टोग्राफी की सुरक्षा जाली पर कुछ गणितीय समस्याओं को हल करने की कठिनाई पर निर्भर करती है। यहाँ हम दो सबसे बुनियादी और प्रसिद्ध समस्याओं का परिचय देंगे।&lt;/p>
&lt;h2 id="31-सबस-छट-वकटर-समसय-shortest-vector-problem-svp">3.1 सबसे छोटा वेक्टर समस्या (Shortest Vector Problem: SVP)
&lt;/h2>&lt;p>SVP जाली सिद्धांत में सबसे शास्त्रीय और प्रसिद्ध समस्या है।&lt;/p>
&lt;p>&lt;strong>परिभाषा (SVP):&lt;/strong>
मान लें कि कोई भी जाली बेसिस $B$ दिया गया है, तो उस जाली $\mathcal{L}(B)$ से संबंधित सभी गैर-शून्य वेक्टरों में से, उस वेक्टर $\mathbf{v}$ का पता लगाएं जिसका यूक्लिडियन नॉर्म (लंबाई) सबसे कम हो।&lt;/p>
&lt;p>सूत्र रूप में, यह वह $\mathbf{v}$ खोजने की समस्या है जो $\min_{\mathbf{v} \in \mathcal{L}(B) \setminus \{\mathbf{0}\}} \| \mathbf{v} \|$ को संतुष्ट करता हो। इस न्यूनतम लंबाई को $\lambda_1(\mathcal{L})$ के रूप में लिखा जाता है और इसे &amp;ldquo;जाली का पहला क्रमिक न्यूनतम मान (First successive minimum)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>2D या 3D जैसे निचले आयामों में, आप एक चित्र बनाकर सबसे छोटे वेक्टर को अपनी आँखों से देख सकते हैं। या आप इसे गॉस (Gauss) के जाली रिडक्शन एल्गोरिदम का उपयोग करके कुशलतापूर्वक हल कर सकते हैं। हालाँकि, जब आयाम $n$ सैकड़ों से हजारों जैसे उच्च आयामों तक पहुँचता है, तो SVP को सटीक रूप से हल करना NP-हार्ड माना जाता है।&lt;/p>
&lt;p>वास्तविक क्रिप्टोग्राफी में, सटीक सबसे छोटे वेक्टर के बजाय, &amp;ldquo;लगभग सबसे छोटे वेक्टर&amp;rdquo; को खोजने वाली समस्या, एप्रोक्सिमेट SVP ($\gamma$-SVP) का उपयोग किया जाता है। यदि एप्रोक्सिमेशन फैक्टर (सन्निकटन कारक) $\gamma$ पॉलीनोमियल आकार का है, तो इस समस्या को अभी भी बहुत कठिन माना जाता है।&lt;/p>
&lt;h2 id="32-सबस-करब-वकटर-समसय-closest-vector-problem-cvp">3.2 सबसे करीबी वेक्टर समस्या (Closest Vector Problem: CVP)
&lt;/h2>&lt;p>CVP भी जाली-आधारित क्रिप्टोग्राफी में एक अत्यंत महत्वपूर्ण समस्या है।&lt;/p>
&lt;p>&lt;strong>परिभाषा (CVP):&lt;/strong>
मान लें कि कोई भी जाली बेसिस $B$ और अंतरिक्ष में कोई लक्ष्य वेक्टर $\mathbf{t} \in \mathbb{R}^m$ (जो जरूरी नहीं कि जाली बिंदु हो) दिया गया है, तो जाली के बिंदुओं में से वह जाली बिंदु $\mathbf{v} \in \mathcal{L}(B)$ खोजें जो $\mathbf{t}$ के सबसे करीब हो।&lt;/p>
&lt;p>सूत्र रूप में, यह वह जाली बिंदु $\mathbf{v}$ खोजने की समस्या है जो $\min_{\mathbf{v} \in \mathcal{L}(B)} \| \mathbf{v} - \mathbf{t} \|$ को संतुष्ट करता हो।&lt;/p>
&lt;p>SVP की तरह, उच्च आयामों में CVP भी NP-हार्ड है। क्रिप्टोग्राफिक अनुप्रयोगों के दृष्टिकोण से, LWE समस्या (जिसकी चर्चा बाद में की जाएगी) CVP के एक विशेष संस्करण (Bounded Distance Decoding: BDD) से निकटता से संबंधित है।&lt;/p>
&lt;h2 id="33-उचच-आयम-म-इनह-हल-करन-असभव-कय-ह-lll-और-bkz-क-समए">3.3 उच्च आयामों में इन्हें हल करना असंभव क्यों है? (LLL और BKZ की सीमाएँ)
&lt;/h2>&lt;p>उच्च-आयामी जाली समस्याओं को हल करने के लिए एक प्रसिद्ध एल्गोरिदम LLL एल्गोरिदम (Lenstra-Lenstra-Lovász algorithm) है। LLL एल्गोरिदम पॉलीनोमियल समय में काम करता है और जाली बेसिस को कुछ हद तक &amp;ldquo;अच्छे बेसिस&amp;rdquo; में घटा (रिड्यूस) सकता है। हालाँकि, LLL एल्गोरिदम द्वारा खोजा जाने वाला सबसे छोटा वेक्टर, वास्तविक सबसे छोटे वेक्टर की लंबाई के सापेक्ष एक एक्सपोनेंशियल ($2^{\mathcal{O}(n)}$) एप्रोक्सिमेशन फैक्टर (सन्निकटन कारक) रखता है, इसलिए यह क्रिप्टोग्राफी की सुरक्षा को तोड़ने के लिए पर्याप्त नहीं है।&lt;/p>
&lt;p>यदि LLL का उन्नत संस्करण BKZ (Block Korkine-Zolotarev) एल्गोरिदम जैसे अधिक शक्तिशाली बेसिस रिडक्शन एल्गोरिदम का उपयोग किया जाए, तो छोटे वेक्टर पाए जा सकते हैं, लेकिन इसकी कम्प्यूटेशनल जटिलता (computational complexity) ब्लॉक आकार के संबंध में एक्सपोनेंशियल रूप से बढ़ जाती है। जाली-आधारित क्रिप्टोग्राफी में, सुरक्षित पैरामीटर (जैसे आयाम $n$ का आकार) इस BKZ एल्गोरिदम के निष्पादन समय का अनुमान लगाकर निर्धारित किए जाते हैं। वर्तमान PQC मानक मापदंडों में, आयाम $n$ को 500 से 1000 या उससे अधिक के मानों के लिए चुना जाता है, और यह माना जाता है कि भविष्य के सुपर कंप्यूटरों या क्वांटम कंप्यूटरों का उपयोग करके भी इसे डिक्रिप्ट करने में ब्रह्मांड की आयु से अधिक समय लगेगा।&lt;/p>
&lt;h1 id="4-lwe-समसय-learning-with-errors-क-गणतय-नरपण">4. LWE समस्या (Learning With Errors) का गणितीय निरूपण
&lt;/h1>&lt;p>आधुनिक जाली-आधारित क्रिप्टोग्राफी का अधिकांश हिस्सा &amp;ldquo;LWE समस्या (Learning With Errors)&amp;rdquo; पर आधारित है, जिसे 2005 में ओडेड रेगेव (Oded Regev) द्वारा प्रस्तावित किया गया था। LWE समस्या की सुंदरता इसके निर्माण की सरलता और इसके शक्तिशाली गणितीय प्रमाण में निहित है, जिसे &amp;ldquo;सबसे खराब स्थिति की जटिलता से औसत स्थिति की जटिलता में कमी&amp;rdquo; कहा जाता है।&lt;/p>
&lt;h2 id="41-बन-शर-क-रखय-समकरण-क-परणल">4.1 बिना शोर के रेखीय समीकरणों की प्रणाली
&lt;/h2>&lt;p>LWE समस्या को समझने के लिए, आइए पहले बिना शोर वाले रेखीय समीकरणों की एक सरल प्रणाली पर विचार करें।
मान लें कि हमारे पास एक अज्ञात गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ (प्रत्येक घटक $0$ से $q-1$ तक का एक पूर्णांक है) है। यहाँ, मान लें कि $q$ एक अभाज्य संख्या है।&lt;/p>
&lt;p>हम यादृच्छिक (random) गुणांक वेक्टर $\mathbf{a}_1, \mathbf{a}_2, \dots \in \mathbb{Z}_q^n$ चुनते हैं, और गुप्त वेक्टर $\mathbf{s}$ के साथ इसके डॉट प्रोडक्ट की गणना मॉड्युलो $q$ पर करते हैं।
$b_1 = \langle \mathbf{a}_1, \mathbf{s} \rangle \pmod q$
$b_2 = \langle \mathbf{a}_2, \mathbf{s} \rangle \pmod q$
$\vdots$&lt;/p>
&lt;p>यदि हमें पर्याप्त संख्या में (कम से कम $n$) $(\mathbf{a}_i, b_i)$ के जोड़े दिए जाते हैं, तो हम लीनियर अलजेब्रा में &amp;ldquo;गौसियन एलिमिनेशन (Gaussian elimination)&amp;rdquo; का उपयोग करके गुप्त वेक्टर $\mathbf{s}$ को आसानी से पुनर्प्राप्त कर सकते हैं। यह एक ऐसी समस्या है जिसे पॉलीनोमियल समय में आसानी से हल किया जा सकता है।&lt;/p>
&lt;h2 id="42-lwe-समसय-क-परभष-शर-जडन">4.2 LWE समस्या की परिभाषा: शोर जोड़ना
&lt;/h2>&lt;p>तो, यदि हम इस समस्या में थोड़ा सा &amp;ldquo;शोर (त्रुटि / error)&amp;rdquo; जोड़ दें तो क्या होगा?
यही LWE समस्या का सार है।&lt;/p>
&lt;p>अज्ञात गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ के लिए, हम प्रत्येक समीकरण के परिणाम में एक छोटी सी त्रुटि $e_i \in \mathbb{Z}_q$ जोड़ते हैं।
$b_i = \langle \mathbf{a}_i, \mathbf{s} \rangle + e_i \pmod q$&lt;/p>
&lt;p>यहाँ, $e_i$ एक छोटा पूर्णांक मान है जिसका औसत 0 है और जिसका मानक विचलन (standard deviation) अपेक्षाकृत छोटा है (उदाहरण के लिए, सामान्य वितरण की तरह एक डिस्क्रीट गॉसियन वितरण (discrete Gaussian distribution) से चुना गया)।
प्रदान की गई जानकारी यादृच्छिक वेक्टर $\mathbf{a}_i$ और त्रुटि जोड़ने के बाद गणना किए गए $b_i$ के जोड़े की एक सूची है।
$( \mathbf{a}_1, b_1 ), ( \mathbf{a}_2, b_2 ), \dots, ( \mathbf{a}_m, b_m )$&lt;/p>
&lt;p>इसे मैट्रिक्स का उपयोग करके बहुत स्पष्ट रूप से दर्शाया जा सकता है।
यादृच्छिक मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$, गुप्त वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$, और त्रुटि वेक्टर $\mathbf{e} \in \mathbb{Z}_q^m$ का उपयोग करके, हम इसे इस प्रकार लिख सकते हैं:
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q $$
&lt;p>
हमें केवल $A$ और $\mathbf{b}$ दिए जाते हैं। यहाँ से $\mathbf{s}$ ज्ञात करना &amp;ldquo;सर्च LWE समस्या (Search LWE problem)&amp;rdquo; कहलाता है।&lt;/p>
&lt;p>चूंकि इसमें त्रुटि $e_i$ शामिल है, इसलिए यदि हम गौसियन एलिमिनेशन का उपयोग करने का प्रयास करते हैं, तो समीकरणों को जोड़ने और घटाने की प्रक्रिया में त्रुटि एक्सपोनेंशियल रूप से बढ़ जाती है, जिससे सही उत्तर तक पहुँचना असंभव हो जाता है। पहली नज़र में, यह रेखीय समीकरणों की एक सरल प्रणाली की तरह लगता है, लेकिन इस छोटे से शोर के जुड़ने से ही समस्या की कठिनाई NP-हार्ड स्तर तक पहुँच जाती है।&lt;/p>
&lt;h2 id="43-डसजन-lwe-समसय-decision-lwe">4.3 डिसीजन LWE समस्या (Decision LWE)
&lt;/h2>&lt;p>क्रिप्टोग्राफिक सिद्धांत के प्रमाणों में अक्सर जिसका उपयोग किया जाता है, वह सर्च LWE समस्या का एक संस्करण है, जिसे &amp;ldquo;डिसीजन LWE समस्या (Decision LWE problem)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;p>डिसीजन LWE समस्या यह निर्धारित करने की समस्या है कि नीचे दिए गए दो वितरणों (distributions) में से प्राप्त नमूनों की सूची किस वितरण से आई है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>LWE वितरण&lt;/strong>: जानबूझकर गणना की गई $(A, \mathbf{b} = A\mathbf{s} + \mathbf{e} \pmod q)$&lt;/li>
&lt;li>&lt;strong>यूनिफ़ॉर्म रैंडम वितरण&lt;/strong>: पूरी तरह से यादृच्छिक रूप से चुने गए मैट्रिक्स $A$ और वेक्टर $\mathbf{u}$ से मिलकर बना $(A, \mathbf{u})$&lt;/li>
&lt;/ol>
&lt;p>आश्चर्यजनक रूप से, यदि LWE समस्या के मापदंडों को ठीक से चुना जाता है, तो LWE वितरण से प्राप्त जोड़े पूरी तरह से यादृच्छिक डेटा के जोड़े से &amp;ldquo;कम्प्यूटेशनल रूप से अप्रभेद्य (Computationally Indistinguishable)&amp;rdquo; हो जाते हैं। यही गुण LWE-आधारित क्रिप्टोग्राफी का आधार है, जो ऐसे &amp;ldquo;सिफरटेक्स्ट (ciphertext) उत्पन्न करता है जिन्हें यादृच्छिक संख्याओं (random numbers) से अलग नहीं किया जा सकता है।&amp;rdquo;&lt;/p>
&lt;h2 id="44-सबस-खरब-सथत-स-औसत-सथत-क-जटलत-म-कम-regevs-theorem">4.4 सबसे खराब स्थिति से औसत स्थिति की जटिलता में कमी (Regev&amp;rsquo;s Theorem)
&lt;/h2>&lt;p>ओडेड रेगेव (Oded Regev) की सबसे बड़ी उपलब्धि इस LWE समस्या की कठिनाई को ऊपर बताई गई जाली समस्याओं (SVP और CVP) की कठिनाई से गणितीय रूप से जोड़ना था।&lt;/p>
&lt;p>क्वांटम रिडक्शन (Quantum reduction) का उपयोग करते हुए, उन्होंने साबित किया कि &amp;ldquo;यदि कोई पॉलीनोमियल-टाइम एल्गोरिदम मौजूद है जो औसत रूप से LWE समस्या को हल कर सकता है (यादृच्छिक रूप से चुने गए $A$ और $\mathbf{e}$ के लिए), तो एक पॉलीनोमियल-टाइम क्वांटम एल्गोरिदम भी मौजूद होगा जो किसी भी जाली के सबसे खराब स्थिति (सबसे कठिन मामले) में Gap-SVP को हल कर सकता है।&amp;rdquo; (बाद में, Peikert और अन्य लोगों द्वारा क्लासिकल रिडक्शन भी दिखाया गया है)।&lt;/p>
&lt;p>यह क्रिप्टोग्राफिक सिद्धांत में एक सपने जैसी विशेषता है। ऐसा इसलिए है क्योंकि यह इस चिंता को दूर करता है कि &amp;ldquo;हो सकता है कि क्रिप्टोग्राफी टूट गई हो क्योंकि हमने संयोग से एक कमजोर कुंजी (औसत मामलों में से एक) चुन ली हो,&amp;rdquo; और यह एक शक्तिशाली गारंटी प्रदान करता है कि &amp;ldquo;यदि औसत LWE को हल किया जा सकता है, तो जाली की सभी कठिन समस्याओं को हल किया जा सकता है (इसलिए LWE निश्चित रूप से कठिन है)।&amp;rdquo;&lt;/p>
&lt;div class="mermaid">graph TD
A["सबसे खराब स्थिति वाली जाली समस्याएं (Gap-SVP, SIVP)"] -->|Quantum/Classical Reduction| B["औसत स्थिति वाली LWE समस्या"]
B -->|Cryptographic Construction| C["LWE-आधारित क्रिप्टोसिस्टम (PKE, KEM, FHE)"]
style A fill:#ffcccc,stroke:#ff0000,stroke-width:2px,color:#000
style B fill:#ccffcc,stroke:#00aa00,stroke-width:2px,color:#000
style C fill:#ccccff,stroke:#0000ff,stroke-width:2px,color:#000&lt;/div>
&lt;h1 id="5-lwe-क-उपयग-करक-पबलक-क-करपटगरफ-रगव-करपटगरफ---regev-cryptosystem-क-नरमण">5. LWE का उपयोग करके पब्लिक-की क्रिप्टोग्राफी (रेगेव क्रिप्टोग्राफी - Regev Cryptosystem) का निर्माण
&lt;/h1>&lt;p>अब जब हम LWE समस्या की कठिनाई को समझ चुके हैं, तो आइए ओडेड रेगेव द्वारा प्रस्तावित बुनियादी पब्लिक-की क्रिप्टोग्राफी प्रणाली (Public-key cryptosystem) को देखें कि यह एन्क्रिप्शन और डिक्रिप्शन करने के लिए इसका उपयोग कैसे करती है। यहाँ हम 1-बिट संदेश $M \in \{0, 1\}$ को एन्क्रिप्ट करने के सबसे बुनियादी तंत्र की व्याख्या करेंगे।&lt;/p>
&lt;h2 id="51-कज-नरमण-key-generation">5.1 कुंजी निर्माण (Key Generation)
&lt;/h2>&lt;ol>
&lt;li>सिस्टम पैरामीटर के रूप में, एक अभाज्य संख्या $q$ (मॉड्यूलस), एक आयाम $n$, और समीकरणों की संख्या $m$ ($m > n \log q$) निर्धारित करें।&lt;/li>
&lt;li>गुप्त कुंजी (Secret Key) के रूप में एक वेक्टर $\mathbf{s} \in \mathbb{Z}_q^n$ को यादृच्छिक रूप से चुनें।&lt;/li>
&lt;li>एक यादृच्छिक मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$ उत्पन्न करें।&lt;/li>
&lt;li>एक छोटा त्रुटि वेक्टर $\mathbf{e} \in \mathbb{Z}_q^m$ एक त्रुटि वितरण जैसे कि डिस्क्रीट गॉसियन वितरण से चुनें।&lt;/li>
&lt;li>वेक्टर $\mathbf{b} = A \mathbf{s} + \mathbf{e} \pmod q$ की गणना करें।&lt;/li>
&lt;li>पब्लिक की (Public Key) $(A, \mathbf{b})$ होगी।&lt;/li>
&lt;li>सीक्रेट की (Secret Key) $\mathbf{s}$ होगी।&lt;/li>
&lt;/ol>
&lt;p>पब्लिक की वस्तुतः &amp;ldquo;LWE समस्या का एक इंस्टेंस (instance)&amp;rdquo; है। चूँकि पब्लिक की $(A, \mathbf{b})$ से सीक्रेट की $\mathbf{s}$ ज्ञात करना सर्च LWE समस्या को हल करने के बराबर है, इसलिए सुरक्षा की गारंटी है।&lt;/p>
&lt;h2 id="52-एनकरपशन-encryption">5.2 एन्क्रिप्शन (Encryption)
&lt;/h2>&lt;p>ऐलिस, बॉब की पब्लिक की $(A, \mathbf{b})$ का उपयोग करके 1-बिट संदेश $M \in \{0, 1\}$ को एन्क्रिप्ट करती है।&lt;/p>
&lt;ol>
&lt;li>एक यादृच्छिक बाइनरी वेक्टर (जिसके घटक 0 या 1 हैं) $\mathbf{r} \in \{0, 1\}^m$ चुनें।&lt;/li>
&lt;li>सिफरटेक्स्ट (ciphertext) के पहले भाग के रूप में, वेक्टर $\mathbf{u} = A^T \mathbf{r} \pmod q$ की गणना करें। ($A^T$, $A$ का ट्रांसपोज़ मैट्रिक्स (transpose matrix) है। अर्थात्, हम $A$ की उन पंक्तियों को जोड़ रहे हैं जहाँ $\mathbf{r}$ का घटक 1 है)।&lt;/li>
&lt;li>सिफरटेक्स्ट के दूसरे भाग के रूप में, स्केलर $v = \mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q$ की गणना करें।
(यदि संदेश $M$ 0 है तो कुछ भी नहीं जोड़ा जाता है, और यदि $1$ है तो हम $q$ का ठीक आधा मान $\lfloor \frac{q}{2} \rfloor$ जोड़ते हैं)।&lt;/li>
&lt;li>सिफरटेक्स्ट (Ciphertext) $(\mathbf{u}, v)$ होगा।&lt;/li>
&lt;/ol>
&lt;p>एन्क्रिप्शन का सहज अर्थ पब्लिक की के मैट्रिक्स $A$ और वेक्टर $\mathbf{b}$ के लिए &amp;ldquo;यादृच्छिक उपसमूह का योग (sum of a random subset)&amp;rdquo; लेना है। डिसीजन LWE समस्या की कठिनाई के कारण, यह सिफरटेक्स्ट $(\mathbf{u}, v)$ एक पूरी तरह से यादृच्छिक वेक्टर और एक समान यादृच्छिक संख्या (uniform random number) से अप्रभेद्य (indistinguishable) प्रतीत होता है (सिमेंटिक सिक्योरिटी: Semantic Security)।&lt;/p>
&lt;div class="mermaid">flowchart LR
M["संदेश M {0,1} में"] --> Enc
PK["पब्लिक की (A, b)"] --> Enc
r["यादृच्छिक बाइनरी वेक्टर r"] --> Enc
subgraph Enc ["एन्क्रिप्शन प्रक्रिया"]
direction TB
u_calc["u = A^T * r mod q"]
v_calc["v = b^T * r + M * floor(q/2) mod q"]
end
Enc --> CT["सिफरटेक्स्ट (u, v)"]&lt;/div>
&lt;h2 id="53-डकरपशन-decryption">5.3 डिक्रिप्शन (Decryption)
&lt;/h2>&lt;p>बॉब अपनी गुप्त कुंजी $\mathbf{s}$ का उपयोग करके सिफरटेक्स्ट $(\mathbf{u}, v)$ को डिक्रिप्ट करता है।&lt;/p>
&lt;ol>
&lt;li>निम्नलिखित मान की गणना करें: $D = v - \mathbf{s}^T \mathbf{u} \pmod q$&lt;/li>
&lt;li>यदि गणना किया गया परिणाम $0$ के करीब है, तो $M=0$ आउटपुट करें, और यदि यह $\lfloor \frac{q}{2} \rfloor$ के करीब है, तो $M=1$ आउटपुट करें।&lt;/li>
&lt;/ol>
&lt;p>आइए गणितीय रूप से इसका विस्तार करें कि इसे इस प्रकार डिक्रिप्ट क्यों किया जा सकता है।
याद रखें कि $\mathbf{b} = A \mathbf{s} + \mathbf{e}$ था।&lt;/p>
$$
\begin{aligned}
v - \mathbf{s}^T \mathbf{u} &amp;= (\mathbf{b}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T (A^T \mathbf{r}) \\
&amp;= ((A \mathbf{s} + \mathbf{e})^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= (\mathbf{s}^T A^T \mathbf{r} + \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor) - \mathbf{s}^T A^T \mathbf{r} \\
&amp;= \mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor \pmod q
\end{aligned}
$$
&lt;p>यहाँ, सूत्र में से $\mathbf{s}^T A^T \mathbf{r}$ पूरी तरह से कट कर (cancel out) समाप्त हो गया!
बचा हुआ हिस्सा $\mathbf{e}^T \mathbf{r} + M \cdot \lfloor \frac{q}{2} \rfloor$ है।&lt;/p>
&lt;p>$\mathbf{e}$ एक शोर वेक्टर है जिसके घटक बहुत छोटे हैं, और $\mathbf{r}$ एक बाइनरी वेक्टर है जिसके घटक 0 या 1 हैं। इसलिए, उनका डॉट प्रोडक्ट $\mathbf{e}^T \mathbf{r}$ भी अपेक्षाकृत छोटा मान (यदि पैरामीटर ठीक से चुने गए हैं) ही रहेगा।&lt;/p>
&lt;ul>
&lt;li>यदि $M=0$ है, तो परिणाम $\mathbf{e}^T \mathbf{r}$ होगा, जो $0$ के करीब एक छोटा मान होगा।&lt;/li>
&lt;li>यदि $M=1$ है, तो परिणाम $\mathbf{e}^T \mathbf{r} + \lfloor \frac{q}{2} \rfloor$ होगा, जो $q$ के आधे मान $\lfloor \frac{q}{2} \rfloor$ के आसपास स्थित होगा।&lt;/li>
&lt;/ul>
&lt;p>यदि मापदंडों को इस तरह से डिज़ाइन किया गया है कि त्रुटि $\mathbf{e}^T \mathbf{r}$ का निरपेक्ष मान (absolute value) $\frac{q}{4}$ से कम रहे, तो बॉब केवल यह देखकर संदेश $M$ को सटीक रूप से निर्धारित (डिक्रिप्ट) कर सकता है कि गणना का परिणाम $0$ के अधिक करीब है या $\lfloor \frac{q}{2} \rfloor$ के। यही वह सुंदर तंत्र है जिसके द्वारा LWE-आधारित क्रिप्टोग्राफी काम करती है।&lt;/p>
&lt;div class="mermaid">flowchart LR
CT["सिफरटेक्स्ट (u, v)"] --> Dec
SK["गुप्त कुंजी s"] --> Dec
subgraph Dec ["डिक्रिप्शन प्रक्रिया"]
direction TB
calc["गणना करें D = v - s^T * u mod q"]
check["जांचें कि क्या D, 0 या q/2 के करीब है"]
end
calc --> check
Dec --> M_out["पुनर्प्राप्त संदेश M"]&lt;/div>
&lt;h1 id="6-वशषट-सखयतमक-मन-क-उपयग-करत-हए-lwe-करपटगरफ-क-एक-टय-उदहरण-toy-example">6. विशिष्ट संख्यात्मक मानों का उपयोग करते हुए LWE क्रिप्टोग्राफी का एक टॉय उदाहरण (Toy Example)
&lt;/h1>&lt;p>सूत्रों की एक श्रृंखला के साथ इसे समझना मुश्किल हो सकता है, इसलिए आइए वास्तव में बहुत छोटे संख्यात्मक मापदंडों को सेट करके एन्क्रिप्शन से डिक्रिप्शन तक की गणनाओं का पालन करें।
(※ वास्तविक क्रिप्टोग्राफ़िक प्रणालियों में, सुरक्षा सुनिश्चित करने के लिए $n$ के लिए 500 या उससे अधिक और $q$ के लिए हजारों या उससे अधिक मान का उपयोग किया जाता है)&lt;/p>
&lt;p>&lt;strong>【पैरामीटर सेटिंग्स】&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>मॉड्यूलस $q = 17$ (अभाज्य संख्या। इसलिए मान $0$ से $16$ तक की सीमा में होंगे)&lt;/li>
&lt;li>आयाम $n = 2$&lt;/li>
&lt;li>समीकरणों की संख्या $m = 4$&lt;/li>
&lt;li>मान लें कि हम संदेश $M = 1$ को एन्क्रिप्ट कर रहे हैं।&lt;/li>
&lt;li>संदेश का शिफ्ट मान: $\lfloor \frac{q}{2} \rfloor = \lfloor \frac{17}{2} \rfloor = 8$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【1. कुंजी निर्माण चरण (Key Generation Phase)】&lt;/strong>
बॉब गुप्त कुंजी $\mathbf{s}$, मैट्रिक्स $A$, और त्रुटि वेक्टर $\mathbf{e}$ को यादृच्छिक रूप से चुनता है।
&lt;/p>
$$ \mathbf{s} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \in \mathbb{Z}_{17}^2 $$
$$ A = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \in \mathbb{Z}_{17}^{4 \times 2} $$
$$ \mathbf{e} = \begin{pmatrix} 1 \\ -1 \\ 0 \\ 2 \end{pmatrix} \equiv \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} \pmod{17} $$
&lt;p>इसके बाद, पब्लिक की $\mathbf{b}$ की गणना करें।
&lt;/p>
$$ A \mathbf{s} = \begin{pmatrix} 2 &amp; 15 \\ 1 &amp; 8 \\ 14 &amp; 5 \\ 9 &amp; 10 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 2\times 3 + 15\times 4 \\ 1\times 3 + 8\times 4 \\ 14\times 3 + 5\times 4 \\ 9\times 3 + 10\times 4 \end{pmatrix} = \begin{pmatrix} 6 + 60 \\ 3 + 32 \\ 42 + 20 \\ 27 + 40 \end{pmatrix} = \begin{pmatrix} 66 \\ 35 \\ 62 \\ 67 \end{pmatrix} $$
&lt;p>
इसकी गणना मॉड्युलो 17 में करें। (जैसे $66 = 17 \times 3 + 15$)
&lt;/p>
$$ A \mathbf{s} \pmod{17} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} $$
&lt;p>
त्रुटि वेक्टर $\mathbf{e}$ जोड़ें।
&lt;/p>
$$ \mathbf{b} = A \mathbf{s} + \mathbf{e} = \begin{pmatrix} 15 \\ 1 \\ 11 \\ 16 \end{pmatrix} + \begin{pmatrix} 1 \\ 16 \\ 0 \\ 2 \end{pmatrix} = \begin{pmatrix} 16 \\ 17 \\ 11 \\ 18 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 0 \\ 11 \\ 1 \end{pmatrix} \pmod{17} $$
&lt;p>पब्लिक की $A$ और $\mathbf{b} = (16, 0, 11, 1)^T$ होगी।&lt;/p>
&lt;p>&lt;strong>【2. एन्क्रिप्शन चरण (Encryption Phase)】&lt;/strong>
ऐलिस संदेश $M = 1$ को एन्क्रिप्ट करती है।
वह एक यादृच्छिक वेक्टर $\mathbf{r}$ चुनती है। यहाँ मान लें कि $\mathbf{r} = (1, 0, 1, 0)^T$ है।&lt;/p>
&lt;p>$\mathbf{u}$ की गणना करें।
&lt;/p>
$$ \mathbf{u} = A^T \mathbf{r} = \begin{pmatrix} 2 &amp; 1 &amp; 14 &amp; 9 \\ 15 &amp; 8 &amp; 5 &amp; 10 \end{pmatrix} \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} 2 \times 1 + 14 \times 1 \\ 15 \times 1 + 5 \times 1 \end{pmatrix} = \begin{pmatrix} 16 \\ 20 \end{pmatrix} \equiv \begin{pmatrix} 16 \\ 3 \end{pmatrix} \pmod{17} $$
&lt;p>$v$ की गणना करें।
&lt;/p>
$$ \mathbf{b}^T \mathbf{r} = (16, 0, 11, 1) \begin{pmatrix} 1 \\ 0 \\ 1 \\ 0 \end{pmatrix} = 16 \times 1 + 11 \times 1 = 27 \equiv 10 \pmod{17} $$
&lt;p>
संदेश $M=1$ के अनुरूप मान $\lfloor 17/2 \rfloor = 8$ जोड़ें।
&lt;/p>
$$ v = \mathbf{b}^T \mathbf{r} + M \cdot 8 = 10 + 1 \times 8 = 18 \equiv 1 \pmod{17} $$
&lt;p>ऐलिस सिफरटेक्स्ट के रूप में $(\mathbf{u}, v) = \left( \begin{pmatrix} 16 \\ 3 \end{pmatrix}, 1 \right)$ बॉब को भेजती है।&lt;/p>
&lt;p>&lt;strong>【3. डिक्रिप्शन चरण (Decryption Phase)】&lt;/strong>
सिफरटेक्स्ट प्राप्त करने के बाद, बॉब गुप्त कुंजी $\mathbf{s} = (3, 4)^T$ का उपयोग करके इसे डिक्रिप्ट करता है।
डिक्रिप्शन प्रक्रिया सूत्र: $D = v - \mathbf{s}^T \mathbf{u} \pmod{17}$ की गणना करें।&lt;/p>
$$ \mathbf{s}^T \mathbf{u} = (3, 4) \begin{pmatrix} 16 \\ 3 \end{pmatrix} = 3 \times 16 + 4 \times 3 = 48 + 12 = 60 \equiv 9 \pmod{17} $$
$$ D = v - \mathbf{s}^T \mathbf{u} = 1 - 9 = -8 \pmod{17} $$
&lt;p>यहाँ, मॉड्युलो 17 की दुनिया में, $-8$, $9$ के बराबर है ($-8 + 17 = 9$)।
प्राप्त मान $D = 9$ का मूल्यांकन यह निर्धारित करने के लिए करें कि यह $0$ के अधिक करीब है या $8$ ($\lfloor 17/2 \rfloor$) के।
चूँकि $9$ स्पष्ट रूप से $0$ की तुलना में $8$ के अधिक करीब है, बॉब ने $M = 1$ को सफलतापूर्वक और सही ढंग से पुनर्प्राप्त कर लिया!&lt;/p>
&lt;p>यह $9$ क्यों हुआ? आइए पहले के प्रमाण को याद करें।
त्रुटि भाग $\mathbf{e}^T \mathbf{r} = (1, -1, 0, 2) (1, 0, 1, 0)^T = 1 \times 1 + 0 \times 1 = 1$ है।
इसलिए, गणना का परिणाम $\mathbf{e}^T \mathbf{r} + M \cdot 8 = 1 + 8 = 9$ है, और यह पुष्टि हो गई है कि सैद्धांतिक रूप से सही मान की गणना की गई है।&lt;/p>
&lt;h1 id="7-वयवहरक-अनपरयग-क-दश-म-वकस-ring-lwe-और-module-lwe">7. व्यावहारिक अनुप्रयोग की दिशा में विकास: Ring-LWE और Module-LWE
&lt;/h1>&lt;p>अब तक समझाई गई मानक LWE समस्या (Standard LWE) में बहुत मजबूत सुरक्षा प्रमाण है, लेकिन व्यावहारिक अनुप्रयोग में इसकी एक घातक कमजोरी है: &amp;ldquo;कुंजी का आकार विशाल हो जाता है&amp;rdquo; और &amp;ldquo;कम्प्यूटेशनल लागत अधिक होती है।&amp;rdquo;&lt;/p>
&lt;p>Standard LWE में, पब्लिक की में एक विशाल मैट्रिक्स $A \in \mathbb{Z}_q^{m \times n}$ शामिल होता है। जब पैरामीटर $n$ सैकड़ों से हजारों तक पहुँच जाता है, तो इस मैट्रिक्स का आकार कई मेगाबाइट तक पहुँच जाता है, जो इंटरनेट संचार प्रोटोकॉल (जैसे TLS) में हर बार प्रसारित और प्राप्त करने के लिए बहुत भारी होता है। इसके अलावा, मैट्रिक्स और वेक्टर के गुणन के लिए $\mathcal{O}(n^2)$ कम्प्यूटेशनल जटिलता की आवश्यकता होती है।&lt;/p>
&lt;p>इस समस्या को हल करने के लिए, &amp;ldquo;Ring-LWE (RLWE)&amp;rdquo; और &amp;ldquo;Module-LWE (MLWE)&amp;rdquo; को पेश किया गया, जो जाली में पॉलीनोमियल रिंग्स (Polynomial rings) नामक बीजीय संरचनाओं (algebraic structures) को शामिल करते हैं।&lt;/p>
&lt;h2 id="71-ring-lwe-क-अतरजञन">7.1 Ring-LWE का अंतर्ज्ञान
&lt;/h2>&lt;p>Ring-LWE में, वेक्टर और मैट्रिक्स को पॉलीनोमियल रिंग $\mathcal{R}_q = \mathbb{Z}_q[X]/(X^n + 1)$ पर तत्वों (बहुपदों / polynomials) से बदल दिया जाता है। (जहाँ $n$ को 2 की घात के रूप में चुना जाता है)।&lt;/p>
&lt;p>Standard LWE में जहाँ पब्लिक की एक मैट्रिक्स $A$ थी, वहीं Ring-LWE में एकल बहुपद $a(x)$ का उपयोग किया जाता है। गुप्त कुंजी $s(x)$ और त्रुटि $e(x)$ भी बहुपद बन जाते हैं।
समीकरण इस प्रकार है:
&lt;/p>
$$ b(x) = a(x) \cdot s(x) + e(x) \pmod q $$
&lt;p>चूँकि यह बहुपदों का गुणन है, फास्ट फूरियर ट्रांसफॉर्म (FFT) के समान &amp;ldquo;नंबर थियोरेटिक ट्रांसफॉर्म (Number Theoretic Transform: NTT)&amp;rdquo; का उपयोग करके कम्प्यूटेशनल जटिलता को नाटकीय रूप से $\mathcal{O}(n \log n)$ तक कम किया जा सकता है। इसके अलावा, चूंकि पब्लिक की का आकार एक मैट्रिक्स से एकल बहुपद तक छोटा हो जाता है, इसलिए डेटा का आकार $\mathcal{O}(n)$ तक कम हो जाता है। यह संचार बैंडविड्थ के मामले में एक बड़ा लाभ प्रदान करता है।&lt;/p>
&lt;p>गणितीय दृष्टिकोण से, Ring-LWE एक सामान्य जाली नहीं है, बल्कि यह एक विशेष समरूपता (symmetry) वाली जाली की समस्या में बदल जाती है, जिसे &amp;ldquo;आइडियल लैटिस (Ideal Lattice)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;h2 id="72-module-lwe-और-nist-क-मनककरण-kyber--ml-kem">7.2 Module-LWE और NIST का मानकीकरण (Kyber / ML-KEM)
&lt;/h2>&lt;p>हालाँकि Ring-LWE कुशल है, लेकिन यह चिंता थी कि आइडियल लैटिस की विशेष बीजीय संरचना भविष्य में हमलों का एक प्रारंभिक बिंदु बन सकती है। इसलिए, &amp;ldquo;Module-LWE (MLWE)&amp;rdquo; को पेश किया गया, जो Standard LWE की रूढ़िवादी (conservative) सुरक्षा और Ring-LWE की दक्षता का &amp;ldquo;सर्वश्रेष्ठ संयोजन (best of both worlds)&amp;rdquo; है।&lt;/p>
&lt;p>Module-LWE में, हम बहुपदों वाले छोटे मैट्रिक्स और वेक्टरों पर विचार करते हैं। दूसरे शब्दों में, हम एक रिंग पर मॉड्यूल से निपटते हैं।
वर्तमान में, NIST द्वारा PQC कुंजी-विनिमय एल्गोरिदम (KEM) के मानक के रूप में चुना गया &amp;ldquo;CRYSTALS-Kyber&amp;rdquo; (मानकीकृत नाम: ML-KEM), पूरी तरह से इस Module-LWE समस्या की कठिनाई पर आधारित है।&lt;/p>
&lt;h1 id="8-यह-कवटम-कपयटर-क-खलफ-सरकषत-कय-ह">8. यह क्वांटम कंप्यूटरों के खिलाफ सुरक्षित क्यों है?
&lt;/h1>&lt;p>अंत में, आइए इस मुख्य प्रश्न को छूते हैं: &amp;ldquo;ऐसा क्यों माना जाता है कि क्वांटम कंप्यूटरों का उपयोग करके भी जाली-आधारित क्रिप्टोग्राफी को नहीं तोड़ा जा सकता है?&amp;rdquo;&lt;/p>
&lt;p>Shor का एल्गोरिदम, जो क्वांटम कंप्यूटरों को RSA और एलिप्टिक कर्व क्रिप्टोग्राफी को तोड़ने की अनुमति देता है, अनिवार्य रूप से &amp;ldquo;हिडन सबग्रुप प्रॉब्लम (Hidden Subgroup Problem: HSP)&amp;rdquo; को हल करने के लिए एक एल्गोरिदम है। RSA और ECC (परिमित एबेलियन समूह / finite Abelian groups) के पीछे की गणितीय संरचना में आवधिकता (periodicity) होती है, और क्वांटम फूरियर ट्रांसफॉर्म (QFT) नामक क्वांटम एल्गोरिदम के लिए विशिष्ट ऑपरेशन का उपयोग करके इस अवधि (छिपे हुए उपसमूह) को एक बार में निकाला जा सकता है।&lt;/p>
&lt;p>हालाँकि, जाली की समस्याएं मौलिक रूप से भिन्न हैं। हालांकि जालियों में भी आवधिकता होती है, SVP और CVP के लिए &amp;ldquo;सबसे कम दूरी&amp;rdquo; और &amp;ldquo;शोर हटाने&amp;rdquo; जैसे ज्यामितीय, गैर-रेखीय (non-linear) गुणों की आवश्यकता होती है। Shor के एल्गोरिदम की तरह &amp;ldquo;एबेलियन समूह पर क्वांटम फूरियर ट्रांसफॉर्म&amp;rdquo; को सीधे लागू करने से जाली समस्याओं को हल करने के लिए उपयोगी जानकारी को कुशलतापूर्वक नहीं निकाला जा सकता है। आज तक, SVP या LWE को पॉलीनोमियल समय में हल करने वाला कोई क्वांटम एल्गोरिदम नहीं खोजा गया है। यह व्यापक रूप से माना जाता है कि क्वांटम कंप्यूटरों की समानांतर कंप्यूटिंग क्षमता के साथ भी, ब्रूट-फोर्स सर्च (Brute-force search) के करीब का तरीका (ग्रोवर के एल्गोरिदम का उपयोग करके वर्गमूल गति वृद्धि / square root speedup तक ही) एकमात्र प्रभावी साधन है।&lt;/p>
&lt;h1 id="9-नषकरष">9. निष्कर्ष
&lt;/h1>&lt;p>इस लेख में, हमने जाली-आधारित क्रिप्टोग्राफी के गणितीय अंतर्ज्ञान के बारे में विस्तार से बताया है, जिसकी शुरुआत जाली की ज्यामितीय परिभाषा से हुई, उसके बाद LWE समस्या का निरूपण किया गया, और अंततः पब्लिक-की क्रिप्टोग्राफी के निर्माण को समझाया गया।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जाली (Lattice)&lt;/strong> एक असतत स्थान (discrete space) है जिसे बेसिस वेक्टरों के पूर्णांक गुणांकों वाले रैखिक संयोजन द्वारा दर्शाया जाता है। उच्च आयामों में एक &amp;ldquo;अच्छा बेसिस&amp;rdquo; खोजना (जो लगभग ऑर्थोगोनल हो) मुश्किल हो जाता है (SVP)।&lt;/li>
&lt;li>&lt;strong>LWE समस्या (Learning With Errors)&lt;/strong> शोर (noise) के साथ रेखीय समीकरणों की प्रणाली को हल करने की समस्या है। चूँकि यह जाली की सबसे खराब स्थिति (worst-case) वाली समस्याओं की कठिनाई से जुड़ी है, इसलिए यह सुरक्षा का एक मजबूत आधार प्रदान करती है।&lt;/li>
&lt;li>LWE समस्या का उपयोग करते हुए, जानबूझकर शोर जोड़ने या हटाने के एक सरल तंत्र के माध्यम से एन्क्रिप्शन और डिक्रिप्शन (&lt;strong>रेगेव क्रिप्टोग्राफी - Regev Cryptosystem&lt;/strong>) प्राप्त किया जाता है।&lt;/li>
&lt;li>वास्तविक प्रोटोकॉल में, संचार दक्षता और कम्प्यूटेशनल गति में सुधार करने के लिए पॉलीनोमियल रिंग्स का उपयोग करने वाले &lt;strong>Ring-LWE&lt;/strong> और &lt;strong>Module-LWE&lt;/strong> को अपनाया गया है। ये NIST के मानक &lt;strong>ML-KEM&lt;/strong> की नींव बनाते हैं।&lt;/li>
&lt;/ol>
&lt;p>जैसे-जैसे क्वांटम कंप्यूटर के रूप में अभूतपूर्व कंप्यूटिंग प्रतिमान बदलाव (paradigm shift) आ रहा है, यह बहुत ही रोमांचक है कि क्लासिकल लीनियर अलजेब्रा और नंबर थ्योरी (number theory) की गहराइयों से जन्मी &amp;ldquo;जाली-आधारित क्रिप्टोग्राफी&amp;rdquo; भविष्य की इंटरनेट सुरक्षा की नींव रखेगी। जाली-आधारित क्रिप्टोग्राफी की आधारभूत गणित बहुत अधिक जटिल नहीं है; लीनियर अलजेब्रा और प्रोबेबिलिटी (probability) के बुनियादी ज्ञान के साथ, इसकी सुंदर संरचना को पूरी तरह से समझा जा सकता है। हमें उम्मीद है कि यह लेख PQC के मूल में स्थित जाली-आधारित क्रिप्टोग्राफी को समझने में आपकी मदद करेगा।&lt;/p></description></item><item><title>रीमैन परिकल्पना और अभाज्य संख्याओं का वितरण: आधुनिक क्रिप्टोग्राफी के साथ गहरा संबंध</title><link>http://kenji.blog/hi/p/riemann-hypothesis-prime-distribution-cryptography/</link><pubDate>Fri, 11 Sep 2026 16:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/riemann-hypothesis-prime-distribution-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/riemann-hypothesis-prime-distribution-cryptography/img/eyecatch.jpg" alt="Featured image of post रीमैन परिकल्पना और अभाज्य संख्याओं का वितरण: आधुनिक क्रिप्टोग्राफी के साथ गहरा संबंध" />&lt;h1 id="1-परचय-अभजय-सखयओ-क-लकक-रहसय-और-रमन-परकलपन">1. परिचय: अभाज्य संख्याओं का लौकिक रहस्य और रीमैन परिकल्पना
&lt;/h1>&lt;p>&amp;ldquo;अभाज्य संख्याएँ (Prime Numbers)&amp;rdquo; प्राकृतिक संख्याएँ हैं जो केवल 1 और स्वयं से विभाज्य होती हैं, और उन्हें गणित की दुनिया का &amp;ldquo;परमाणु&amp;rdquo; भी कहा जाता है। अनुक्रम 2, 3, 5, 7, 11, 13&amp;hellip; पहली नज़र में अव्यवस्थित और यादृच्छिक प्रतीत होता है। प्राचीन यूनानी गणितज्ञ यूक्लिड ने यह साबित किया था कि &amp;ldquo;अभाज्य संख्याएँ अनंत हैं,&amp;rdquo; तब से अनगिनत गणितज्ञों ने अभाज्य संख्याओं के इस क्रम में छिपी नियमितता को उजागर करने का प्रयास किया है।&lt;/p>
&lt;p>इस अभाज्य संख्या के रहस्य के सबसे करीब 1859 में जर्मन गणितज्ञ बर्नहार्ड रीमैन (Bernhard Riemann) द्वारा प्रस्तावित &lt;strong>&amp;ldquo;रीमैन परिकल्पना (Riemann Hypothesis)&amp;rdquo;&lt;/strong> है। रीमैन परिकल्पना आधुनिक गणित में सबसे महत्वपूर्ण और अनसुलझी समस्याओं में से एक है, और यह क्ले मैथमेटिक्स इंस्टीट्यूट द्वारा निर्धारित मिलेनियम प्राइज समस्याओं में से एक है, जिस पर 1 मिलियन डॉलर का इनाम है।&lt;/p>
&lt;p>पहली नज़र में, अभाज्य संख्याओं के वितरण से संबंधित शुद्ध गणित की यह कठिन समस्या हमारे दैनिक जीवन से असंबंधित लग सकती है। हालाँकि, इंटरनेट की सुरक्षा जो आधुनिक समाज के बुनियादी ढांचे का समर्थन करती है, विशेष रूप से &lt;strong>आधुनिक क्रिप्टोग्राफी जैसे RSA और एलिप्टिक कर्व क्रिप्टोग्राफी (ECC)&lt;/strong>, विशाल अभाज्य संख्याओं के गुणों पर गहराई से निर्भर करती है।&lt;/p>
&lt;p>इस लेख में, हम अभाज्य संख्याओं के वितरण से लेकर अभाज्य संख्या प्रमेय, रीमैन ज़ेटा फ़ंक्शन और रीमैन परिकल्पना के मूल तक एक गणितीय यात्रा करेंगे, और यह कैसे आधुनिक क्रिप्टोग्राफी से जुड़ा है, और यदि रीमैन परिकल्पना सिद्ध हो जाती है तो दुनिया कैसी होगी, इसके बारे में बहुत विस्तृत और गहन व्याख्या करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="2-अभजय-सखय-परमय-और-अभजय-सखयओ-क-वतरण-गस-क-खज">2. अभाज्य संख्या प्रमेय और अभाज्य संख्याओं का वितरण: गॉस की खोज
&lt;/h1>&lt;p>अभाज्य संख्याएँ कैसे वितरित होती हैं, यह समझने के लिए, गणितज्ञों ने &lt;strong>अभाज्य-गणना फलन (Prime-counting function)&lt;/strong> $\pi(x)$ पर विचार किया, जो दर्शाता है कि &amp;ldquo;किसी संख्या $x$ के बराबर या उससे कम कितनी अभाज्य संख्याएँ हैं।&amp;rdquo;&lt;/p>
&lt;p>उदाहरण के लिए:&lt;/p>
&lt;ul>
&lt;li>$\pi(10) = 4$ (2, 3, 5, 7)&lt;/li>
&lt;li>$\pi(100) = 25$&lt;/li>
&lt;li>$\pi(1000) = 168$&lt;/li>
&lt;/ul>
&lt;p>15 वर्षीय प्रतिभाशाली गणितज्ञ कार्ल फ्रेडरिक गॉस (Carl Friedrich Gauss) ने अभाज्य संख्याओं की विशाल तालिकाओं की गणना की और पाया कि अभाज्य संख्याओं की आवृत्ति प्राकृतिक लघुगणक (natural logarithm) $\ln x$ के व्युत्क्रमानुपाती होकर कम हो जाती है। अर्थात्, उन्होंने अनुमान लगाया कि किसी संख्या $x$ के आसपास अभाज्य संख्या मिलने की प्रायिकता लगभग $\frac{1}{\ln x}$ है।&lt;/p>
&lt;p>इसे समाकलन (integration) का उपयोग करके व्यक्त किया गया है, जिसे &lt;strong>लघुगणकीय समाकलन (Logarithmic integral)&lt;/strong> $\text{Li}(x)$ कहा जाता है।&lt;/p>
$$ \text{Li}(x) = \int_{2}^{x} \frac{dt}{\ln t} $$
&lt;p>गॉस के अनुमान को बाद में 1896 में जैक्स हैडमार्ड और चार्ल्स जीन डे ला वैली-पूसिन द्वारा स्वतंत्र रूप से सिद्ध किया गया था, और इसे &lt;strong>अभाज्य संख्या प्रमेय (Prime Number Theorem, PNT)&lt;/strong> के रूप में स्थापित किया गया।&lt;/p>
$$ \lim_{x \to \infty} \frac{\pi(x)}{\text{Li}(x)} = 1 $$
&lt;p>या अनुमानित रूप से इसे इस प्रकार व्यक्त किया जाता है:&lt;/p>
$$ \pi(x) \sim \frac{x}{\ln x} $$
&lt;p>इस प्रमेय से, यह पता चला कि यदि स्थूल रूप से देखा जाए, तो अभाज्य संख्याओं का वितरण बहुत सहज और अनुमानित होता है। हालाँकि, यदि सूक्ष्म रूप से देखा जाए, तो $\pi(x)$ और $\text{Li}(x)$ के बीच हमेशा &amp;ldquo;त्रुटि&amp;rdquo; अर्थात् &amp;ldquo;उतार-चढ़ाव&amp;rdquo; होता है। इस उतार-चढ़ाव का वास्तविक स्वरूप ही वह सबसे बड़ा रहस्य है जिसे रीमैन परिकल्पना सुलझाने का प्रयास कर रही है।&lt;/p>
&lt;hr>
&lt;h1 id="3-रमन-जट-फकशन-और-यलर-उतपद">3. रीमैन ज़ेटा फ़ंक्शन और यूलर उत्पाद
&lt;/h1>&lt;p>अभाज्य संख्याओं के वितरण का विश्लेषण करने के लिए सबसे शक्तिशाली हथियार &lt;strong>रीमैन ज़ेटा फ़ंक्शन (Riemann Zeta Function)&lt;/strong> है। यह मूल रूप से लियोनहार्ड यूलर (Leonhard Euler) द्वारा वास्तविक संख्याओं $s > 1$ के लिए परिभाषित एक अनंत श्रृंखला थी।&lt;/p>
$$ \zeta(s) = \sum_{n=1}^\infty \frac{1}{n^s} = 1 + \frac{1}{2^s} + \frac{1}{3^s} + \frac{1}{4^s} + \dots $$
&lt;p>यूलर की सबसे बड़ी उपलब्धियों में से एक यह साबित करना था कि इस अनंत श्रृंखला को सभी अभाज्य संख्याओं $p$ पर एक अनंत उत्पाद के रूप में व्यक्त किया जा सकता है। यह &lt;strong>यूलर उत्पाद सूत्र (Euler Product Formula)&lt;/strong> है।&lt;/p>
$$ \zeta(s) = \prod_{p \text{ prime}} \frac{1}{1 - p^{-s}} = \left( \frac{1}{1 - 2^{-s}} \right) \left( \frac{1}{1 - 3^{-s}} \right) \left( \frac{1}{1 - 5^{-s}} \right) \dots $$
&lt;p>प्रमाण की सहज समझ यह है कि दाईं ओर के प्रत्येक पद को एक गुणोत्तर श्रेणी के रूप में विस्तारित करके और उन्हें गुणा करके, अंकगणित के मूलभूत प्रमेय (सभी प्राकृतिक संख्याओं को अभाज्य संख्याओं के उत्पाद के रूप में विशिष्ट रूप से दर्शाया जाता है) के कारण, बाईं ओर की प्राकृतिक संख्याओं के व्युत्क्रमों का योग पूरी तरह से पुनर्गठित हो जाता है।&lt;/p>
&lt;p>&lt;strong>यह एक ही सूत्र विश्लेषण (अनंत श्रृंखला और निरंतर कार्य) और संख्या सिद्धांत (अभाज्य संख्या और असतत संख्या) को जोड़ने वाला सेतु बन गया।&lt;/strong> ज़ेटा फ़ंक्शन की जांच करना अभाज्य संख्याओं के वितरण की जांच करने के समान है।&lt;/p>
&lt;hr>
&lt;h1 id="4-वशलषणतमक-नरतरत-और-सममशर-तल-म-वसतर">4. विश्लेषणात्मक निरंतरता और सम्मिश्र तल में विस्तार
&lt;/h1>&lt;p>रीमैन की प्रतिभा इस बात में निहित है कि उन्होंने चर $s$ को, जिसे यूलर ने केवल वास्तविक संख्याओं के लिए $\zeta(s)$ में माना था, &lt;strong>सम्मिश्र संख्या $s = \sigma + it$ ($\sigma$ वास्तविक भाग है, $t$ काल्पनिक भाग है)&lt;/strong> में विस्तारित किया।&lt;/p>
&lt;p>मूल अनंत श्रृंखला केवल $\sigma > 1$ के लिए अभिसरण करती है, लेकिन रीमैन ने &amp;ldquo;विश्लेषणात्मक निरंतरता (Analytic Continuation)&amp;rdquo; नामक तकनीक का उपयोग करके परिभाषा का विस्तार किया ताकि $\zeta(s)$ का अर्थ पूरे सम्मिश्र तल पर हो, सिवाय $s = 1$ के पोल के।&lt;/p>
&lt;p>उन्होंने ज़ेटा फ़ंक्शन द्वारा संतुष्ट एक सुंदर कार्यात्मक समीकरण (Functional equation) भी प्राप्त किया।&lt;/p>
$$ \zeta(s) = 2^s \pi^{s-1} \sin\left(\frac{\pi s}{2}\right) \Gamma(1-s) \zeta(1-s) $$
&lt;p>यहाँ $\Gamma(x)$ गामा फ़ंक्शन है। इस समीकरण के साथ, हम दाहिने आधे तल के गुणों से बाएं आधे तल के गुणों को जान सकते हैं।&lt;/p>
&lt;h3 id="शनय-zeros-of-the-zeta-function">शून्य (Zeros of the Zeta Function)
&lt;/h3>&lt;p>सम्मिश्र संख्या $s$ जहाँ ज़ेटा फ़ंक्शन का मान 0 हो जाता है, उसे &amp;ldquo;शून्य&amp;rdquo; कहा जाता है।
कार्यात्मक समीकरण से, जब $s$ एक ऋणात्मक सम संख्या ($-2, -4, -6, \dots$) होती है, $\sin(\pi s / 2)$ 0 हो जाता है, इसलिए $\zeta(s) = 0$ होता है। इन्हें &lt;strong>तुच्छ शून्य (Trivial zeros)&lt;/strong> कहा जाता है।&lt;/p>
&lt;p>हालाँकि, अभाज्य संख्याओं के वितरण में जो महत्वपूर्ण है वह अन्य शून्य हैं, अर्थात् &lt;strong>गैर-तुच्छ शून्य (Non-trivial zeros)&lt;/strong> जो $0 \le \sigma \le 1$ के &amp;ldquo;महत्वपूर्ण क्षेत्र (Critical strip)&amp;rdquo; में मौजूद हैं।&lt;/p>
&lt;hr>
&lt;h1 id="5-रमन-परकलपन-क-मल-और-सपषट-सतर">5. रीमैन परिकल्पना का मूल और स्पष्ट सूत्र
&lt;/h1>&lt;p>रीमैन ने कुछ शून्यों की गणना की और एक आश्चर्यजनक परिकल्पना प्रस्तुत की। यह &lt;strong>रीमैन परिकल्पना&lt;/strong> है।&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>रीमैन परिकल्पना (Riemann Hypothesis)&lt;/strong>
रीमैन ज़ेटा फ़ंक्शन $\zeta(s)$ के सभी गैर-तुच्छ शून्य उस रेखा पर स्थित होते हैं जिसका वास्तविक भाग $1/2$ है ($\text{Re}(s) = 1/2$)।&lt;/p>
&lt;/blockquote>
&lt;p>इस वास्तविक भाग $1/2$ वाली रेखा को &amp;ldquo;महत्वपूर्ण रेखा (Critical line)&amp;rdquo; कहा जाता है।&lt;/p>
&lt;div class="mermaid">graph TD
A["रीमैन ज़ेटा फ़ंक्शन ζ(s)"] --> B["विश्लेषणात्मक निरंतरता द्वारा सम्मिश्र तल में विस्तार"]
B --> C["तुच्छ शून्य (s = -2, -4, -6 ...)"]
B --> D["गैर-तुच्छ शून्य (0 &lt;= Re(s) &lt;= 1)"]
D --> E["रीमैन परिकल्पना"]
E --> F["सभी गैर-तुच्छ शून्य Re(s) = 1/2 पर स्थित हैं"]
F --> G["अभाज्य वितरण की त्रुटि अवधि की सीमा के प्रमाण की ओर"]&lt;/div>
&lt;p>रीमैन परिकल्पना इतनी महत्वपूर्ण क्यों है? ऐसा इसलिए है क्योंकि ज़ेटा फ़ंक्शन के शून्य अभाज्य संख्याओं के वितरण को &lt;strong>पूरी तरह से&lt;/strong> निर्धारित करते हैं।&lt;/p>
&lt;p>रीमैन और बाद के गणितज्ञ वॉन मैंगोल्ड्ट ने अभाज्य संख्याओं के वितरण का सटीक वर्णन करने के लिए एक &amp;ldquo;स्पष्ट सूत्र (Explicit formula)&amp;rdquo; प्राप्त किया। चेबीशेव फ़ंक्शन $\psi(x)$ का उपयोग करते हुए, इसे इस प्रकार व्यक्त किया जाता है:&lt;/p>
$$ \psi(x) = x - \sum_{\rho} \frac{x^\rho}{\rho} - \ln(2\pi) - \frac{1}{2}\ln(1 - x^{-2}) $$
&lt;p>यहाँ $\rho$ ज़ेटा फ़ंक्शन के सभी गैर-तुच्छ शून्यों पर योग है।
मुख्य पद $x$ है (जो अभाज्य संख्या प्रमेय से मेल खाता है), और वहां से, शून्य $\rho$ पर निर्भर तरंग जैसे पदों को जोड़ने और घटाने से, अभाज्य संख्याओं का सटीक सीढ़ी जैसा वितरण बहाल हो जाता है। यह कहा जा सकता है कि गैर-तुच्छ शून्य अभाज्य संख्याओं के वितरण की &amp;ldquo;आवृत्ति (तरंग)&amp;rdquo; का प्रतिनिधित्व करते हैं।&lt;/p>
&lt;p>यदि रीमैन परिकल्पना सही है और सभी गैर-तुच्छ शून्यों $\rho$ का वास्तविक भाग ठीक $1/2$ है, तो अभाज्य संख्या प्रमेय का त्रुटि पद सैद्धांतिक रूप से संभव न्यूनतम सीमा के भीतर होगा।&lt;/p>
$$ |\pi(x) - \text{Li}(x)| \le \frac{1}{8\pi} \sqrt{x} \ln x \quad \text{for} \quad x \ge 2657 $$
&lt;p>दूसरे शब्दों में, &lt;strong>यदि रीमैन परिकल्पना सत्य है, तो यह सिद्ध हो जाएगा कि अभाज्य संख्याएँ सबसे &amp;ldquo;नियमित और सुंदर&amp;rdquo; तरीके से वितरित हैं जिसकी हम कल्पना कर सकते हैं&lt;/strong>।&lt;/p>
&lt;hr>
&lt;h1 id="6-आधनक-करपटगरफ-और-अभजय-सखयओ-क-बच-अवभजय-सबध">6. आधुनिक क्रिप्टोग्राफी और अभाज्य संख्याओं के बीच अविभाज्य संबंध
&lt;/h1>&lt;p>अब तक यह शुद्ध गणित की एक गहरी दुनिया थी, लेकिन अभाज्य संख्याओं के ये गुण मूल रूप से आधुनिक डिजिटल समाज का समर्थन करते हैं। एक विशिष्ट उदाहरण पब्लिक-की क्रिप्टोग्राफी है, जैसे कि &lt;strong>RSA क्रिप्टोग्राफी&lt;/strong>।&lt;/p>
&lt;p>इंटरनेट पर क्रेडिट कार्ड भुगतान, पासवर्ड का प्रसारण और ब्लॉकचेन के डिजिटल हस्ताक्षर जैसे सभी संचारों की सुरक्षा &amp;ldquo;अभाज्य संख्याओं&amp;rdquo; पर निर्भर करती है।&lt;/p>
&lt;h3 id="rsa-करपटगरफ-कस-कम-करत-ह">RSA क्रिप्टोग्राफी कैसे काम करती है
&lt;/h3>&lt;p>RSA क्रिप्टोग्राफी की सुरक्षा इस गणितीय तथ्य (पूर्णांक गुणनखंड समस्या) पर आधारित है कि &amp;ldquo;कई अंकों वाली एक समग्र संख्या का गुणनखंड करना बेहद मुश्किल है।&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>कुंजी निर्माण&lt;/strong>:
विशाल अभाज्य संख्याएँ $p$ और $q$ (उदाहरण के लिए, प्रत्येक 2048 बिट) यादृच्छिक रूप से चुनी जाती हैं।
उन्हें गुणा करके $N = p \times q$ की गणना की जाती है। यह $N$ सार्वजनिक कुंजी का हिस्सा बन जाता है।
यूलर के टॉटिएंट फ़ंक्शन $\phi(N) = (p-1)(q-1)$ का उपयोग करके, एक गुप्त कुंजी $d$ उत्पन्न की जाती है।&lt;/p>
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
&lt;/li>
&lt;li>
&lt;p>&lt;strong>एन्क्रिप्शन और डिक्रिप्शन&lt;/strong>:
सादा पाठ $M$ को सार्वजनिक कुंजी $e, N$ का उपयोग करके सिफरटेक्स्ट $C$ में परिवर्तित किया जाता है।
&lt;/p>
$$ C \equiv M^e \pmod{N} $$
&lt;p>
केवल गुप्त कुंजी $d$ वाला व्यक्ति ही इसे डिक्रिप्ट कर सकता है।
&lt;/p>
$$ M \equiv C^d \pmod{N} $$
&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph LR
A["सादा पाठ (Plaintext)"] --> B["सार्वजनिक कुंजी (e, N) के साथ एन्क्रिप्ट करें"]
B --> C["सिफरटेक्स्ट (Ciphertext)"]
C --> D["गुप्त कुंजी (d) के साथ डिक्रिप्ट करें"]
D --> E["मूल सादा पाठ"]
F["हमलावर (Attacker)"] -- "N का गुणनखंड करने का प्रयास करता है" --> C
F -.-> G["p और q के बिना d की गणना नहीं की जा सकती"]&lt;/div>
&lt;p>RSA क्रिप्टोग्राफी को तोड़ने के लिए, विशाल $N$ से मूल अभाज्य संख्याओं $p$ और $q$ को खोजना (गुणनखंड करना) आवश्यक है। यहां तक ​​कि वर्तमान मुख्यधारा के एल्गोरिदम (जैसे जनरल नंबर फील्ड सीव: GNFS) का उपयोग करके, सुपर कंप्यूटर का उपयोग करके सैकड़ों अंकों की संख्या का गुणनखंड करने में ब्रह्मांड की आयु से बहुत अधिक समय लगने की उम्मीद है।&lt;/p>
&lt;hr>
&lt;h1 id="7-करपटगरफ-पर-रमन-परकलपन-क-परभव">7. क्रिप्टोग्राफी पर रीमैन परिकल्पना का प्रभाव
&lt;/h1>&lt;p>तो, &amp;ldquo;रीमैन परिकल्पना&amp;rdquo; (शुद्ध गणित का शिखर) और &amp;ldquo;क्रिप्टोग्राफी&amp;rdquo; एक दूसरे को कैसे पार करते हैं?&lt;/p>
&lt;h3 id="71-अभजय-सखय-जनरशन-एलगरदम-परइमलट-टसटग-और-जनरलइजड-रमन-परकलपन-grh">7.1. अभाज्य संख्या जनरेशन एल्गोरिदम (प्राइमलिटी टेस्टिंग) और जनरलाइज्ड रीमैन परिकल्पना (GRH)
&lt;/h3>&lt;p>RSA क्रिप्टोग्राफी को संचालित करने के लिए, पहले विशाल अभाज्य संख्याएँ $p$ और $q$ उत्पन्न करनी होंगी। हालाँकि, यह निश्चित रूप से और तेज़ी से निर्धारित करना आसान नहीं है कि &amp;ldquo;क्या कोई संख्या अभाज्य है।&amp;rdquo;&lt;/p>
&lt;p>वर्तमान में, व्यावहारिक उपयोग में आने वाला &lt;strong>मिलर-राबिन प्राइमलिटी टेस्ट (Miller-Rabin primality test)&lt;/strong> एक संभाव्य एल्गोरिथ्म है। यह एल्गोरिथ्म तेज़ है, लेकिन एक &amp;ldquo;छद्म-अभाज्य&amp;rdquo; जोखिम है जहाँ यह एक समग्र संख्या को बहुत कम संभावना के साथ अभाज्य संख्या के रूप में गलत रूप से आंक सकता है।&lt;/p>
&lt;p>हालाँकि, यदि हम मान लें कि डिरिचलेट के L-फ़ंक्शंस तक रीमैन परिकल्पना का विस्तार &lt;strong>&amp;ldquo;जनरलाइज्ड रीमैन परिकल्पना (Generalized Riemann Hypothesis, GRH)&amp;rdquo;&lt;/strong> सत्य है, तो कहानी नाटकीय रूप से बदल जाती है।
यदि GRH सत्य है, तो मिलर-राबिन परीक्षण में परीक्षणों की अधिकतम संख्या की गणितीय रूप से गारंटी होती है, और यह एक संभाव्य एल्गोरिथ्म से &lt;strong>&amp;ldquo;नियतात्मक बहुपद-समय एल्गोरिथ्म&amp;rdquo; में परिवर्तित&lt;/strong> हो जाता है (यह AKS प्राइमलिटी परीक्षण की खोज से पहले भी ज्ञात एक महत्वपूर्ण तथ्य था)।&lt;/p>
&lt;p>दूसरे शब्दों में, रीमैन परिकल्पना (और इसका विस्तार) सीधे तौर पर इस बात की गारंटी देता है कि &amp;ldquo;क्या हम पूर्ण विश्वास के साथ और उच्च गति पर विशाल अभाज्य संख्याएँ उत्पन्न कर सकते हैं&amp;rdquo;, जो क्रिप्टोग्राफी की नींव उत्पन्न करने के लिए आवश्यक है।&lt;/p>
&lt;h3 id="72-गणनखड-एलगरदम-क-सथ-सबध">7.2. गुणनखंड एल्गोरिदम के साथ संबंध
&lt;/h3>&lt;p>क्रिप्टोग्राफी को क्रैक करने वाले एल्गोरिदम (जैसे कि जनरल नंबर फील्ड सीव) की कम्प्यूटेशनल जटिलता का मूल्यांकन करते समय, अभाज्य संख्याओं के वितरण का ज्ञान अपरिहार्य है। कई गुणनखंड एल्गोरिदम &amp;ldquo;सहज संख्याओं (Smooth numbers: वे संख्याएँ जिनमें केवल छोटे अभाज्य गुणनखंड होते हैं)&amp;rdquo; के वितरण पर निर्भर करते हैं।&lt;/p>
&lt;p>सहज संख्याएँ कितनी बार दिखाई देती हैं, इसका कड़ाई से मूल्यांकन करने के लिए, अभाज्य संख्याओं के वितरण की गहरी समझ आवश्यक है, और यहाँ भी, विश्लेषणात्मक संख्या सिद्धांत की तकनीकों का उपयोग किया जाता है जो सीधे ज़ेटा फ़ंक्शन और रीमैन परिकल्पना से जुड़ी हैं। यदि रीमैन परिकल्पना सिद्ध हो जाती है और अभाज्य वितरण की त्रुटि पूरी तरह से निर्धारित हो जाती है, तो गुणनखंड एल्गोरिदम की प्रदर्शन सीमाओं का अधिक सटीक आकलन करना संभव होगा।&lt;/p>
&lt;hr>
&lt;h1 id="8-यद-रमन-परकलपन-सदध-ह-जए-त-कय-करपटगरफ-टट-जएग">8. यदि रीमैन परिकल्पना सिद्ध हो जाए, तो क्या क्रिप्टोग्राफी टूट जाएगी?
&lt;/h1>&lt;p>एक शहरी किंवदंती की तरह, यह कभी-कभी कहा जाता है कि &amp;ldquo;यदि रीमैन परिकल्पना हल हो जाती है, तो RSA क्रिप्टोग्राफी तुरंत ढह जाएगी&amp;rdquo;, लेकिन &lt;strong>यह गणितीय रूप से गलत है&lt;/strong>।&lt;/p>
&lt;p>रीमैन परिकल्पना का प्रमाण अपने आप में कोई जादुई एल्गोरिथ्म नहीं बना देगा जो तुरंत गुणनखंड को नाटकीय रूप से तेज कर दे। ऐसा इसलिए है क्योंकि रीमैन परिकल्पना केवल अभाज्य संख्याओं के &amp;ldquo;स्थूल वितरण की नियमितता&amp;rdquo; के बारे में एक प्रमेय है, और यह हमें सीधे यह नहीं बताती है कि एक व्यक्तिगत संख्या $N$ को किस अभाज्य संख्या से विभाजित किया जा सकता है (स्थानीय गुण)।&lt;/p>
&lt;p>हालाँकि, इसका प्रभाव शून्य नहीं है।
ऐसा इसलिए है क्योंकि यह अत्यधिक संभव है कि रीमैन परिकल्पना को सिद्ध करने की प्रक्रिया में &lt;strong>&amp;ldquo;नए गणितीय उपकरण&amp;rdquo; और &amp;ldquo;अज्ञात विश्लेषणात्मक तरीके&amp;rdquo; खोजे जाएंगे&lt;/strong>। इतिहास को देखते हुए, जब फर्मेट का अंतिम प्रमेय और पोइंकारे अनुमान सिद्ध हुए थे, तो इस प्रक्रिया में विकसित नए सिद्धांतों ने पूरे गणित को एक बड़ी छलांग दी थी।&lt;/p>
&lt;p>यदि बीजीय ज्यामिति या गैर-विनिमेय ज्यामिति के अज्ञात तरीके स्थापित हो जाते हैं जो रीमैन ज़ेटा फ़ंक्शन के शून्यों के गुणों को पूरी तरह से हेरफेर कर सकते हैं, तो इस संभावना से इंकार नहीं किया जा सकता है कि इससे एक ग्राउंडब्रेकिंग गुणनखंडन एल्गोरिथ्म (उदाहरण के लिए, एक शास्त्रीय एल्गोरिथ्म जो बहुपद समय में कम्प्यूटेशनल जटिलता को कम करता है) की खोज हो सकती है। इस अर्थ में, क्रिप्टोग्राफर कभी भी रीमैन परिकल्पना के घटनाक्रमों से अपनी आँखें नहीं हटा सकते हैं।&lt;/p>
&lt;h3 id="कवटम-कपयटर-और-शर-क-एलगरथम">क्वांटम कंप्यूटर और शोर का एल्गोरिथ्म
&lt;/h3>&lt;p>क्रिप्टोग्राफी के लिए एक अधिक प्रत्यक्ष और यथार्थवादी खतरा रीमैन परिकल्पना का प्रमाण नहीं है बल्कि &lt;strong>क्वांटम कंप्यूटर&lt;/strong> है। 1994 में पीटर शोर (Peter Shor) द्वारा प्रकाशित &amp;ldquo;शोर का एल्गोरिथ्म&amp;rdquo; ने साबित कर दिया कि यदि पर्याप्त प्रदर्शन वाला क्वांटम कंप्यूटर है, तो गुणनखंडन को बहुपद समय में हल किया जा सकता है। इससे RSA क्रिप्टोग्राफी और एलिप्टिक कर्व क्रिप्टोग्राफी मौलिक रूप से टूट जाएगी।&lt;/p>
&lt;p>वर्तमान में, दुनिया भर में &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (Post-Quantum Cryptography, PQC)&amp;rdquo; (जैसे लैटिस-आधारित क्रिप्टोग्राफी) का संक्रमण चल रहा है जिसे क्वांटम कंप्यूटर भी डिक्रिप्ट नहीं कर सकते हैं। अभाज्य संख्याओं पर निर्भर क्रिप्टोग्राफ़िक तकनीकें एक मायने में अपने स्वर्ण युग को समाप्त कर रही हैं, लेकिन स्वयं अभाज्य संख्याओं का गणितीय मूल्य कभी नष्ट नहीं होगा।&lt;/p>
&lt;hr>
&lt;h1 id="9-नषकरष-गणत-क-अमरतकरण-और-वसतवक-समज-क-चरह">9. निष्कर्ष: गणित के अमूर्तीकरण और वास्तविक समाज का चौराहा
&lt;/h1>&lt;div class="mermaid">graph TD
A["शुद्ध गणित की खोज"] --> B["रीमैन परिकल्पना का स्पष्टीकरण"]
B --> C["अभाज्य वितरण की पूर्ण समझ"]
C --> D["संख्या सिद्धांत और बीजीय ज्यामिति में तेजी से विकास"]
D -.-> E["नए गुणनखंडन एल्गोरिदम की संभावना"]
E -.-> F["क्रिप्टोग्राफी के सुरक्षा मूल्यांकन का अद्यतन"]
A --> G["अनुप्रयुक्त गणित और कंप्यूटर विज्ञान"]
G --> H["प्राइमलिटी टेस्टिंग और कुंजी जनरेशन की दक्षता"]
H --> F&lt;/div>
&lt;p>प्राचीन ग्रीस से अभाज्य संख्याओं की अथक खोज को रीमैन नाम के एक जीनियस द्वारा सम्मिश्र तल (ज़ेटा फ़ंक्शन के शून्य) पर एक सुंदर सिम्फनी में बदल दिया गया था। और आश्चर्यजनक रूप से, सदियों बाद, शुद्ध गणित के उस क्रिस्टल को इंटरनेट समाज की सुरक्षा की गारंटी देने के लिए सबसे मजबूत ढाल के रूप में लागू किया जा रहा है।&lt;/p>
&lt;p>रीमैन परिकल्पना एक ही समय में गणित की &amp;ldquo;अमूर्त सुंदरता&amp;rdquo; और &amp;ldquo;भौतिक दुनिया और वास्तविक समाज के लिए इसकी आश्चर्यजनक प्रयोज्यता&amp;rdquo; का प्रतीक है।&lt;/p>
&lt;p>जब गणित के इस विशाल पर्वत पर अंततः विजय प्राप्त कर ली जाएगी, जिस पर अभी तक कोई नहीं पहुंच पाया है, तो हम अभाज्य संख्याओं की लौकिक सच्चाई को पूरी तरह से समझ लेंगे, और साथ ही सूचना समाज की नींव पर एक नया दृष्टिकोण प्राप्त करेंगे। क्रिप्टोग्राफी सीखना स्वयं मानवता के ज्ञान के इतिहास का पता लगाने की यात्रा है।&lt;/p></description></item><item><title>क्रिप्टोग्राफी का इतिहास: सीज़र साइफर से पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) तक</title><link>http://kenji.blog/hi/p/history-of-cryptography-caesar-to-pqc/</link><pubDate>Fri, 11 Sep 2026 15:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/history-of-cryptography-caesar-to-pqc/</guid><description>&lt;img src="http://kenji.blog/p/history-of-cryptography-caesar-to-pqc/img/eyecatch.jpg" alt="Featured image of post क्रिप्टोग्राफी का इतिहास: सीज़र साइफर से पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC) तक" />&lt;h1 id="1-परचय-करपटगरफ-cryptography-कय-ह">1. परिचय: क्रिप्टोग्राफी (Cryptography) क्या है?
&lt;/h1>&lt;p>क्रिप्टोग्राफी (Cryptography) जानकारी को गोपनीय रखने की एक तकनीक है, जिसका विकास मानव इतिहास के साथ हुआ है। प्राचीन युद्धों में गुप्त आदेशों के प्रसारण से लेकर आधुनिक इंटरनेट पर क्रेडिट कार्ड की जानकारी की सुरक्षा तक, क्रिप्टोग्राफी का उद्देश्य एक समान रहा है। वह है: &amp;ldquo;यह सुनिश्चित करना कि केवल इच्छित प्राप्तकर्ता ही जानकारी को समझ सके और कोई तीसरा व्यक्ति इसे डिक्रिप्ट (decrypt) न कर सके।&amp;rdquo;&lt;/p>
&lt;p>आधुनिक सूचना सुरक्षा (information security) में, क्रिप्टोग्राफी केवल &amp;ldquo;सूचना की गोपनीयता (Confidentiality)&amp;rdquo; तक सीमित नहीं है, बल्कि यह डेटा की &amp;ldquo;अखंडता (Integrity)&amp;rdquo;, &amp;ldquo;प्रमाणीकरण (Authentication)&amp;rdquo;, और &amp;ldquo;गैर-अस्वीकरण (Non-repudiation)&amp;rdquo; जैसी महत्वपूर्ण भूमिकाएँ भी निभाती है।&lt;/p>
&lt;p>इस लेख में, हम प्राचीन सरल प्रतिस्थापन साइफर (substitution cipher) से शुरू करके, मैकेनिकल साइफर, आधुनिक सिमेट्रिक (symmetric) और पब्लिक-की (public-key) क्रिप्टोग्राफी, और अंततः क्वांटम कंप्यूटर के व्यावहारिक उपयोग के साथ आने वाले &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC)&amp;rdquo; युग तक, तकनीकी और गणितीय दृष्टिकोण से क्रिप्टोग्राफी के विकास के इतिहास की विस्तार से पड़ताल करेंगे।&lt;/p>
&lt;hr>
&lt;h1 id="2-कलसकल-करपटगरफ-क-यग-अकषर-क-परतसथपन-और-पनरवयवसथ">2. क्लासिकल क्रिप्टोग्राफी का युग: अक्षरों का प्रतिस्थापन और पुनर्व्यवस्था
&lt;/h1>&lt;p>क्रिप्टोग्राफी की उत्पत्ति ईसा पूर्व युग की है। प्रारंभिक साइफर मुख्य रूप से दो दृष्टिकोणों से बने थे: &amp;ldquo;स्थानांतरण (Transposition - पुनर्व्यवस्था)&amp;rdquo; और &amp;ldquo;प्रतिस्थापन (Substitution - बदलना)&amp;quot;।&lt;/p>
&lt;h2 id="सइटल-scytale-सइफर-सथनतरण-सइफर">साइटेल (Scytale) साइफर (स्थानांतरण साइफर)
&lt;/h2>&lt;p>5वीं शताब्दी ईसा पूर्व में प्राचीन ग्रीस के स्पार्टा में इस्तेमाल किया गया &amp;ldquo;साइटेल (Scytale)&amp;rdquo; सबसे पुराने क्रिप्टोग्राफिक उपकरणों में से एक है। इसमें एक विशिष्ट मोटाई की लकड़ी की छड़ी के चारों ओर चर्मपत्र (parchment) की एक लंबी पट्टी लपेटी जाती थी, और उस पर क्षैतिज रूप से संदेश लिखा जाता था। जब कागज को खोला जाता था, तो अक्षर एक निरर्थक क्रम में व्यवस्थित हो जाते थे, लेकिन जब समान मोटाई की छड़ी वाला प्राप्तकर्ता कागज को फिर से लपेटता था, तो मूल संदेश पढ़ा जा सकता था।&lt;/p>
&lt;h2 id="सजर-सइफर-मनअलफबटक-परतसथपन-सइफर">सीज़र साइफर (मोनोअल्फाबेटिक प्रतिस्थापन साइफर)
&lt;/h2>&lt;p>प्रथम शताब्दी ईसा पूर्व में, प्राचीन रोमन नायक जूलियस सीज़र द्वारा &amp;ldquo;सीज़र साइफर&amp;rdquo; का उपयोग किया गया था। यह एक मोनोअल्फाबेटिक प्रतिस्थापन (Monoalphabetic substitution) साइफर है जो वर्णमाला के अक्षरों को एक निश्चित संख्या (आमतौर पर 3 अक्षर) से स्थानांतरित (shift) करता है।&lt;/p>
&lt;p>गणितीय रूप से, यदि अक्षरों को $0$ से $25$ तक की संख्याओं के रूप में माना जाता है और शिफ्ट की संख्या $K$ है, तो प्लेनटेक्स्ट $P$ से सिफरटेक्स्ट $C$ में रूपांतरण को निम्नलिखित सर्वांगसमता (congruence) समीकरण द्वारा व्यक्त किया जाता है:&lt;/p>
$$C \equiv P + K \pmod{26}$$
&lt;p>डिक्रिप्शन में इसके विपरीत प्रक्रिया की जाती है:&lt;/p>
$$P \equiv C - K \pmod{26}$$
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># सीज़र साइफर का एक सरल Python कार्यान्वयन (Implementation)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">caesar_cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">shift&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;encrypt&amp;#34;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">mode&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;decrypt&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shift&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">shift&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">char&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">char&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isalpha&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;A&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">char&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isupper&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># शिफ्ट गणना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="nb">chr&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nb">ord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">char&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">base&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">shift&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">26&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">char&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">result&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># निष्पादन उदाहरण (Execution Example)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">plaintext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;HELLO WORLD&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">caesar_cipher&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">plaintext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;encrypt&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;सिफरटेक्स्ट: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># KHOOR ZRUOG&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="फरकवस-एनलसस-आवतत-वशलषण-और-वगनयर-vigenère-सइफर">फ्रीक्वेंसी एनालिसिस (आवृत्ति विश्लेषण) और विग्नेयर (Vigenère) साइफर
&lt;/h2>&lt;p>मोनोअल्फाबेटिक प्रतिस्थापन साइफर को 9वीं शताब्दी के अरब विद्वान अल-किंडी द्वारा आविष्कार किए गए &amp;ldquo;आवृत्ति विश्लेषण (Frequency Analysis)&amp;rdquo; द्वारा आसानी से डिक्रिप्ट किया जाने लगा। यह भाषा की सांख्यिकीय विशेषताओं का उपयोग करता है, जैसे कि अंग्रेजी में &amp;ldquo;E&amp;rdquo; और &amp;ldquo;T&amp;rdquo; का बार-बार आना।&lt;/p>
&lt;p>इसका मुकाबला करने के लिए, 16वीं शताब्दी में &amp;ldquo;विग्नेयर साइफर (Vigenère cipher)&amp;rdquo; का आविष्कार किया गया था। यह एक पॉलिएल्फाबेटिक प्रतिस्थापन (Polyalphabetic substitution) साइफर है जो समय-समय पर कई शिफ्ट्स (कुंजियों) का उपयोग करता है, और इसे लगभग 300 वर्षों तक &amp;ldquo;अभेद्य साइफर (Le Chiffre Indéchiffrable)&amp;rdquo; कहा जाता था।&lt;/p>
&lt;p>गणितीय रूप से, इसे प्लेनटेक्स्ट के $i$-वें अक्षर $P_i$ और दोहराई जाने वाली कुंजी के $i$-वें अक्षर $K_i$ का उपयोग करके इस प्रकार एन्क्रिप्ट किया जाता है:&lt;/p>
$$C_i \equiv P_i + K_i \pmod{26}$$
&lt;p>19वीं शताब्दी में, इस साइफर को चार्ल्स बैबेज और फ्रेडरिक कासिस्की द्वारा भी तोड़ दिया गया था, जिन्होंने &amp;ldquo;कासिस्की परीक्षण (Kasiski examination)&amp;rdquo; की खोज की थी, जो सिफरटेक्स्ट में दोहराए जाने वाले पैटर्न से कुंजी की लंबाई निर्धारित करता है।&lt;/p>
&lt;div class="mermaid">graph TD
subgraph "क्लासिकल क्रिप्टोग्राफी का वर्गीकरण"
A["क्लासिकल क्रिप्टोग्राफी"] --> B["स्थानांतरण साइफर"]
A --> C["प्रतिस्थापन साइफर"]
B --> D["साइटेल साइफर"]
C --> E["मोनोअल्फाबेटिक"]
C --> F["पॉलिएल्फाबेटिक"]
E --> G["सीज़र साइफर"]
F --> H["विग्नेयर साइफर"]
end&lt;/div>
&lt;hr>
&lt;h1 id="3-मकनकल-करपटगरफ-और-वशव-यदध-एनगम-enigma-और-इसक-डकरपशन">3. मैकेनिकल क्रिप्टोग्राफी और विश्व युद्ध: एनिग्मा (Enigma) और इसका डिक्रिप्शन
&lt;/h1>&lt;p>20वीं सदी की शुरुआत में, संचार के साधन पत्रों से टेलीग्राफ और रेडियो में बदल गए, जिससे एन्क्रिप्शन की गति और जटिलता की मांग बढ़ गई। यहीं पर रोटर्स (घुमावदार डिस्क) को जोड़ने वाली &amp;ldquo;मैकेनिकल क्रिप्टोग्राफी&amp;rdquo; सामने आई।&lt;/p>
&lt;h2 id="एनगम-enigma-क-खतर">एनिग्मा (Enigma) का खतरा
&lt;/h2>&lt;p>द्वितीय विश्व युद्ध के दौरान नाजी जर्मनी द्वारा इस्तेमाल की जाने वाली &amp;ldquo;एनिग्मा&amp;rdquo; क्रिप्टोग्राफी के इतिहास की सबसे प्रसिद्ध सिफर मशीन है। एनिग्मा में कई रोटर (आमतौर पर 3 से 4), अक्षरों की वायरिंग को बदलने के लिए एक प्लगबोर्ड (Steckerbrett), और एक रिफ्लेक्टर (रिवर्सिंग रोटर) शामिल थे।&lt;/p>
&lt;p>हर बार जब कीबोर्ड पर कोई अक्षर टाइप किया जाता था, तो रोटर घूम जाता था, इसलिए एक ही अक्षर को लगातार टाइप करने पर भी अलग-अलग सिफर अक्षर आउटपुट होते थे (पॉलिएल्फाबेटिक साइफर का चरम रूप)। इसका कुंजी स्थान (सेटिंग्स के संयोजन) लगभग $1.58 \times 10^{19}$ था, जिसे उस समय की तकनीक के साथ ब्रूट-फोर्स (brute-force) हमले से क्रैक करना असंभव माना जाता था।&lt;/p>
&lt;h2 id="एलन-टयरग-alan-turing-और-बमब-bombe">एलन ट्यूरिंग (Alan Turing) और &amp;ldquo;बॉम्बे (Bombe)&amp;rdquo;
&lt;/h2>&lt;p>पोलिश गणितज्ञ मैरियन रेजेव्स्की और अन्य लोगों की शुरुआती उपलब्धियों को आगे बढ़ाते हुए, ब्रिटेन के बैलेचली पार्क (Bletchley Park) की कोडब्रेकिंग टीम ने इस अभेद्य एनिग्मा को चुनौती दी।&lt;/p>
&lt;p>विशेष रूप से एलन ट्यूरिंग (Alan Turing) ने सिफरटेक्स्ट के एक हिस्से (जिसे क्रिब या Crib कहा जाता है) के अनुरूप प्लेनटेक्स्ट के अनुमान का उपयोग करते हुए, &amp;ldquo;बॉम्बे (Bombe)&amp;rdquo; नामक एक इलेक्ट्रोमैकेनिकल डिकोडिंग मशीन विकसित की। बॉम्बे ने उच्च गति पर तार्किक विरोधाभासों का पता लगाया, और एक के बाद एक असंभव रोटर सेटिंग्स को समाप्त करके, सफलतापूर्वक एनिग्मा को डिक्रिप्ट किया। कहा जाता है कि इस उपलब्धि ने मित्र राष्ट्रों (Allies) की जीत को कई साल पहले ला दिया था।&lt;/p>
&lt;hr>
&lt;h1 id="4-आधनक-करपटगरफ-क-शरआत-समटरक-क-करपटगरफ-des-और-aes">4. आधुनिक क्रिप्टोग्राफी की शुरुआत: सिमेट्रिक-की क्रिप्टोग्राफी (DES और AES)
&lt;/h1>&lt;p>युद्ध के बाद, कंप्यूटर के आगमन के साथ, क्रिप्टोग्राफी ने &amp;ldquo;अक्षरों&amp;rdquo; के हेरफेर से &amp;ldquo;बिट्स (0 और 1)&amp;rdquo; के हेरफेर में एक नाटकीय बदलाव (paradigm shift) का अनुभव किया।&lt;/p>
&lt;h2 id="कलउड-शनन-claude-shannon-और-सचन-सदधत-information-theory">क्लाउड शैनन (Claude Shannon) और सूचना सिद्धांत (Information Theory)
&lt;/h2>&lt;p>1949 में, क्लाउड शैनन ने &amp;ldquo;गोपनीय प्रणालियों का संचार सिद्धांत (Communication Theory of Secrecy Systems)&amp;rdquo; नामक एक पेपर प्रकाशित किया, जिसने आधुनिक क्रिप्टोग्राफी की गणितीय नींव रखी। उन्होंने सुरक्षित साइफर डिजाइन के सिद्धांतों के रूप में &amp;ldquo;भ्रम (Confusion)&amp;rdquo; और &amp;ldquo;प्रसार (Diffusion)&amp;rdquo; का प्रस्ताव रखा।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>भ्रम (Confusion)&lt;/strong>: कुंजी और सिफरटेक्स्ट के बीच के संबंध को यथासंभव जटिल बनाना। (प्रतिस्थापन / S-box के माध्यम से महसूस किया गया)&lt;/li>
&lt;li>&lt;strong>प्रसार (Diffusion)&lt;/strong>: यह सुनिश्चित करना कि प्लेनटेक्स्ट के 1 बिट में परिवर्तन सिफरटेक्स्ट के कई बिट्स को प्रभावित करता है। (स्थानांतरण / पुनर्व्यवस्था के माध्यम से महसूस किया गया)&lt;/li>
&lt;/ul>
&lt;h2 id="des-डट-एनकरपशन-सटडरड--data-encryption-standard">DES (डेटा एन्क्रिप्शन स्टैंडर्ड / Data Encryption Standard)
&lt;/h2>&lt;p>1977 में, अमेरिकी राष्ट्रीय मानक और प्रौद्योगिकी संस्थान (NIST, जिसे तब NBS कहा जाता था) ने IBM के डिज़ाइन पर आधारित &amp;ldquo;DES&amp;rdquo; को एक मानक साइफर के रूप में स्थापित किया।
DES एक वास्तुकला (architecture) का उपयोग करता है जिसे &amp;ldquo;फीस्टेल नेटवर्क (Feistel Network)&amp;rdquo; कहा जाता है, जिसमें 64-बिट ब्लॉक लंबाई और 56-बिट कुंजी लंबाई होती है। इसका एक कार्यान्वयन (implementation) लाभ यह था कि एन्क्रिप्शन और डिक्रिप्शन एल्गोरिदम की संरचना लगभग समान थी।&lt;/p>
&lt;p>हालाँकि, जैसे-जैसे कंप्यूटर की कम्प्यूटेशनल शक्ति में सुधार हुआ, यह स्पष्ट हो गया कि 56-बिट कुंजी लंबाई (लगभग $7.2 \times 10^{16}$ संयोजन) अपर्याप्त थी। 1998 में, इलेक्ट्रॉनिक फ्रंटियर फाउंडेशन (EFF) ने &amp;ldquo;डीप क्रैक (Deep Crack)&amp;rdquo; नामक एक समर्पित मशीन विकसित की, जिसने कुछ ही दिनों में DES को क्रैक कर दिया।&lt;/p>
&lt;h2 id="aes-एडवसड-एनकरपशन-सटडरड--advanced-encryption-standard">AES (एडवांस्ड एन्क्रिप्शन स्टैंडर्ड / Advanced Encryption Standard)
&lt;/h2>&lt;p>2001 में, DES को बदलने के लिए &amp;ldquo;AES&amp;rdquo; को एक नए मानक के रूप में स्थापित किया गया था। सार्वजनिक प्रतियोगिता के माध्यम से बेल्जियम के क्रिप्टोग्राफर्स द्वारा डिज़ाइन किए गए &amp;ldquo;रिजनडेल (Rijndael)&amp;rdquo; एल्गोरिदम को अपनाया गया था।&lt;/p>
&lt;p>AES फीस्टेल नेटवर्क के बजाय &amp;ldquo;SPN संरचना (Substitution-Permutation Network)&amp;rdquo; का उपयोग करता है, और गैल्वा क्षेत्र (परिमित क्षेत्र / finite field) $GF(2^8)$ पर गणितीय संचालन (mathematical operations) का उपयोग करता है। कुंजी की लंबाई 128, 192 या 256 बिट्स के रूप में चुनी जा सकती है, और यह आज भी दुनिया भर में मानक सिमेट्रिक-की क्रिप्टोग्राफी (symmetric-key cryptography) के रूप में व्यापक रूप से उपयोग की जाती है।&lt;/p>
&lt;div class="mermaid">graph TD
subgraph "AES का 1 राउंड प्रोसेस (SPN संरचना)"
A["इनपुट स्थिति (128-बिट)"] --> B("SubBytes (बाइट प्रतिस्थापन / S-Box)")
B --> C("ShiftRows (पंक्ति शिफ्ट)")
C --> D("MixColumns (कॉलम मिक्स / GF(2^8) पर गुणा)")
D --> E("AddRoundKey (राउंड कुंजी के साथ XOR)")
E --> F["अगले राउंड की ओर"]
end&lt;/div>
&lt;hr>
&lt;h1 id="5-पबलक-क-public-key-करपटगरफ-क-करत-डफ-हलमन-diffie-hellman-स-rsa-तक">5. पब्लिक-की (Public-Key) क्रिप्टोग्राफी की क्रांति: डिफी-हेलमैन (Diffie-Hellman) से RSA तक
&lt;/h1>&lt;p>सिमेट्रिक-की (Symmetric-key) क्रिप्टोग्राफी में एक महत्वपूर्ण कमजोरी थी: &amp;ldquo;कुंजी वितरण समस्या (Key Distribution Problem)&amp;quot;। समस्या यह है कि एन्क्रिप्टेड संचार शुरू करने से पहले आप दूर के पक्ष के साथ &amp;ldquo;साझा कुंजी&amp;rdquo; को सुरक्षित रूप से कैसे साझा करते हैं। इस समस्या को 1970 के दशक में &amp;ldquo;पब्लिक-की क्रिप्टोग्राफी (Public-Key Cryptography)&amp;rdquo; के जन्म के साथ हल किया गया था।&lt;/p>
&lt;h2 id="डफ-हलमन-diffie-hellman-कज-वनमय-key-exchange">डिफी-हेलमैन (Diffie-Hellman) कुंजी विनिमय (Key Exchange)
&lt;/h2>&lt;p>1976 में, व्हिटफील्ड डिफी (Whitfield Diffie) और मार्टिन हेलमैन (Martin Hellman) ने &amp;ldquo;क्रिप्टोग्राफी में नई दिशाएं (New Directions in Cryptography)&amp;rdquo; नामक एक अभूतपूर्व शोध पत्र प्रकाशित किया। उन्होंने एक ऐसी विधि का प्रस्ताव दिया जो &amp;ldquo;असतत लघुगणक समस्या (Discrete Logarithm Problem)&amp;rdquo; की गणितीय कठिनाई का उपयोग करके, वायरटैप (wiretapped) संचार पथ पर भी सुरक्षित रूप से कुंजी साझा कर सकती है।&lt;/p>
&lt;ol>
&lt;li>एक बड़ी अभाज्य संख्या (prime number) $p$ और जनरेटर (generator) $g$ को सार्वजनिक करें।&lt;/li>
&lt;li>एलिस (Alice) एक गुप्त मान $a$ चुनती है, और बॉब को $A = g^a \pmod{p}$ भेजती है।&lt;/li>
&lt;li>बॉब (Bob) एक गुप्त मान $b$ चुनता है, और एलिस को $B = g^b \pmod{p}$ भेजता है।&lt;/li>
&lt;li>एलिस $K = B^a \pmod{p}$ की गणना करती है, और बॉब $K = A^b \pmod{p}$ की गणना करता है।&lt;/li>
&lt;li>घातांक के नियमों (laws of exponents) के अनुसार, $K = (g^b)^a = (g^a)^b = g^{ab} \pmod{p}$, जिससे वे दोनों सफलतापूर्वक एक ही कुंजी $K$ साझा कर लेते हैं।&lt;/li>
&lt;/ol>
&lt;h2 id="rsa-करपटगरफ">RSA क्रिप्टोग्राफी
&lt;/h2>&lt;p>अगले वर्ष, 1977 में, रॉन रिवेस्ट (Ron Rivest), आदि शमीर (Adi Shamir) और लियोनार्ड एडलमैन (Leonard Adleman) द्वारा &amp;ldquo;RSA क्रिप्टोग्राफी&amp;rdquo; का आविष्कार किया गया। यह इस गुण पर आधारित है कि &amp;ldquo;बहुत बड़ी भाज्य संख्याओं (composite numbers) का अभाज्य गुणनखंडन (prime factorization) करना बहुत कठिन है।&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>RSA का गणितीय तंत्र:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>दो विशाल अभाज्य संख्याएँ $p$ और $q$ चुनें, और $n = p \times q$ की गणना करें।&lt;/li>
&lt;li>यूलर के टॉटिएंट फ़ंक्शन (Euler&amp;rsquo;s totient function) $\phi(n) = (p-1)(q-1)$ की गणना करें।&lt;/li>
&lt;li>एक ऐसा पूर्णांक $e$ (सार्वजनिक कुंजी / public key) चुनें जो $\phi(n)$ का सह-अभाज्य (coprime) हो।&lt;/li>
&lt;li>एक ऐसा पूर्णांक $d$ (निजी कुंजी / private key) की गणना करें जिससे $e \times d \equiv 1 \pmod{\phi(n)}$ हो।&lt;/li>
&lt;/ol>
&lt;p>एन्क्रिप्शन: प्लेनटेक्स्ट $M$ के लिए, $C \equiv M^e \pmod{n}$
डिक्रिप्शन: सिफरटेक्स्ट $C$ के लिए, $M \equiv C^d \pmod{n}$&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># RSA क्रिप्टोग्राफी की अवधारणा को दर्शाने वाला Python कोड (व्यावहारिक उपयोग के लिए नहीं)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># विस्तारित यूक्लिडियन एल्गोरिदम का उपयोग करके मॉड्यूलर व्युत्क्रम (modular inverse) की गणना&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">g&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">rsa_example&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># छोटी अभाज्य संख्याओं का उपयोग करते हुए उदाहरण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">61&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">53&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">17&lt;/span> &lt;span class="c1"># phi का सह-अभाज्य (coprime) मान&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ext_euclid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">d&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">phi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;सार्वजनिक कुंजी (Public Key): (e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, n=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;निजी कुंजी (Private Key): (d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, n=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># संदेश का एन्क्रिप्शन और डिक्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">65&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">decrypted&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;प्लेनटेक्स्ट: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; सिफरटेक्स्ट: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> -&amp;gt; डिक्रिप्टेड: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">rsa_example&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="6-अणडकर-वकर-करपटगरफ-elliptic-curve-cryptography-ecc-क-उदय">6. अण्डाकार वक्र क्रिप्टोग्राफी (Elliptic Curve Cryptography: ECC) का उदय
&lt;/h1>&lt;p>हालांकि RSA क्रिप्टोग्राफी शक्तिशाली है, लेकिन जैसे-जैसे कंप्यूटर के प्रदर्शन में सुधार हुआ, सुरक्षा बनाए रखने के लिए कुंजी की लंबाई (वर्तमान में 2048 बिट या 3072 बिट) को बढ़ाना आवश्यक हो गया, जिससे कम्प्यूटेशनल लागत में वृद्धि की समस्या उत्पन्न हुई।&lt;/p>
&lt;p>इसलिए 1985 में, &amp;ldquo;अण्डाकार वक्र क्रिप्टोग्राफी (Elliptic Curve Cryptography: ECC)&amp;rdquo; का प्रस्ताव रखा गया था। यह परिमित क्षेत्र (finite field) पर अण्डाकार वक्र (आमतौर पर $y^2 = x^3 + ax + b$ के रूप में) पर बिंदुओं के जोड़ (point addition) का उपयोग करता है।&lt;/p>
&lt;p>अण्डाकार वक्र पर असतत लघुगणक समस्या (Elliptic Curve Discrete Logarithm Problem: ECDLP) को अभाज्य गुणनखंडन समस्या की तुलना में हल करना और भी कठिन माना जाता है, और &lt;strong>RSA के 3072 बिट्स के बराबर सुरक्षा ECC के साथ केवल 256 बिट्स की कुंजी लंबाई के साथ प्राप्त की जा सकती है&lt;/strong>। इसने सीमित कम्प्यूटेशनल संसाधनों वाले वातावरण में भी उच्च गति और सुरक्षित एन्क्रिप्टेड संचार (जैसे ECDSA और ECDH) को संभव बना दिया है, जैसे कि स्मार्टफोन और IoT डिवाइस।&lt;/p>
&lt;hr>
&lt;h1 id="7-कवटम-कपयटर-क-खतर-और-पसट-कवटम-करपटगरफ-pqc">7. क्वांटम कंप्यूटर का खतरा और पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC)
&lt;/h1>&lt;p>क्रिप्टोग्राफी अभेद्य (solid) प्रतीत होती थी, लेकिन 1994 में पीटर शोर (Peter Shor) द्वारा प्रकाशित &amp;ldquo;शोर का एल्गोरिदम (Shor&amp;rsquo;s Algorithm)&amp;rdquo; से एक बड़ा झटका लगा।&lt;/p>
&lt;p>क्वांटम कंप्यूटर गणना करने के लिए &amp;ldquo;सुपरपोजिशन (Superposition)&amp;rdquo; और &amp;ldquo;क्वांटम एंटैंगलमेंट (Quantum Entanglement)&amp;rdquo; जैसे क्वांटम यांत्रिकी (quantum mechanics) के गुणों का उपयोग करते हैं। गणितीय रूप से यह सिद्ध हो चुका है कि यदि शोर के एल्गोरिदम को पर्याप्त रूप से शक्तिशाली क्वांटम कंप्यूटर पर चलाया जाता है, तो अभाज्य गुणनखंडन (prime factorization) और असतत लघुगणक (discrete logarithm) समस्याओं को &amp;ldquo;बहुपद समय (polynomial time)&amp;rdquo; में हल किया जा सकता है। दूसरे शब्दों में, जिस दिन एक व्यावहारिक क्वांटम कंप्यूटर पूरा हो जाएगा (Q-Day), वर्तमान में उपयोग किए जाने वाले RSA और ECC जैसी सभी पब्लिक-की क्रिप्टोग्राफी तुरंत टूट जाएगी।&lt;/p>
&lt;h2 id="pqc-पसट-कवटम-करपटगरफ-क-आगमन">PQC (पोस्ट-क्वांटम क्रिप्टोग्राफी) का आगमन
&lt;/h2>&lt;p>इस अभूतपूर्व खतरे की तैयारी में, नई गणितीय समस्याओं पर आधारित &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC)&amp;rdquo; पर शोध तेज गति से चल रहा है, जिसे क्वांटम कंप्यूटर के लिए भी डिक्रिप्ट करना मुश्किल है। NIST (यूएस नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड एंड टेक्नोलॉजी) कई वर्षों से PQC मानकीकरण प्रक्रिया को आगे बढ़ा रहा है, और मुख्य रूप से निम्नलिखित गणितीय दृष्टिकोणों को सबसे आशाजनक माना जाता है।&lt;/p>
&lt;h3 id="1-लटस-बसड-lattice-based-करपटगरफ">1. लैटीस-बेस्ड (Lattice-based) क्रिप्टोग्राफी
&lt;/h3>&lt;p>वर्तमान में यह सबसे आशाजनक दृष्टिकोण है, और इसे NIST के मानकीकरण एल्गोरिदम (ML-KEM / Kyber, ML-DSA / Dilithium) में भी अपनाया गया है। यह बहुआयामी अंतरिक्ष में &amp;ldquo;लैटीस (Lattice)&amp;rdquo; पर एक विशिष्ट बिंदु खोजने की समस्या (सबसे छोटा वेक्टर समस्या: SVP आदि) या LWE (लर्निंग विद एरर्स: Learning With Errors) समस्या की कठिनाई पर आधारित है।&lt;/p>
&lt;p>LWE समस्या की अवधारणा इस विशेषता का उपयोग करती है कि यदि आप जानबूझकर एक साथ रैखिक समीकरणों की प्रणाली (system of linear equations) में &amp;ldquo;छोटा शोर (त्रुटि)&amp;rdquo; जोड़ते हैं, तो इसके लिए समाधान खोजना बहुत कठिन हो जाता है।
समीकरण प्रणाली: $\mathbf{A}\mathbf{s} + \mathbf{e} \equiv \mathbf{b} \pmod{q}$
($\mathbf{A}$ और $\mathbf{b}$ सार्वजनिक हैं, $\mathbf{s}$ निजी कुंजी है, $\mathbf{e}$ एक छोटा शोर है)&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># LWE समस्या का वैचारिक छद्म-कोड (Pseudocode) (सीखने के उद्देश्य से)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">256&lt;/span> &lt;span class="c1"># आयाम (Dimension)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3329&lt;/span> &lt;span class="c1"># मोडुलो (Modulo)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">512&lt;/span> &lt;span class="c1"># समीकरणों की संख्या&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># निजी कुंजी s और छोटी त्रुटि e&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># सार्वजनिक मैट्रिक्स A और सार्वजनिक वेक्टर b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">s&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># यहां तक कि क्वांटम कंप्यूटर का उपयोग करके भी, A और b से s को पुनर्प्राप्त करना अत्यंत कठिन माना जाता है&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="2-हश-बसड-hash-based-करपटगरफ">2. हैश-बेस्ड (Hash-based) क्रिप्टोग्राफी
&lt;/h3>&lt;p>यह एक डिजिटल हस्ताक्षर योजना है जो अपनी सुरक्षा को केवल हैश फ़ंक्शन के टकराव प्रतिरोध (collision resistance) पर आधारित करती है। चूँकि इसमें कोई गणितीय संरचना नहीं होती है, इसलिए यह क्वांटम हमलों के प्रति प्रतिरोधी है, लेकिन इसके हस्ताक्षर का आकार (signature size) बड़ा होता है (जैसे SPHINCS+)।&lt;/p>
&lt;h3 id="3-कड-बसड-code-based-करपटगरफ">3. कोड-बेस्ड (Code-based) क्रिप्टोग्राफी
&lt;/h3>&lt;p>यह त्रुटि-सुधार कोड (error-correcting codes) के सिद्धांत पर आधारित एन्क्रिप्शन योजना है। 1978 में प्रस्तावित McEliece क्रिप्टोग्राफी प्रसिद्ध है, और इसका लंबा इतिहास और एक स्थापित सुरक्षा प्रतिष्ठा है, लेकिन इसमें एक समस्या यह है कि सार्वजनिक कुंजी का आकार बहुत बड़ा (कभी-कभी कई मेगाबाइट तक) होता है।&lt;/p>
&lt;div class="mermaid">timeline
title "क्रिप्टोग्राफी और कंप्यूटर के विकास का इतिहास"
"प्राचीन - मध्य युग" : "सीज़र साइफर" : "विग्नेयर साइफर" : "आवृत्ति विश्लेषण का जन्म"
"1930 - 40 का दशक" : "एनिग्मा का संचालन और डिक्रिप्शन" : "ट्यूरिंग मशीन / बॉम्बे का विकास"
"1970 का दशक" : "DES मानकीकरण (1977)" : "डिफी-हेलमैन कुंजी विनिमय (1976)" : "RSA क्रिप्टोग्राफी का जन्म (1977)"
"1980 - 90 का दशक" : "अण्डाकार वक्र क्रिप्टोग्राफी (ECC) का प्रस्ताव" : "शोर के एल्गोरिदम का प्रकाशन (1994)"
"2000 का दशक" : "AES मानकीकरण (2001)"
"2010 का दशक - वर्तमान" : "क्वांटम कंप्यूटर अनुसंधान में तेजी" : "NIST द्वारा PQC मानकीकरण परियोजना की शुरुआत"
"निकट भविष्य (Q-Day)" : "बड़े पैमाने पर क्वांटम कंप्यूटर का एहसास?" : "PQC (ML-KEM/ML-DSA) में पूर्ण परिवर्तन"&lt;/div>
&lt;hr>
&lt;h1 id="8-नषकरष-ढल-और-भल-क-कभ-न-खतम-हन-वल-लडई">8. निष्कर्ष: ढाल और भाले की कभी न खत्म होने वाली लड़ाई
&lt;/h1>&lt;p>क्रिप्टोग्राफी का इतिहास नई एन्क्रिप्शन विधियों (ढाल) के आविष्कार और उन्हें तोड़ने के लिए नई डिक्रिप्शन तकनीकों (भाले) के बीच एक कभी न खत्म होने वाली लड़ाई का इतिहास है।&lt;/p>
&lt;p>सीज़र साइफर आवृत्ति विश्लेषण से हार गया, और अजेय मानी जाने वाली एनिग्मा ट्यूरिंग की प्रतिभाशाली बुद्धि और मशीनों की शक्ति से हार गई। और अब, आधुनिक इंटरनेट समाज की नींव रखने वाली RSA और ECC जैसी शक्तिशाली क्रिप्टोग्राफी को भी क्वांटम कंप्यूटर नामक नए &amp;ldquo;भाले&amp;rdquo; के खतरे का सामना करना पड़ रहा है।&lt;/p>
&lt;p>हालाँकि, मानवता पहले ही भविष्य की ओर देख रही है और &amp;ldquo;पोस्ट-क्वांटम क्रिप्टोग्राफी (PQC)&amp;rdquo; के रूप में एक नई &amp;ldquo;ढाल&amp;rdquo; तैयार कर रही है। वर्तमान में, दुनिया भर के आईटी बुनियादी ढांचे में, मौजूदा पब्लिक-की क्रिप्टोग्राफी से PQC में संक्रमण (Crypto Agility सुरक्षित करना) की तैयारी एक तत्काल आवश्यकता बन गई है।&lt;/p>
&lt;p>क्रिप्टोग्राफी केवल एक गूढ़ गणितीय पहेली नहीं है, बल्कि हमारी निजता, संपत्ति और स्वयं सामाजिक बुनियादी ढांचे की रक्षा के लिए सबसे मजबूत बाधा है।&lt;/p></description></item><item><title>【गणित व्याख्या】 हाई स्कूल के छात्रों के लिए RSA एन्क्रिप्शन तंत्र की सरल व्याख्या</title><link>http://kenji.blog/hi/p/rsa-encryption-math-explained-for-beginners/</link><pubDate>Fri, 11 Sep 2026 13:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/rsa-encryption-math-explained-for-beginners/</guid><description>&lt;img src="http://kenji.blog/p/rsa-encryption-math-explained-for-beginners/img/eyecatch.jpg" alt="Featured image of post 【गणित व्याख्या】 हाई स्कूल के छात्रों के लिए RSA एन्क्रिप्शन तंत्र की सरल व्याख्या" />&lt;p>इंटरनेट समाज की सुरक्षा को बुनियादी रूप से समर्थन देने वाली तकनीकों में से एक &amp;ldquo;RSA एन्क्रिप्शन&amp;rdquo; है। ऑनलाइन शॉपिंग में क्रेडिट कार्ड से भुगतान, दोस्तों के साथ सोशल मीडिया पर बातचीत, कंपनी की गोपनीय जानकारी का आदान-प्रदान, आदि—जिन संचारों का हम प्रतिदिन जाने-अनजाने उपयोग करते हैं, उनमें से अधिकांश इस RSA एन्क्रिप्शन या इसकी उत्तराधिकारी तकनीकों द्वारा सुरक्षित होते हैं।&lt;/p>
&lt;p>हालाँकि, &amp;ldquo;एन्क्रिप्शन&amp;rdquo; शब्द सुनकर आप शायद जासूसी फिल्मों में दिखने वाली जटिल एन्क्रिप्शन मशीनों या अति-उन्नत गणित की कल्पना करें जिसे केवल कुछ प्रतिभाशाली लोग ही समझ सकते हैं। यह सच है कि आधुनिक एन्क्रिप्शन सिद्धांत उन्नत गणित पर आधारित है, लेकिन &lt;strong>RSA एन्क्रिप्शन का मूल तंत्र इतना सरल है कि यदि आपको हाई स्कूल के गणित (पूर्णांकों के गुण, अभाज्य संख्याएँ, सर्वांगसमता आदि) का ज्ञान है, तो आप इसे पूरी तरह से समझ सकते हैं।&lt;/strong>&lt;/p>
&lt;p>इस लेख में, हम हाई स्कूल के गणितीय ज्ञान को शुरुआती बिंदु मानते हुए, चरण-दर-चरण विस्तार से बताएंगे कि RSA एन्क्रिप्शन किस गणितीय सिद्धांत पर काम करता है और इसे डिक्रिप्ट करना इतना कठिन क्यों है। जो लोग गणित में थोड़े कमज़ोर हैं, उन्हें भी समझ में आ सके, इसके लिए हम ठोस उदाहरणों के साथ इसे स्पष्ट रूप से समझाएंगे।&lt;/p>
&lt;hr>
&lt;h2 id="1-सममत-कज-एनकरपशन-और-सरवजनक-कज-एनकरपशन">1. सममित कुंजी एन्क्रिप्शन और सार्वजनिक कुंजी एन्क्रिप्शन
&lt;/h2>&lt;p>RSA एन्क्रिप्शन के गणितीय तंत्र में जाने से पहले, आइए एन्क्रिप्शन की बुनियादी अवधारणाओं को समझ लें। एन्क्रिप्शन विधियों को मोटे तौर पर दो प्रकारों में बांटा जा सकता है: &amp;ldquo;सममित कुंजी एन्क्रिप्शन&amp;rdquo; और &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन&amp;rdquo;।&lt;/p>
&lt;h3 id="11-सममत-कज-एनकरपशन-परणल-क-समए">1.1 सममित कुंजी एन्क्रिप्शन प्रणाली की सीमाएँ
&lt;/h3>&lt;p>प्राचीन काल से उपयोग की जाने वाली अधिकांश एन्क्रिप्शन प्रणालियाँ &amp;ldquo;सममित कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo; कहलाती हैं। यह एक ऐसी प्रणाली है जिसमें &lt;strong>&amp;ldquo;एन्क्रिप्शन (संदेश को गुप्त सिफरटेक्स्ट में बदलना)&amp;rdquo; और &amp;ldquo;डिक्रिप्शन (सिफरटेक्स्ट को मूल संदेश में वापस लाना)&amp;rdquo; के लिए एक ही कुंजी का उपयोग किया जाता है।&lt;/strong>&lt;/p>
&lt;p>उदाहरण के लिए, मान लें कि ऐलिस, बॉब को एक गुप्त पत्र भेजना चाहती है। ऐलिस एक पैडलॉक (सममित कुंजी) का उपयोग करके पत्र को एक बक्से में बंद कर देती है। बॉब को उस बक्से को खोलने के लिए उसी कुंजी की आवश्यकता होगी जिसका ऐलिस ने उपयोग किया था।&lt;/p>
&lt;p>इस प्रणाली में एक बड़ी समस्या है: &amp;ldquo;कुंजी वितरण समस्या&amp;rdquo;। जब दूर बैठे ऐलिस और बॉब पहली बार संवाद करते हैं, तो वे बिना किसी के द्वारा सुने गए कुंजी को कैसे साझा कर सकते हैं? यदि मेल द्वारा भेजे जाते समय किसी तीसरे पक्ष द्वारा कुंजी चुरा ली जाती है, तो उसके बाद के सभी एन्क्रिप्टेड संचार लीक हो जाएंगे।&lt;/p>
&lt;h3 id="12-एक-करतकर-आवषकर-सरवजनक-कज-एनकरपशन-परणल">1.2 एक क्रांतिकारी आविष्कार: &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo;
&lt;/h3>&lt;p>कुंजी वितरण की इस समस्या को हल करने के लिए &amp;ldquo;सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली&amp;rdquo; का आविष्कार किया गया था। RSA एन्क्रिप्शन भी इसी का एक प्रकार है।&lt;/p>
&lt;p>सार्वजनिक कुंजी एन्क्रिप्शन प्रणाली में, &lt;strong>&amp;ldquo;एन्क्रिप्ट करने के लिए कुंजी (सार्वजनिक कुंजी)&amp;rdquo; और &amp;ldquo;डिक्रिप्ट करने के लिए कुंजी (निजी कुंजी)&amp;rdquo; नामक दो अलग-अलग कुंजियों&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;ol>
&lt;li>प्राप्तकर्ता बॉब &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; और &amp;ldquo;निजी कुंजी&amp;rdquo; का एक जोड़ा बनाता है।&lt;/li>
&lt;li>बॉब &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; को दुनिया भर में प्रकाशित करता है (कोई भी इसे प्राप्त कर सकता है)।&lt;/li>
&lt;li>प्रेषक ऐलिस, बॉब की &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; का उपयोग करके संदेश को एन्क्रिप्ट करती है और उसे भेज देती है।&lt;/li>
&lt;li>एन्क्रिप्टेड संदेश को केवल &amp;ldquo;निजी कुंजी&amp;rdquo; से ही डिक्रिप्ट किया जा सकता है जो केवल बॉब के पास है।&lt;/li>
&lt;/ol>
&lt;p>यदि इसे पैडलॉक से समझा जाए, तो बॉब बहुत सारे &amp;ldquo;खुले हुए पैडलॉक (सार्वजनिक कुंजी)&amp;rdquo; बनाता है और उन्हें दुनिया भर में बाँट देता है। ऐलिस बॉब के लिए संदेश को बक्से में डालती है, और बॉब का जो पैडलॉक उसे मिला है, उससे बक्से को बंद कर देती है। एक बार ताला बंद हो जाने के बाद, इसे केवल &amp;ldquo;मास्टर कुंजी (निजी कुंजी)&amp;rdquo; से ही खोला जा सकता है जो बॉब के पास है। भले ही कोई बीच में बक्सा चुरा ले, वह उसे नहीं खोल सकता क्योंकि उसके पास मास्टर कुंजी नहीं है।&lt;/p>
&lt;div class="mermaid">graph TD
A["ऐलिस (प्रेषक)"] --> B["प्लेनटेक्स्ट (संदेश)"]
B --> C["एन्क्रिप्शन प्रक्रिया"]
D["बॉब की सार्वजनिक कुंजी (कोई भी प्राप्त कर सकता है)"] --> C
C --> E["इंटरनेट के माध्यम से भेजा गया: सिफरटेक्स्ट (एन्क्रिप्टेड)"]
E --> F["डिक्रिप्शन प्रक्रिया"]
G["बॉब की निजी कुंजी (केवल बॉब के पास)"] --> F
F --> H["पुनर्प्राप्त प्लेनटेक्स्ट (संदेश)"]
H --> I["बॉब (प्राप्तकर्ता)"]&lt;/div>
&lt;p>इस क्रांतिकारी प्रणाली को साकार करने के लिए, किसी प्रकार के &lt;strong>&amp;ldquo;एक-तरफ़ा फ़ंक्शन (वन-वे गणितीय पहेली)&amp;rdquo;&lt;/strong> की आवश्यकता होती है, जिसका अर्थ है कि सार्वजनिक कुंजी के साथ एन्क्रिप्ट करना आसान है, लेकिन निजी कुंजी के बिना इसे डिक्रिप्ट करना बिल्कुल असंभव है। उस पहेली के हिस्से के रूप में जिस चीज़ पर ध्यान दिया गया, वह हमारी परिचित &amp;ldquo;अभाज्य संख्याएँ&amp;rdquo; थीं।&lt;/p>
&lt;hr>
&lt;h2 id="2-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-1-अभजय-सखयए-और-अभजय-गणनखडन">2. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 1: अभाज्य संख्याएँ और अभाज्य गुणनखंडन
&lt;/h2>&lt;p>RSA एन्क्रिप्शन की सुरक्षा इस गणितीय तथ्य पर आधारित है कि &lt;strong>&amp;ldquo;विशाल संख्याओं का अभाज्य गुणनखंडन करना बहुत कठिन है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;h3 id="21-अभजय-सखयए-कय-ह">2.1 अभाज्य संख्याएँ क्या हैं?
&lt;/h3>&lt;p>अभाज्य संख्याएँ वे &amp;ldquo;1 से बड़ी प्राकृत संख्याएँ हैं जो केवल 1 और स्वयं से विभाज्य हैं।&amp;rdquo;
उदाहरण: $2, 3, 5, 7, 11, 13, 17, 19, 23...$&lt;/p>
&lt;p>अभाज्य संख्याएँ सभी पूर्णांकों के &amp;ldquo;परमाणुओं&amp;rdquo; की तरह हैं। किसी भी प्राकृत संख्या को अभाज्य संख्याओं के गुणा के रूप में तोड़ा जा सकता है। इसे &lt;strong>अभाज्य गुणनखंडन&lt;/strong> कहा जाता है। उदाहरण के लिए, $60 = 2^2 \times 3 \times 5$, यह सर्वविदित है कि यदि हम क्रम को अनदेखा करें तो गुणनखंडन केवल एक ही अद्वितीय तरीके से किया जा सकता है (अंकगणित का मूलभूत प्रमेय)।&lt;/p>
&lt;h3 id="22-अभजय-गणनखडन-क-कठनई-एक-तरफ-फकशन">2.2 अभाज्य गुणनखंडन की कठिनाई (एक-तरफ़ा फ़ंक्शन)
&lt;/h3>&lt;p>यहाँ जो बात महत्वपूर्ण है वह है विषमता: &lt;strong>&amp;ldquo;गुणा करना आसान है, लेकिन अभाज्य गुणनखंडन करना कठिन है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>उदाहरण के लिए, निम्नलिखित दो अभाज्य संख्याओं के गुणनफल की गणना अपने दिमाग में करने का प्रयास करें।
$11 \times 13 = ?$
यह आसान है। उत्तर $143$ है।&lt;/p>
&lt;p>तो, इस संख्या के बारे में क्या खयाल है?
$323$ का अभाज्य गुणनखंडन करें।
कैसा लगा? इसमें थोड़ा समय लगना चाहिए। (उत्तर $17 \times 19$ है)।&lt;/p>
&lt;p>यदि संख्याएँ छोटी हैं, तो मनुष्य भी किसी तरह गणना कर सकते हैं, लेकिन जब संख्याएँ बड़ी हो जाती हैं, Math तो कंप्यूटर का उपयोग करने पर भी गणना अत्यधिक कठिन हो जाती है। वर्तमान में मुख्यधारा के RSA एन्क्रिप्शन में, हम एक संख्या $N = p \times q$ का उपयोग करते हैं, जो दो अविश्वसनीय रूप से विशाल अभाज्य संख्याओं $p$ और $q$ को गुणा करके बनती है, जो 2048 बिट्स (दशमलव में लगभग 600 अंक) की होती हैं।&lt;/p>
&lt;p>दिए गए दो विशाल अभाज्य संख्याओं $p$ और $q$ के लिए, $N$ की गणना करना कंप्यूटर के लिए पल भर (मिलीसेकंड से भी कम) का काम है। हालाँकि, यदि केवल $N$ दिया गया हो, तो मूल $p$ और $q$ को वापस खोजना इतना समय लेने वाला है कि इसे वर्तमान के सबसे तेज़ सुपरकंप्यूटरों का उपयोग करके भी खरबों वर्षों में हल नहीं किया जा सकता।&lt;/p>
&lt;p>यही &lt;strong>&amp;ldquo;कम्प्यूटेशनल विषमता (एक तरफा आसान, दूसरी तरफा कठिन)&amp;rdquo;&lt;/strong> सार्वजनिक कुंजी और निजी कुंजी के बीच संबंध बनाने की नींव बनाती है।&lt;/p>
&lt;hr>
&lt;h2 id="3-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-2-सरवगसमत-मडयलर-अकगणत">3. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 2: सर्वांगसमता (मॉड्यूलर अंकगणित)
&lt;/h2>&lt;p>RSA एन्क्रिप्शन में गणना साधारण जोड़ या गुणा की तरह नहीं होती जहाँ संख्याएँ अनंत रूप से बड़ी हो जाती हैं, बल्कि यह किसी संख्या से विभाजित करने पर बचे &amp;ldquo;शेषफल&amp;rdquo; की दुनिया में होती है। इसे &lt;strong>सर्वांगसमता (मॉड्यूलर अंकगणित)&lt;/strong> कहा जाता है।&lt;/p>
&lt;h3 id="31-घड-क-गणत">3.1 घड़ी का गणित
&lt;/h3>&lt;p>मॉड्यूलर अंकगणित की तुलना अक्सर &amp;ldquo;घड़ी के गणित&amp;rdquo; से की जाती है। मान लें कि अभी 10 बज रहे हैं, तो 5 घंटे बाद क्या समय होगा? $10 + 5 = 15$ बजे, लेकिन एक सामान्य 12-घंटे की घड़ी में हम उत्तर देते हैं &amp;ldquo;3 बजे&amp;rdquo;। ऐसा इसलिए है क्योंकि 15 को 12 से भाग देने पर शेषफल 3 आता है।&lt;/p>
&lt;p>गणित की दुनिया में, इसे इस प्रकार लिखा जाता है:
&lt;/p>
$$ 15 \equiv 3 \pmod{12} $$
&lt;p>
इसे ऐसे पढ़ा जाता है: &amp;ldquo;15 और 3, मॉड्युलो 12 के सर्वांगसम हैं (यानी 12 से भाग देने पर शेषफल समान है)।&amp;rdquo;&lt;/p>
&lt;h3 id="32-सरवगसमत-क-मल-गण">3.2 सर्वांगसमता के मूल गुण
&lt;/h3>&lt;p>सर्वांगसमता में कुछ बहुत ही उपयोगी गुण होते हैं जो समीकरणों ($=$) के समान होते हैं। मान लीजिए कि भाजक $N$ है।
जब $a \equiv b \pmod N$ और $c \equiv d \pmod N$ हो, तो निम्नलिखित सत्य है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>जोड़:&lt;/strong> $a + c \equiv b + d \pmod N$&lt;/li>
&lt;li>&lt;strong>घटाव:&lt;/strong> $a - c \equiv b - d \pmod N$&lt;/li>
&lt;li>&lt;strong>गुणा:&lt;/strong> $a \times c \equiv b \times d \pmod N$&lt;/li>
&lt;li>&lt;strong>घातांक:&lt;/strong> $a^k \equiv b^k \pmod N$ ($k$ एक प्राकृत संख्या है)&lt;/li>
&lt;/ol>
&lt;p>&amp;ldquo;घातांक&amp;rdquo; का गुण विशेष रूप से महत्वपूर्ण है। इसका मतलब है कि &lt;strong>&amp;ldquo;शेषफल का घातांक, घातांक के शेषफल के बराबर है।&amp;rdquo;&lt;/strong>
उदाहरण के लिए, मान लें कि हम $7^{100}$ को $5$ से विभाजित करने पर शेषफल ज्ञात करना चाहते हैं। 7 को 100 बार गुणा करना और फिर उसे 5 से भाग देना बहुत मुश्किल काम है, लेकिन सर्वांगसमता के गुणों का उपयोग करके, चूँकि $7 \equiv 2 \pmod 5$ है, यह $7^{100} \equiv 2^{100} \pmod 5$ हो जाता है, जिससे गणना को काफी आसान किया जा सकता है। एन्क्रिप्शन की दुनिया में, यह गुण अपरिहार्य है क्योंकि हम बहुत बड़ी संख्याओं के घातांक से निपटते हैं।&lt;/p>
&lt;hr>
&lt;h2 id="4-rsa-एनकरपशन-क-समरथन-करन-वल-गणतय-आधर-3-यलर-क-टशट-फकशन-और-यलर-क-परमय">4. RSA एन्क्रिप्शन का समर्थन करने वाला गणितीय आधार 3: यूलर का टॉशेंट फ़ंक्शन और यूलर का प्रमेय
&lt;/h2>&lt;p>यहाँ से जादुई गणित शुरू होता है जो RSA एन्क्रिप्शन का मूल है। &amp;ldquo;यूलर का प्रमेय&amp;rdquo; सामने आता है, जो &amp;ldquo;फर्मेट के छोटे प्रमेय&amp;rdquo; का एक सामान्यीकरण है।&lt;/p>
&lt;h3 id="41-यलर-क-टशट-फकशन-phin">4.1 यूलर का टॉशेंट फ़ंक्शन $\phi(N)$
&lt;/h3>&lt;p>यूलर का टॉशेंट फ़ंक्शन ($\phi$ फ़ंक्शन) एक ऐसा फ़ंक्शन है जो किसी भी प्राकृत संख्या $N$ के लिए, &lt;strong>&amp;ldquo;1 से $N$ तक की उन प्राकृत संख्याओं की गिनती देता है, जो $N$ के साथ सह-अभाज्य (जिनका महत्तम समापवर्तक 1 है) हैं।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>आइए कुछ उदाहरण देखें:&lt;/p>
&lt;ul>
&lt;li>$\phi(5)$: 1, 2, 3, 4, 5 में से, 5 के साथ सह-अभाज्य 1, 2, 3, 4 हैं, जो कुल 4 हैं। इसलिए $\phi(5) = 4$।&lt;/li>
&lt;li>$\phi(6)$: 1, 2, 3, 4, 5, 6 में से, 6 के साथ सह-अभाज्य केवल 1, 5 हैं, जो कुल 2 हैं। इसलिए $\phi(6) = 2$।&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【अभाज्य संख्याओं के लिए विशेष गुण】&lt;/strong>
जब $p$ एक अभाज्य संख्या है, तो 1 से $p-1$ तक की सभी संख्याएँ $p$ के साथ सह-अभाज्य होती हैं। इसलिए,
&lt;/p>
$$ \phi(p) = p - 1 $$
&lt;p>
होता है।&lt;/p>
&lt;p>&lt;strong>【अभाज्य संख्याओं के गुणनफल के लिए विशेष गुण】&lt;/strong>
दो अलग-अलग अभाज्य संख्याओं $p$ और $q$ के लिए, यदि हम $N = p \times q$ मान लें, तो $\phi(N)$ को निम्नलिखित गणना द्वारा आसानी से निकाला जा सकता है:
&lt;/p>
$$ \phi(N) = \phi(p) \times \phi(q) = (p - 1)(q - 1) $$
&lt;p>
यह गुण RSA एन्क्रिप्शन के &amp;ldquo;गुप्त पिछले दरवाजे (ट्रैपडोर)&amp;rdquo; के रूप में कार्य करता है। एक व्यक्ति जो $p$ और $q$ (कुंजी का निर्माता) जानता है, वह पल भर में $\phi(N)$ की गणना कर सकता है, लेकिन कोई तीसरा पक्ष जो केवल $N$ जानता है, वह $\phi(N)$ नहीं खोज सकता, जब तक कि वह $N$ का अभाज्य गुणनखंडन न कर ले।&lt;/p>
&lt;h3 id="42-यलर-क-परमय">4.2 यूलर का प्रमेय
&lt;/h3>&lt;p>लियोनहार्ड यूलर ने इस $\phi(N)$ का उपयोग करके निम्नलिखित सुंदर प्रमेय सिद्ध किया:&lt;/p>
&lt;p>&lt;strong>यूलर का प्रमेय:&lt;/strong>
जब पूर्णांक $a$ और $N$ सह-अभाज्य होते हैं, तो निम्नलिखित सर्वांगसमता सत्य होती है:
&lt;/p>
$$ a^{\phi(N)} \equiv 1 \pmod N $$
&lt;p>यह एक आश्चर्यजनक गुण है कि &amp;ldquo;यदि हम किसी संख्या $a$ को $\phi(N)$ बार गुणा करते हैं और $N$ से विभाजित करते हैं, तो शेषफल हमेशा $1$ होगा।&amp;rdquo; (जब $N$ एक अभाज्य संख्या $p$ है, तो यह $a^{p-1} \equiv 1 \pmod p$ बन जाता है, जिसे फर्मेट का छोटा प्रमेय कहा जाता है)।&lt;/p>
&lt;p>आइए इस यूलर के प्रमेय को थोड़ा संशोधित करें। दोनों पक्षों को फिर से $a$ से गुणा करें:
&lt;/p>
$$ a^{\phi(N) + 1} \equiv a \pmod N $$
&lt;p>इसके अलावा, किसी भी पूर्णांक $k$ के लिए, $a^{k \cdot \phi(N)}$ भी $1^k = 1$ होगा, इसलिए निम्नलिखित समीकरण सत्य है:
&lt;/p>
$$ a^{k \cdot \phi(N) + 1} \equiv a \pmod N $$
&lt;p>यह समीकरण ही वह मूल सिद्धांत है जो RSA एन्क्रिप्शन के इस जादू को काम करने देता है: &lt;strong>&amp;ldquo;जब आप इसे एन्क्रिप्ट करते हैं और फिर डिक्रिप्ट करते हैं, तो यह अपनी मूल अवस्था में वापस आ जाता है।&amp;rdquo;&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="5-rsa-एनकरपशन-एलगरथम-कज-नरमण-एनकरपशन-और-डकरपशन-क-चरण">5. RSA एन्क्रिप्शन एल्गोरिथम: कुंजी निर्माण, एन्क्रिप्शन और डिक्रिप्शन के चरण
&lt;/h2>&lt;p>अब जब हमारे पास बुनियादी ज्ञान है, तो आइए अंततः RSA एन्क्रिप्शन के विशिष्ट चरणों को देखें। RSA एन्क्रिप्शन मोटे तौर पर तीन चरणों में बंटा हुआ है: &amp;ldquo;1. कुंजी निर्माण&amp;rdquo;, &amp;ldquo;2. एन्क्रिप्शन&amp;rdquo;, और &amp;ldquo;3. डिक्रिप्शन&amp;rdquo;।&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. अभाज्य संख्याएँ p, q चुनें"] --> A2["N = p × q की गणना करें"]
A1 --> A3["φ(N) = (p-1)(q-1) की गणना करें"]
A3 --> A4["φ(N) के साथ सह-अभाज्य e चुनें"]
A3 --> A5["ऐसे d की गणना करें कि e × d ≡ 1 (mod φ(N)) हो"]
A2 --> A6["सार्वजनिक कुंजी (N, e)"]
A4 --> A6
A5 --> A7["निजी कुंजी d"]
B1["2. प्लेनटेक्स्ट संदेश M"] --> B2["C ≡ M^e (mod N) की गणना करें"]
A6 -.-> B2
B2 --> B3["सिफरटेक्स्ट C भेजें"]
B3 --> C1["3. प्राप्त सिफरटेक्स्ट C"]
C1 --> C2["M ≡ C^d (mod N) की गणना करें"]
A7 -.-> C2
C2 --> C3["मूल प्लेनटेक्स्ट संदेश M प्राप्त करें"]&lt;/div>
&lt;h3 id="51-कज-नरमण-key-generation">5.1 कुंजी निर्माण (Key Generation)
&lt;/h3>&lt;p>प्राप्तकर्ता बॉब, अपने लिए एक &amp;ldquo;सार्वजनिक कुंजी&amp;rdquo; और एक &amp;ldquo;निजी कुंजी&amp;rdquo; बनाता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>अभाज्य संख्याओं का चयन:&lt;/strong> दो बड़ी अभाज्य संख्याएँ $p$ और $q$ यादृच्छिक रूप से चुनें।&lt;/li>
&lt;li>&lt;strong>$N$ की गणना:&lt;/strong> $N = p \times q$ की गणना करें। यह $N$ सार्वजनिक किया जाएगा।&lt;/li>
&lt;li>&lt;strong>$\phi(N)$ की गणना:&lt;/strong> यूलर फ़ंक्शन $\phi(N) = (p - 1)(q - 1)$ की गणना करें। यह बॉब का गुप्त नंबर है।&lt;/li>
&lt;li>&lt;strong>सार्वजनिक कुंजी $e$ का चयन:&lt;/strong> एक ऐसा पूर्णांक $e$ चुनें जो $1 &lt; e &lt; \phi(N)$ हो और $\phi(N)$ के साथ सह-अभाज्य हो।&lt;/li>
&lt;li>&lt;strong>निजी कुंजी $d$ की गणना:&lt;/strong> एक ऐसा पूर्णांक $d$ खोजें जो निम्नलिखित शर्त को पूरा करता हो:
$$ e \times d \equiv 1 \pmod{\phi(N)} $$
दूसरे शब्दों में, यह एक ऐसी संख्या $d$ है जहाँ &amp;ldquo;$e \times d$ को $\phi(N)$ से भाग देने पर शेषफल $1$ होता है।&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>इसके साथ ही कुंजियों की तैयारी पूरी हो जाती है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>सार्वजनिक कुंजी:&lt;/strong> $(N, e)$ का जोड़ा। इसे पूरी दुनिया के लिए सार्वजनिक किया जाता है।&lt;/li>
&lt;li>&lt;strong>निजी कुंजी:&lt;/strong> $d$। इसे किसी को भी नहीं बताया जाता।&lt;/li>
&lt;/ul>
&lt;h3 id="52-एनकरपशन-encryption">5.2 एन्क्रिप्शन (Encryption)
&lt;/h3>&lt;p>मान लें कि ऐलिस, बॉब को एक गुप्त संदेश $M$ भेजना चाहती है। ($M$ पाठ को संख्यात्मक रूप में परिवर्तित करने से बनता है, और हम मान कर चलते हैं कि $0 \le M &lt; N$ है)। ऐलिस बॉब की सार्वजनिक कुंजी $(N, e)$ का उपयोग करके निम्नानुसार गणना करती है:&lt;/p>
$$ C \equiv M^e \pmod N $$
&lt;p>&amp;ldquo;संदेश $M$ को $e$ की घात तक उठाएँ, और $N$ से भाग देने पर शेषफल $C$ प्राप्त करें।&amp;rdquo; यह $C$ एन्क्रिप्टेड संदेश (सिफरटेक्स्ट) है।&lt;/p>
&lt;h3 id="53-डकरपशन-decryption">5.3 डिक्रिप्शन (Decryption)
&lt;/h3>&lt;p>बॉब को सिफरटेक्स्ट $C$ प्राप्त होता है। बॉब अपनी निजी कुंजी $d$ का उपयोग करके निम्नानुसार गणना करता है:&lt;/p>
$$ M \equiv C^d \pmod N $$
&lt;p>यदि आप &amp;ldquo;सिफरटेक्स्ट $C$ को $d$ की घात तक बढ़ाते हैं, और $N$ से भाग देने पर शेषफल&amp;rdquo; की गणना करते हैं, तो आश्चर्यजनक रूप से मूल संदेश $M$ पुनर्प्राप्त हो जाता है!&lt;/p>
&lt;hr>
&lt;h2 id="6-डकरपशन-इस-मल-अवसथ-म-वपस-कय-लत-ह-गणतय-परमण">6. डिक्रिप्शन इसे मूल अवस्था में वापस क्यों लाता है? (गणितीय प्रमाण)
&lt;/h2>&lt;p>आप सोच रहे होंगे, &amp;ldquo;$C$ की घात $d$ करने से, यह मूल $M$ में कैसे वापस आ जाता है?&amp;rdquo; यहीं पर पहले वर्णित &amp;ldquo;यूलर का प्रमेय&amp;rdquo; अपनी शक्ति दिखाता है।&lt;/p>
&lt;p>आइए डिक्रिप्शन के सूत्र $C^d \pmod N$ में एन्क्रिप्शन के सूत्र $C = M^e$ को प्रतिस्थापित करें:
&lt;/p>
$$ C^d \equiv (M^e)^d \equiv M^{ed} \pmod N $$
&lt;p>यहाँ, कुंजी निर्माण के चरण 5 को याद करें। जब बॉब ने $d$ बनाया, तो उसने इसे इस तरह चुना कि $e \times d \equiv 1 \pmod{\phi(N)}$ हो। इसका मतलब है कि &amp;ldquo;$ed$, $\phi(N)$ के गुणज में $1$ जोड़ने से बनी संख्या है।&amp;rdquo; एक पूर्णांक $k$ का उपयोग करके, इसे इस प्रकार लिखा जा सकता है:
&lt;/p>
$$ ed = k \cdot \phi(N) + 1 $$
&lt;p>इसे घातांक वाले भाग में रखें और घातांक के नियमों का उपयोग करके इसे हल करें:
&lt;/p>
$$ M^{ed} = M^{k \cdot \phi(N) + 1} = M^{k \cdot \phi(N)} \times M^1 = (M^{\phi(N)})^k \times M $$
&lt;p>यहाँ, यदि हम मान लें कि संदेश $M$ और $N$ सह-अभाज्य हैं, तो &lt;strong>यूलर के प्रमेय&lt;/strong> से, $M^{\phi(N)} \equiv 1 \pmod N$ होता है।
&lt;/p>
$$ (M^{\phi(N)})^k \times M \equiv 1^k \times M \equiv M \pmod N $$
&lt;p>इसलिए, निम्नलिखित समीकरण पूरी तरह से सत्य होता है:
&lt;/p>
$$ C^d \equiv M \pmod N $$
&lt;p>ऐलिस $d$ को नहीं जानती, और छिपकर बातें सुनने वाला भी $d$ को नहीं जानता, इसलिए केवल बॉब, जिसके पास $d$ है, $C$ से $M$ को निकाल सकता है।&lt;/p>
&lt;hr>
&lt;h2 id="7-एक-ठस-उदहरण-आइए-छट-अभजय-सखयओ-क-उपयग-करक-हथ-स-rsa-क-गणन-कर">7. एक ठोस उदाहरण: आइए छोटी अभाज्य संख्याओं का उपयोग करके हाथ से RSA की गणना करें
&lt;/h2>&lt;p>आइए वास्तव में छोटी संख्याओं (अभाज्य संख्याओं) का उपयोग करके ऐलिस से बॉब तक एन्क्रिप्टेड संचार का प्रयास करें।&lt;/p>
&lt;p>&lt;strong>【बॉब का कुंजी निर्माण चरण】&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>दो अभाज्य संख्याएँ चुनें, $p=11$ और $q=13$।&lt;/li>
&lt;li>$N = 11 \times 13 = 143$ की गणना करें।&lt;/li>
&lt;li>$\phi(N) = (11 - 1) \times (13 - 1) = 10 \times 12 = 120$ की गणना करें।&lt;/li>
&lt;li>एक सार्वजनिक कुंजी $e$ चुनें जो $\phi(N)=120$ के साथ सह-अभाज्य हो। यहाँ हम $e=7$ का उपयोग करेंगे।&lt;/li>
&lt;li>निजी कुंजी $d$ ज्ञात करें। ऐसा $d$ खोजें कि $7 \times d \equiv 1 \pmod{120}$ हो।
समीकरण $7d = 120k + 1$ में, जब $k=6$ होता है, तो मान $721$ हो जाता है, और $721 \div 7 = 103$ होता है।
इसलिए, $d = 103$ हो जाता है।&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>सार्वजनिक कुंजी: $(N=143, e=7)$&lt;/li>
&lt;li>निजी कुंजी: $d=103$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>【ऐलिस का एन्क्रिप्शन चरण】&lt;/strong>
मान लीजिए कि ऐलिस संदेश $M = 9$ भेजना चाहती है।
सूत्र: $C \equiv 9^7 \pmod{143}$
$9^7 = 4,782,969$। जब इसे 143 से भाग दिया जाता है, तो भागफल 33447 और शेषफल 48 होता है।
तो एन्क्रिप्टेड संदेश $C = 48$ हो गया।&lt;/p>
&lt;p>&lt;strong>【बॉब का डिक्रिप्शन चरण】&lt;/strong>
बॉब को एन्क्रिप्टेड संदेश $C = 48$ मिलता है और वह इसे डिक्रिप्ट करने के लिए अपनी निजी कुंजी $d = 103$ का उपयोग करता है।
सूत्र: $M \equiv 48^{103} \pmod{143}$
यदि आप कैलकुलेटर पर &lt;code>(48 ** 103) % 143&lt;/code> चलाते हैं, तो परिणाम आश्चर्यजनक रूप से &amp;ldquo;&lt;strong>9&lt;/strong>&amp;rdquo; आएगा! बॉब सफलतापूर्वक मूल संदेश प्राप्त करने में सक्षम हो गया।&lt;/p>
&lt;hr>
&lt;h2 id="8-नज-कज-d-कस-जञत-कर-वसतरत-यकलडयन-एलगरथम">8. निजी कुंजी $d$ कैसे ज्ञात करें: विस्तारित यूक्लिडियन एल्गोरिथम
&lt;/h2>&lt;p>मैन्युअल गणना के उदाहरण में, हमने अनुमान लगाकर $k$ का मान खोजा और $d=103$ प्राप्त किया, लेकिन जब संख्याएँ सैकड़ों अंकों की हो जाती हैं, तो यह विधि असंभव है। वास्तविक प्रोग्रामों में, &lt;strong>&amp;ldquo;विस्तारित यूक्लिडियन एल्गोरिथम&amp;rdquo;&lt;/strong> नामक एल्गोरिथम का उपयोग किया जाता है।&lt;/p>
&lt;p>$7d \equiv 1 \pmod{120}$ को हल करने का मतलब ऐसे पूर्णांक $d, y$ ज्ञात करना है जो $7d + 120y = 1$ को संतुष्ट करते हों। यूक्लिडियन एल्गोरिथम को उल्टे क्रम में लागू करके, इसकी गणना व्यवस्थित तरीके से की जा सकती है।&lt;/p>
&lt;ol>
&lt;li>$120 \div 7 = 17$ शेषफल $1$&lt;/li>
&lt;li>इसे पुनः व्यवस्थित करने पर, $1 = 120 - 17 \times 7$&lt;/li>
&lt;li>यानी, $-17 \times 7 \equiv 1 \pmod{120}$&lt;/li>
&lt;/ol>
&lt;p>मॉड्युलो 120 की दुनिया में $-17$ का अर्थ $120 - 17 = 103$ के समान ही है। इसलिए, $d = 103$ पल भर में मिल जाता है। यह विधि बहुत तेज़ी से गणना कर सकती है, चाहे संख्या कितनी भी विशाल क्यों न हो।&lt;/p>
&lt;hr>
&lt;h2 id="9-rsa-एनकरपशन-क-एक-और-चहर-डजटल-हसतकषर">9. RSA एन्क्रिप्शन का एक और चेहरा: डिजिटल हस्ताक्षर
&lt;/h2>&lt;p>RSA एन्क्रिप्शन के बारे में सबसे अच्छी बात यह है कि सार्वजनिक और निजी कुंजियों की भूमिकाओं को उलट कर इसे &lt;strong>&amp;ldquo;डिजिटल हस्ताक्षर&amp;rdquo;&lt;/strong> के रूप में भी इस्तेमाल किया जा सकता है।&lt;/p>
&lt;p>एन्क्रिप्शन में, प्रक्रिया थी &amp;ldquo;सार्वजनिक कुंजी के साथ एन्क्रिप्ट करें $\Rightarrow$ निजी कुंजी के साथ डिक्रिप्ट करें&amp;rdquo;।
डिजिटल हस्ताक्षर में, प्रक्रिया है &amp;ldquo;निजी कुंजी के साथ एन्क्रिप्ट करें $\Rightarrow$ सार्वजनिक कुंजी के साथ डिक्रिप्ट करें&amp;rdquo;।&lt;/p>
&lt;div class="mermaid">flowchart TD
A1["1. ऐलिस अपनी निजी कुंजी से हस्ताक्षर बनाती है"] --> A2["S ≡ M^d (mod N)"]
A2 --> A3["संदेश M और हस्ताक्षर S भेजें"]
A3 --> B1["2. बॉब सार्वजनिक कुंजी के साथ हस्ताक्षर सत्यापित करता है"]
B1 --> B2["M' ≡ S^e (mod N) की गणना करें"]
B2 --> B3["जांचें कि क्या M' और M मेल खाते हैं"]&lt;/div>
&lt;p>ऐलिस अपनी निजी कुंजी $d$ का उपयोग करके संदेश को बदलती है (यह हस्ताक्षर $S$ है) और इसे बॉब को भेजती है। बॉब सत्यापन गणना करने के लिए ऐलिस की सार्वजनिक कुंजी $e$ का उपयोग करता है। यदि गणना का परिणाम मूल संदेश से मेल खाता है, तो यह एक साथ साबित करता है कि &amp;ldquo;यह डेटा केवल ऐलिस की निजी कुंजी से ही बनाया जा सकता था&amp;rdquo; और &amp;ldquo;संदेश से रास्ते में छेड़छाड़ नहीं की गई है।&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h2 id="10-एक-परगरम-क-सथ-rsa-एनकरपशन-क-अनभव-करन">10. एक प्रोग्राम के साथ RSA एन्क्रिप्शन का अनुभव करना
&lt;/h2>&lt;p>हाथ से घातांक की गणना करना कठिन है, लेकिन यदि आप Python का उपयोग करते हैं, तो इसे लागू करना बहुत आसान है। नीचे दिया गया Python कोड आपको RSA एन्क्रिप्शन के मुख्य तर्क का अनुभव करने की अनुमति देता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;महत्तम समापवर्तक ज्ञात करें&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;निजी कुंजी d ज्ञात करें (Python 3.8+ के बिल्ट-इन फ़ंक्शन का उपयोग करके)&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. कुंजी निर्माण&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">p&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">13&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">phi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">e&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod_inverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">phi&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;सार्वजनिक कुंजी: (N=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">, e=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">), निजी कुंजी: d=&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. एन्क्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ciphertext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;एन्क्रिप्टेड संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. डिक्रिप्शन&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">decrypted_message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ciphertext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;डिक्रिप्टेड संदेश: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">decrypted_message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>चूँकि Python का &lt;code>pow(base, exp, mod)&lt;/code> फ़ंक्शन आंतरिक रूप से एक तेज़ एल्गोरिथम का उपयोग करता है जिसे &amp;ldquo;पुनरावृत्त वर्ग विधि (Exponentiation by squaring)&amp;rdquo; कहा जाता है, यह एक पल में गणना पूरी कर लेता है, भले ही संख्याएँ सैकड़ों अंकों की हों।&lt;/p>
&lt;hr>
&lt;h2 id="11-नषकरष-और-भवषय-क-एनकरपशन-तकनक">11. निष्कर्ष और भविष्य की एन्क्रिप्शन तकनीक
&lt;/h2>&lt;p>हमने हाई स्कूल के गणितीय ज्ञान के आधार पर RSA एन्क्रिप्शन के तंत्र का खुलासा किया है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>अभाज्य गुणनखंडन की कठिनाई:&lt;/strong> $p \times q = N$ खोजना आसान है, लेकिन $N$ से $p, q$ खोजना बहुत मुश्किल है।&lt;/li>
&lt;li>&lt;strong>सर्वांगसमता और यूलर का प्रमेय:&lt;/strong> $a^{\phi(N)} \equiv 1 \pmod N$ नियम के माध्यम से, &amp;ldquo;एक निश्चित संख्या की घात तक बढ़ाने पर मूल अवस्था में वापस आने&amp;rdquo; का जादुई ट्रैपडोर पूरा हो जाता है।&lt;/li>
&lt;li>&lt;strong>सार्वजनिक और निजी कुंजियाँ:&lt;/strong> कोई भी एन्क्रिप्ट कर सकता है, लेकिन केवल वैध प्राप्तकर्ता ही इसे डिक्रिप्ट कर सकता है।&lt;/li>
&lt;/ol>
&lt;p>वर्तमान में उपयोग किए जाने वाले RSA एन्क्रिप्शन में 600 से अधिक अंकों का $N$ होता है, और दुनिया के सभी सुपर कंप्यूटरों को एक साथ काम में लगा दिया जाए, तो भी इसके अभाज्य गुणनखंडन में ब्रह्मांड की आयु से अधिक समय लगेगा। हालाँकि, यदि हाल ही में शोध किए जा रहे &amp;ldquo;क्वांटम कंप्यूटर&amp;rdquo; भविष्य में व्यावहारिक उपयोग में आते हैं, तो ऐसी संभावना है कि यह अभाज्य गुणनखंडन &amp;ldquo;शोर के एल्गोरिथम&amp;rdquo; द्वारा पल भर में हल हो जाएगा। इस कारण से, दुनिया भर में &amp;ldquo;क्वांटम-प्रतिरोधी एन्क्रिप्शन&amp;rdquo; विकसित करने के लिए तेज़ गति से काम चल रहा है, जिसे क्वांटम कंप्यूटर भी डिक्रिप्ट नहीं कर सकते।&lt;/p>
&lt;p>उन्नत गणित जिसे अक्सर &amp;ldquo;बेकार&amp;rdquo; माना जाता है, वास्तव में हमारे दैनिक जीवन को उसकी जड़ों से सुरक्षित रखता है। RSA एन्क्रिप्शन इस तरह के गणित की गहराई और सुंदरता सिखाने वाली सबसे बेहतरीन शिक्षण सामग्री है। हमें उम्मीद है कि इस लेख के माध्यम से आप एन्क्रिप्शन और गणित के आकर्षण को थोड़ा भी महसूस कर पाए होंगे।&lt;/p></description></item><item><title>एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन</title><link>http://kenji.blog/hi/p/elliptic-curve-cryptography-math-cpp/</link><pubDate>Fri, 11 Sep 2026 10:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/elliptic-curve-cryptography-math-cpp/</guid><description>&lt;img src="http://kenji.blog/p/elliptic-curve-cryptography-math-cpp/img/eyecatch.jpg" alt="Featured image of post एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन" />&lt;h1 id="एलपटक-करव-करपटगरफ-ecc-क-गणतय-आधर-और-c-म-इसक-करयनवयन">एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) का गणितीय आधार और C++ में इसका कार्यान्वयन
&lt;/h1>&lt;p>आधुनिक क्रिप्टोग्राफी में, &lt;strong>एलिप्टिक कर्व क्रिप्टोग्राफी (Elliptic Curve Cryptography: ECC)&lt;/strong> अत्यंत महत्वपूर्ण भूमिका निभाती है। हमारे दैनिक इंटरनेट संचार (HTTPS/TLS) से लेकर, स्मार्टफोन के सुरक्षित एन्क्लेव, SSH के माध्यम से सर्वर प्रमाणीकरण, FIDO जैसे पासवर्ड रहित प्रमाणीकरण, और यहाँ तक कि बिटकॉइन और एथेरियम जैसी क्रिप्टो संपत्तियों तक, यह कहना अतिशयोक्ति नहीं होगी कि आधुनिक डिजिटल समाज का विश्वास आधार ECC द्वारा समर्थित है।&lt;/p>
&lt;p>इस लेख में, हम विस्तार से समझाएंगे कि एलिप्टिक कर्व क्रिप्टोग्राफी कैसे काम करती है, इसके पीछे के सुंदर लेकिन जटिल गणितीय सिद्धांत (परिमित क्षेत्र पर बीजगणितीय ज्यामिति) से शुरू करते हुए, वास्तविक C++ का उपयोग करके कार्यान्वयन विधि, और यहां तक कि साइड-चैनल हमलों (टाइमिंग हमलों) को रोकने के लिए सुरक्षित कोडिंग तकनीक तक।&lt;/p>
&lt;hr>
&lt;h2 id="1-एलपटक-करव-करपटगरफ-कय-rsa-क-सथ-तलन">1. एलिप्टिक कर्व क्रिप्टोग्राफी क्यों? (RSA के साथ तुलना)
&lt;/h2>&lt;p>पब्लिक-की क्रिप्टोग्राफी का पर्याय लंबे समय से &lt;strong>RSA एन्क्रिप्शन&lt;/strong> रहा है। RSA एन्क्रिप्शन अपनी सुरक्षा के आधार के रूप में &amp;ldquo;बड़े समग्र संख्याओं के अभाज्य गुणनखंडन की कठिनाई&amp;rdquo; पर निर्भर करता है। हालांकि, कंप्यूटर की गणना क्षमता में सुधार के साथ, सुरक्षा बनाए रखने के लिए RSA की कुंजी की लंबाई (मोडुलस के बिट्स की संख्या) को लगातार बढ़ाने की आवश्यकता उत्पन्न हुई है। वर्तमान में, कम से कम 2048 बिट्स, और अधिक सुरक्षित होने के लिए 3072 बिट्स या 4096 बिट्स की कुंजी की लंबाई की सिफारिश की जाती है।&lt;/p>
&lt;p>इसके विपरीत, एलिप्टिक कर्व क्रिप्टोग्राफी (ECC) अपनी सुरक्षा के लिए &lt;strong>&amp;ldquo;एलिप्टिक कर्व पर असतत लघुगणक समस्या (Discrete Logarithm Problem on Elliptic Curves - ECDLP)&amp;rdquo;&lt;/strong> नामक एक अलग गणितीय कठिनाई पर निर्भर करता है। ECDLP को हल करने के लिए आज तक कोई कुशल एल्गोरिदम (जैसे सब-एक्सपोनेंशियल टाइम एल्गोरिदम) नहीं खोजा जा सका है, और यहां तक कि ज्ञात सबसे कुशल हमले के तरीके भी घातांकीय (exponential) समय लेते हैं।&lt;/p>
&lt;p>इस गुण के कारण, ECC का यह निर्णायक लाभ है कि यह &lt;strong>बहुत छोटी कुंजी की लंबाई के साथ RSA के समान सुरक्षा शक्ति प्राप्त कर सकता है&lt;/strong>।&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:center">सुरक्षा शक्ति (बिट्स)&lt;/th>
&lt;th style="text-align:center">RSA एन्क्रिप्शन कुंजी की लंबाई (बिट्स)&lt;/th>
&lt;th style="text-align:center">एलिप्टिक कर्व क्रिप्टोग्राफी कुंजी की लंबाई (बिट्स)&lt;/th>
&lt;th style="text-align:center">कुंजी की लंबाई का अनुपात&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:center">80&lt;/td>
&lt;td style="text-align:center">1024&lt;/td>
&lt;td style="text-align:center">160&lt;/td>
&lt;td style="text-align:center">1:6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">112&lt;/td>
&lt;td style="text-align:center">2048&lt;/td>
&lt;td style="text-align:center">224&lt;/td>
&lt;td style="text-align:center">1:9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">128&lt;/td>
&lt;td style="text-align:center">3072&lt;/td>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">1:12&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">192&lt;/td>
&lt;td style="text-align:center">7680&lt;/td>
&lt;td style="text-align:center">384&lt;/td>
&lt;td style="text-align:center">1:20&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:center">256&lt;/td>
&lt;td style="text-align:center">15360&lt;/td>
&lt;td style="text-align:center">512&lt;/td>
&lt;td style="text-align:center">1:30&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>जैसा कि ऊपर दी गई तालिका दिखाती है, 128-बिट सुरक्षा शक्ति (वर्तमान मानक शक्ति) प्राप्त करने के लिए, RSA को 3072-बिट कुंजी की आवश्यकता होती है, लेकिन ECC के साथ केवल 256 बिट्स की आवश्यकता होती है। इससे गणना को कम करना, मेमोरी के उपयोग को कम करना और नेटवर्क बैंडविड्थ को सहेजना संभव हो जाता है, जिससे यह विशेष रूप से सीमित संसाधनों वाले IoT उपकरणों और स्मार्ट कार्ड वातावरण में अत्यधिक फायदेमंद हो जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="2-गणतय-तयर-समह-सदधत-group-theory-और-परमत-कषतर-finite-fields-क-दनय">2. गणितीय तैयारी: समूह सिद्धांत (Group Theory) और परिमित क्षेत्र (Finite Fields) की दुनिया
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी को वास्तव में समझने के लिए, सार बीजगणित (समूह सिद्धांत और क्षेत्र सिद्धांत) की बुनियादी अवधारणाओं को समझना आवश्यक है। यहाँ हम ECC के निर्माण के लिए आवश्यक पूर्वज्ञान का संक्षेप में सारांश दे रहे हैं।&lt;/p>
&lt;h3 id="21-समह-group-और-एबलयन-समह-abelian-group">2.1. समूह (Group) और एबेलियन समूह (Abelian Group)
&lt;/h3>&lt;p>&lt;strong>समूह (Group)&lt;/strong> एक सेट $G$ और उस सेट पर एक बाइनरी ऑपरेशन (यहाँ हम जोड़ $+$ मानेंगे) का संयोजन $(G, +)$ है, जो निम्नलिखित 4 स्वयंसिद्धों (axioms) को पूरा करता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>संवृतता (Closure)&lt;/strong>: किन्हीं $a, b \in G$ के लिए, $a + b \in G$ होता है।&lt;/li>
&lt;li>&lt;strong>साहचर्य (Associativity)&lt;/strong>: किन्हीं $a, b, c \in G$ के लिए, $(a + b) + c = a + (b + c)$ लागू होता है।&lt;/li>
&lt;li>&lt;strong>तत्समक अवयव का अस्तित्व (Identity element)&lt;/strong>: किसी भी $a \in G$ के लिए, एक ऐसा अवयव $e \in G$ मौजूद होता है कि $a + e = e + a = a$। एक योगात्मक समूह (additive group) के मामले में, इस तत्समक अवयव को आमतौर पर $0$ या $\mathcal{O}$ के रूप में दर्शाया जाता है।&lt;/li>
&lt;li>&lt;strong>प्रतिलोम अवयव का अस्तित्व (Inverse element)&lt;/strong>: किसी भी $a \in G$ के लिए, एक ऐसा अवयव $b \in G$ मौजूद होता है कि $a + b = b + a = e$। इस $b$ को $-a$ के रूप में दर्शाया जाता है।&lt;/li>
&lt;/ol>
&lt;p>इसके अलावा, एक समूह जिसमें संक्रियाओं के क्रम को बदलने से परिणाम नहीं बदलता है, अर्थात जो निम्नलिखित शर्त को पूरा करता है, उसे &lt;strong>एबेलियन समूह (Abelian group या क्रमविनिमेय समूह)&lt;/strong> कहा जाता है।&lt;/p>
&lt;ol start="5">
&lt;li>&lt;strong>क्रमविनिमेयता (Commutativity)&lt;/strong>: किन्हीं $a, b \in G$ के लिए, $a + b = b + a$ लागू होता है।&lt;/li>
&lt;/ol>
&lt;p>एलिप्टिक कर्व पर बिंदुओं का सेट, एक विशिष्ट जोड़ नियम को परिभाषित करके, इस &lt;strong>एबेलियन समूह&lt;/strong> का निर्माण करता है।&lt;/p>
&lt;h3 id="22-परमत-कषतर-finite-field">2.2. परिमित क्षेत्र (Finite Field)
&lt;/h3>&lt;p>क्रिप्टोग्राफी में, हम वास्तविक या सम्मिश्र संख्याओं जैसे निरंतर और असीम अवयवों वाले क्षेत्रों के बजाय &lt;strong>परिमित क्षेत्र (Finite Field)&lt;/strong> या गैलवा क्षेत्र (Galois Field) का उपयोग करते हैं, जिनमें अवयवों की संख्या परिमित होती है।&lt;/p>
&lt;p>सबसे बुनियादी परिमित क्षेत्र अभाज्य संख्या $p$ का उपयोग करने वाला &lt;strong>अभाज्य क्षेत्र (Prime Field) $\mathbb{F}_p$&lt;/strong> है। यह पूर्णांकों के सेट $\{0, 1, 2, \dots, p-1\}$ पर मॉड्यूलो $p$ (अर्थात $p$ से विभाजित करने पर शेषफल) के अंतर्गत चार बुनियादी अंकगणितीय संक्रियाओं (जोड़, घटाव, गुणा, भाग) को परिभाषित करता है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>जोड़&lt;/strong>: $(a + b) \pmod p$&lt;/li>
&lt;li>&lt;strong>घटाव&lt;/strong>: $(a - b) \pmod p$&lt;/li>
&lt;li>&lt;strong>गुणा&lt;/strong>: $(a \times b) \pmod p$&lt;/li>
&lt;li>&lt;strong>भाग&lt;/strong>: $a \times b^{-1} \pmod p$ (जहाँ $b^{-1}$ मॉड्यूलो $p$ के तहत $b$ का गुणनात्मक प्रतिलोम है)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>गुणनात्मक प्रतिलोम (Modular Multiplicative Inverse)&lt;/strong> की गणना क्रिप्टोग्राफ़िक कार्यान्वयन में बहुत महत्वपूर्ण है। $b \times b^{-1} \equiv 1 \pmod p$ को संतुष्ट करने वाले $b^{-1}$ को खोजने के लिए मुख्य रूप से निम्नलिखित दो एल्गोरिदम का उपयोग किया जाता है।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>विस्तारित यूक्लिडियन एल्गोरिदम (Extended Euclidean Algorithm)&lt;/strong>: यह तेज़ है, लेकिन कार्यान्वयन के आधार पर, प्रसंस्करण समय इनपुट मान पर निर्भर कर सकता है, जिससे टाइमिंग हमलों का जोखिम होता है।&lt;/li>
&lt;li>&lt;strong>फ़र्मेट का छोटा प्रमेय (Fermat&amp;rsquo;s Little Theorem)&lt;/strong>: जब $p$ एक अभाज्य संख्या है और $b \neq 0$ है, तो $b^{p-1} \equiv 1 \pmod p$ लागू होता है। दोनों पक्षों को $b$ से विभाजित करने पर, हमें $b^{p-2} \equiv b^{-1} \pmod p$ मिलता है। दूसरे शब्दों में, $b$ की घात $p-2$ की गणना करके प्रतिलोम पाया जा सकता है। चूंकि घातांकीकरण (exponentiation) को निरंतर समय (constant time) में लागू करना आसान होता है, इसलिए क्रिप्टोग्राफ़िक कार्यान्वयन में इसे प्राथमिकता दी जाती है।&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="3-एलपटक-करव-क-समकरण-और-जयमत">3. एलिप्टिक कर्व के समीकरण और ज्यामिति
&lt;/h2>&lt;h3 id="31-वयरसटरस-क-समनय-रप-weierstrass-normal-form">3.1. वियरस्ट्रास का सामान्य रूप (Weierstrass Normal Form)
&lt;/h3>&lt;p>&lt;strong>एलिप्टिक कर्व (Elliptic Curve)&lt;/strong> आम तौर पर एक समतलीय वक्र (plane curve) होता है जिसे निम्नलिखित &lt;strong>वियरस्ट्रास के सामान्य रूप (Weierstrass normal form)&lt;/strong> नामक समीकरण द्वारा परिभाषित किया जाता है।&lt;/p>
$$ y^2 = x^3 + ax + b $$
&lt;p>यहाँ, $a$ और $b$ स्थिरांक हैं, और इस शर्त के रूप में कि वक्र में कोई एकवचन बिंदु (singular points जैसे स्व-प्रतिच्छेदन या कस्प) न हो (अर्थात यह एक चिकना वक्र हो), यह आवश्यक है कि निम्नलिखित &lt;strong>विविक्तकर (Discriminant) $\Delta$&lt;/strong> शून्य न हो।&lt;/p>
$$ \Delta = -16(4a^3 + 27b^2) \neq 0 $$
&lt;p>चूंकि एकवचन बिंदुओं वाले वक्र क्रिप्टोग्राफ़िक सुरक्षा से समझौता करते हैं, इसलिए गुणांक $a, b$ को हमेशा इस शर्त को पूरा करने के लिए चुना जाता है।&lt;/p>
&lt;h3 id="32-अनत-पर-बद-point-at-infinity">3.2. अनंत पर बिंदु (Point at Infinity)
&lt;/h3>&lt;p>एलिप्टिक कर्व को गणितीय रूप से पूर्ण समूह बनाने के लिए, हम समतल के बिंदुओं के अलावा &lt;strong>&amp;ldquo;अनंत पर बिंदु (Point at Infinity)&amp;rdquo;&lt;/strong> नामक एक आभासी बिंदु पेश करते हैं। इसे $\mathcal{O}$ (ओ) के रूप में दर्शाया जाता है।&lt;/p>
&lt;p>अनंत पर बिंदु $\mathcal{O}$ को उस बिंदु के रूप में परिभाषित किया गया है जहाँ सभी ऊर्ध्वाधर रेखाएँ अनंत में प्रतिच्छेद करती हैं। समूह सिद्धांत में, यह अनंत पर बिंदु $\mathcal{O}$ &lt;strong>जोड़ के तहत तत्समक अवयव&lt;/strong> (शून्य) के रूप में कार्य करता है।&lt;/p>
&lt;p>अर्थात, वक्र पर किसी भी बिंदु $P$ के लिए, निम्नलिखित लागू होता है।
&lt;/p>
$$ P + \mathcal{O} = \mathcal{O} + P = P $$
&lt;p>इसके अलावा, बिंदु $P = (x, y)$ का प्रतिलोम $-P$, x-अक्ष के सममित बिंदु $(x, -y)$ के रूप में परिभाषित किया गया है। इसलिए:
&lt;/p>
$$ P + (-P) = \mathcal{O} $$
&lt;p>
होता है।&lt;/p>
&lt;hr>
&lt;h2 id="4-एलपटक-करव-पर-समह-सचलन-बद-जड-और-दहरकरण">4. एलिप्टिक कर्व पर समूह संचालन (बिंदु जोड़ और दोहरीकरण)
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी का मूल वक्र पर बिंदुओं के बीच &lt;strong>&amp;ldquo;जोड़ (Addition)&amp;rdquo;&lt;/strong> का संचालन है। यह सामान्य पूर्णांकों के जोड़ से अलग है और ज्यामितीय संचालन के आधार पर परिभाषित किया गया है।&lt;/p>
&lt;h3 id="41-जयमतय-जड-tangent-and-chord-method">4.1. ज्यामितीय जोड़ (Tangent and Chord Method)
&lt;/h3>&lt;p>वक्र पर दो अलग-अलग बिंदुओं $P$ और $Q$ को जोड़कर एक नया बिंदु $R$ ($R = P + Q$) खोजने की प्रक्रिया इस प्रकार है।&lt;/p>
&lt;ol>
&lt;li>बिंदु $P$ और बिंदु $Q$ से गुजरने वाली एक रेखा (जीवा/chord) खींचें।&lt;/li>
&lt;li>यह रेखा हमेशा एलिप्टिक कर्व को एक और बिंदु पर प्रतिच्छेद करेगी (आइए इसे $-R$ कहें)। (*बीजगणितीय ज्यामिति के एक प्रमेय के अनुसार)&lt;/li>
&lt;li>प्रतिच्छेदन बिंदु $-R$ को x-अक्ष पर प्रतिबिंबित करने (y-निर्देशांक के चिह्न को उलटने) से प्राप्त बिंदु, वांछित बिंदु $R$ है।&lt;/li>
&lt;/ol>
&lt;div class="mermaid">graph TD
Step1["P(x1, y1) और Q(x2, y2) को जोड़ने वाली एक रेखा खींचें"] --> Step2["वक्र के साथ तीसरे प्रतिच्छेदन बिंदु -R को खोजें"]
Step2 --> Step3["-R को x-अक्ष पर प्रतिबिंबित करें और R(x3, y3) प्राप्त करें"]
Step3 -.-> Result["यह R = P + Q है"]&lt;/div>
&lt;h3 id="42-बद-क-दहरकरण-point-doubling">4.2. बिंदु का दोहरीकरण (Point Doubling)
&lt;/h3>&lt;p>जब एक ही बिंदु $P$ को बिंदु $P$ में जोड़ा जाता है ($P + P = 2P$), तो दो बिंदुओं से गुजरने वाली रेखा खींचना संभव नहीं है। इस मामले में, हम &lt;strong>बिंदु $P$ पर वक्र की स्पर्शरेखा (Tangent)&lt;/strong> खींचते हैं।&lt;/p>
&lt;ol>
&lt;li>बिंदु $P$ पर वक्र की स्पर्शरेखा खींचें।&lt;/li>
&lt;li>यह स्पर्शरेखा वक्र को एक अन्य बिंदु $-R$ पर प्रतिच्छेद करती है।&lt;/li>
&lt;li>प्रतिच्छेदन बिंदु को x-अक्ष पर प्रतिबिंबित करने से प्राप्त बिंदु वांछित बिंदु $R = 2P$ है।&lt;/li>
&lt;/ol>
&lt;h3 id="43-बजगणतय-गणन-सतर">4.3. बीजगणितीय गणना सूत्र
&lt;/h3>&lt;p>ज्यामितीय संक्रियाओं को बीजगणितीय सूत्रों में बदला जाता है ताकि कंप्यूटर द्वारा उनकी गणना की जा सके।
सभी गणनाएँ &lt;strong>परिमित क्षेत्र $\mathbb{F}_p$ (मॉड्यूलो $p$) पर&lt;/strong> की जाती हैं।&lt;/p>
&lt;p>मान लें कि बिंदु $P = (x_1, y_1)$ और बिंदु $Q = (x_2, y_2)$ हैं।
यह भी मान लें कि गणना के परिणाम का बिंदु $R = P + Q = (x_3, y_3)$ है।&lt;/p>
&lt;p>मान लें कि रेखा का ढलान $\lambda$ (लैम्ब्डा) है।&lt;/p>
&lt;p>&lt;strong>【स्थिति 1: $P \neq Q$ होने पर (बिंदु जोड़)】&lt;/strong>
ढलान $\lambda$ दो बिंदुओं के बीच परिवर्तन की दर है।
&lt;/p>
$$ \lambda \equiv \frac{y_2 - y_1}{x_2 - x_1} \pmod p $$
$$ \lambda \equiv (y_2 - y_1) \cdot (x_2 - x_1)^{-1} \pmod p $$
&lt;p>इस $\lambda$ का उपयोग करके, $x_3, y_3$ निम्न प्रकार से ज्ञात किए जा सकते हैं।
&lt;/p>
$$ x_3 \equiv \lambda^2 - x_1 - x_2 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;p>&lt;strong>【स्थिति 2: $P = Q$ होने पर (बिंदु का दोहरीकरण)】&lt;/strong>
ढलान $\lambda$ स्पर्शरेखा का ढलान है जिसे अवकलन (differentiation) द्वारा पाया जाता है। (हम $y^2 = x^3 + ax + b$ का अंतर्निहित अवकलन करते हैं)
&lt;/p>
$$ 2y \cdot y' = 3x^2 + a \implies y' = \frac{3x^2 + a}{2y} $$
&lt;p>
इसलिए,
&lt;/p>
$$ \lambda \equiv (3x_1^2 + a) \cdot (2y_1)^{-1} \pmod p $$
&lt;p>$x_3, y_3$ के समीकरण जोड़ के समान रूप में हैं, लेकिन चूँकि $x_2 = x_1$ है, इसलिए वे निम्न प्रकार हो जाते हैं।
&lt;/p>
$$ x_3 \equiv \lambda^2 - 2x_1 \pmod p $$
$$ y_3 \equiv \lambda(x_1 - x_3) - y_1 \pmod p $$
&lt;blockquote>
&lt;p>[!IMPORTANT]
इन सूत्रों में $(x_2 - x_1)^{-1}$ और $(2y_1)^{-1}$ जैसे &lt;strong>विभाजन (मॉड्यूलर प्रतिलोम की गणना)&lt;/strong> शामिल हैं। मॉड्यूलर प्रतिलोम की गणना की कम्प्यूटेशनल लागत बहुत अधिक होती है, इसलिए वास्तविक कार्यान्वयन में, &lt;strong>&amp;ldquo;जैकोबियन कोऑर्डिनेट्स (Jacobian Coordinates)&amp;rdquo;&lt;/strong> जैसी प्रक्षेपीय समन्वय प्रणालियों (projective coordinate systems) का आमतौर पर उपयोग किया जाता है जो विभाजन को विलंबित करते हैं।&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="5-अदश-गणन-scalar-multiplication-और-एलपटक-करव-असतत-लघगणक-समसय-ecdlp">5. अदिश गुणन (Scalar Multiplication) और एलिप्टिक कर्व असतत लघुगणक समस्या (ECDLP)
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी में, वह संक्रिया जिसमें सबसे अधिक गणना की आवश्यकता होती है और जो सुरक्षा का मूल है, वह &lt;strong>अदिश गुणन (Scalar Multiplication)&lt;/strong> है।&lt;/p>
&lt;h3 id="51-अदश-गणन-कय-ह">5.1. अदिश गुणन क्या है?
&lt;/h3>&lt;p>किसी बिंदु $P$ को $k$ बार जोड़ने की क्रिया को अदिश गुणन कहा जाता है, और इसे $kP$ के रूप में दर्शाया जाता है।
&lt;/p>
$$ kP = \underbrace{P + P + \dots + P}_{k\text{ बार}} $$
&lt;p>यहाँ, $k$ एक बहुत बड़ा पूर्णांक है (उदाहरण के लिए, 256-बिट पूर्णांक)।&lt;/p>
&lt;h3 id="52-एलपटक-करव-असतत-लघगणक-समसय-ecdlp">5.2. एलिप्टिक कर्व असतत लघुगणक समस्या (ECDLP)
&lt;/h3>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी की सुरक्षा निम्नलिखित समस्या की कठिनाई पर निर्भर करती है।&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>एलिप्टिक कर्व असतत लघुगणक समस्या (Elliptic Curve Discrete Logarithm Problem: ECDLP)&lt;/strong>
एक ज्ञात बिंदु $P$ (आधार बिंदु) और एक गणना किए गए परिणामी बिंदु $Q$ को देखते हुए, अदिश (scalar) $k$ खोजें जो $Q = kP$ को संतुष्ट करता हो।&lt;/p>
&lt;/blockquote>
&lt;p>$k$ और $P$ से $Q$ की गणना करना (आगे की दिशा) बाद में वर्णित एल्गोरिदम का उपयोग करके आसान (बहुपद समय) है, लेकिन $P$ और $Q$ से $k$ की उल्टी गणना (विपरीत दिशा) करना लगभग असंभव है (यह एक वन-वे फ़ंक्शन है), सिवाय ब्रूट-फोर्स खोज के इसके लिए कोई कुशल समाधान नहीं है।
क्रिप्टोग्राफ़िक प्रोटोकॉल में, &lt;strong>$k$ &amp;ldquo;निजी कुंजी (Private Key)&amp;rdquo; से मेल खाता है, और $Q$ &amp;ldquo;सार्वजनिक कुंजी (Public Key)&amp;rdquo;&lt;/strong> से मेल खाता है।&lt;/p>
&lt;h3 id="53-डबल-एड-ऐड-double-and-add-एलगरदम">5.3. डबल-एंड-ऐड (Double-and-Add) एल्गोरिदम
&lt;/h3>&lt;p>यदि $k$ एक विशाल संख्या है (उदा: $2^{256}$), तो $P$ को सीधे $k$ बार जोड़ना ब्रह्मांड के जीवनकाल में भी पूरा नहीं होगा। इसलिए, अदिश गुणन को तेज़ी से करने के लिए &lt;strong>डबल-एंड-ऐड विधि (Double-and-Add method या बाइनरी विधि)&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;p>यह पूर्णांकों के घातांकीकरण को तेज़ी से गणना करने के लिए &amp;ldquo;स्क्वेयर-एंड-मल्टीप्लाई (square-and-multiply)&amp;rdquo; विधि का एलिप्टिक कर्व संस्करण है। यह अदिश $k$ को बाइनरी में दर्शाता है और सबसे महत्वपूर्ण बिट (MSB) से शुरू करके क्रमिक रूप से संसाधित करता है।&lt;/p>
&lt;ol>
&lt;li>परिणाम को संग्रहीत करने के लिए बिंदु $R$ को $\mathcal{O}$ से प्रारंभ करें।&lt;/li>
&lt;li>$k$ के सबसे महत्वपूर्ण बिट (MSB) से सबसे कम महत्वपूर्ण बिट (LSB) तक निम्न को दोहराएं:
&lt;ul>
&lt;li>$R$ को दोगुना करें (Point Doubling: $R = 2R$)&lt;/li>
&lt;li>यदि वर्तमान बिट &lt;code>1&lt;/code> है, तो $R$ में $P$ जोड़ें (Point Addition: $R = R + P$)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>इस एल्गोरिदम के माध्यम से, कम्प्यूटेशनल जटिलता $O(k)$ से $O(\log_2 k)$ तक नाटकीय रूप से कम हो जाती है, जिससे यथार्थवादी समय (मिलीसेकंड में) में गणना संभव हो जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="6-एलपटक-करव-डफ-हलमन-ecdh-कज-वनमय-key-exchange">6. एलिप्टिक कर्व डिफी-हेलमैन (ECDH) कुंजी विनिमय (Key Exchange)
&lt;/h2>&lt;p>यहाँ हम &lt;strong>ECDH (Elliptic Curve Diffie-Hellman) कुंजी विनिमय प्रोटोकॉल&lt;/strong> के तंत्र की व्याख्या करेंगे, जो ECC का सबसे विशिष्ट अनुप्रयोग है। ECDH ऐलिस और बॉब को एक असुरक्षित संचार चैनल पर सुरक्षित रूप से एक सामान्य गुप्त कुंजी (सत्र कुंजी/session key) उत्पन्न करने और साझा करने की अनुमति देता है (यह TLS हैंडशेक का मूल है)।&lt;/p>
&lt;p>&lt;strong>【पूर्वापेक्षित पैरामीटर (डोमेन पैरामीटर)】&lt;/strong>
दोनों पक्ष पहले से उपयोग किए जाने वाले एलिप्टिक कर्व $E$, अभाज्य संख्या $p$, और आधार बिंदु $G$ को साझा करते हैं। (उदाहरण के लिए NIST P-256 या secp256k1 आदि)&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Alice as "Alice (ऐलिस)"
participant Bob as "Bob (बॉब)"
Note over Alice,Bob: "सार्वजनिक पैरामीटर: वक्र E, आधार बिंदु G, अभाज्य संख्या p"
Alice->>Alice: "निजी कुंजी d_A (एक यादृच्छिक पूर्णांक) उत्पन्न करें"
Alice->>Alice: "सार्वजनिक कुंजी Q_A = d_A * G की गणना करें"
Bob->>Bob: "निजी कुंजी d_B (एक यादृच्छिक पूर्णांक) उत्पन्न करें"
Bob->>Bob: "सार्वजनिक कुंजी Q_B = d_B * G की गणना करें"
Alice->>Bob: "सार्वजनिक कुंजी Q_A भेजें (प्लेनटेक्स्ट में)"
Bob->>Alice: "सार्वजनिक कुंजी Q_B भेजें (प्लेनटेक्स्ट में)"
Alice->>Alice: "साझा रहस्य S = d_A * Q_B की गणना करें"
Bob->>Bob: "साझा रहस्य S = d_B * Q_A की गणना करें"
Note over Alice,Bob: "S = d_A * (d_B * G) = d_B * (d_A * G) = (d_A * d_B) * G"
Note over Alice,Bob: "दोनों पक्षों द्वारा गणना किया गया परिणाम S पूरी तरह से मेल खाता है!"&lt;/div>
&lt;p>एक छिपकर बातें सुनने वाला (ईव) संचार चैनल पर प्रवाहित होने वाले $G$, $Q_A$, $Q_B$ को रोक सकता है, लेकिन ECDLP की कठिनाई के कारण, वह $Q_A = d_A \cdot G$ से ऐलिस की निजी कुंजी $d_A$ का पता नहीं लगा सकता है। इसके अलावा, $Q_A$ और $Q_B$ को गुणा करने से साझा कुंजी $S$ नहीं मिलती है, इसलिए छिपकर बातें सुनने वाला $S$ की गणना नहीं कर सकता।&lt;/p>
&lt;hr>
&lt;h2 id="7-करयनवयन-क-कमय-सइड-चनल-हमल-और-उपय">7. कार्यान्वयन की कमियां: साइड-चैनल हमले और उपाय
&lt;/h2>&lt;p>भले ही एक क्रिप्टोग्राफ़िक एल्गोरिदम सैद्धांतिक रूप से परिपूर्ण हो, लेकिन इसे एक प्रोग्राम के रूप में लागू करने की प्रक्रिया में कमियां उत्पन्न हो सकती हैं। इसे &lt;strong>&amp;ldquo;साइड-चैनल अटैक (Side-Channel Attack)&amp;rdquo;&lt;/strong> कहा जाता है।&lt;/p>
&lt;h3 id="71-टइमग-अटक-timing-attack">7.1. टाइमिंग अटैक (Timing Attack)
&lt;/h3>&lt;p>आइए पहले बताए गए डबल-एंड-ऐड (Double-and-Add) एल्गोरिदम को फिर से देखें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// असुरक्षित डबल-एंड-ऐड का छद्म कोड (pseudocode)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Infinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointDoubling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// हमेशा निष्पादित होता है
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PointAddition&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// केवल तभी निष्पादित होता है जब बिट 1 हो!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कार्यान्वयन में एक घातक खामी है। जब बिट &lt;code>1&lt;/code> होता है, तो पॉइंट एडिशन निष्पादित होता है, इसलिए गणना का समय &lt;strong>थोड़ा लंबा हो जाता है&lt;/strong> तुलना में जब बिट &lt;code>0&lt;/code> होता है। इसके अतिरिक्त, प्रोसेसर की शाखा भविष्यवाणी (branch prediction) और कैश मेमोरी व्यवहार भी बदल जाते हैं।
हमलावर इस गणना समय (या बिजली की खपत) में मिनट के अंतर को हजारों बार सांख्यिकीय रूप से देखकर &lt;strong>निजी कुंजी $k$ के बिट अनुक्रम को बिट दर बिट पूरी तरह से पुनर्प्राप्त&lt;/strong> कर सकता है। यही टाइमिंग अटैक है।&lt;/p>
&lt;h3 id="72-नरतर-समय-constant-time-करयनवयन-मटगमर-लडर-montgomery-ladder">7.2. निरंतर-समय (Constant-Time) कार्यान्वयन: मोंटगोमेरी लैडर (Montgomery Ladder)
&lt;/h3>&lt;p>टाइमिंग हमलों को रोकने के लिए, ऐसे एल्गोरिदम को अपनाना आवश्यक है जहाँ &lt;strong>निष्पादित निर्देशों का अनुक्रम और गणना का समय हमेशा स्थिर (Constant-Time) होता है, चाहे निजी कुंजी का बिट मान कुछ भी हो&lt;/strong>।&lt;/p>
&lt;p>इसका एक प्रमुख उदाहरण &lt;strong>मोंटगोमेरी लैडर (Montgomery Ladder)&lt;/strong> है।&lt;/p>
&lt;div class="mermaid">graph TD
Start["आरंभीकरण: R0 = O, R1 = P"] --> LoopStart["प्रत्येक बिट i के लिए (MSB से)"]
LoopStart --> Cond{"k_i का मान क्या है?"}
Cond -->|0| Branch0["R1 = R0 + R1&lt;br>R0 = 2 * R0"]
Cond -->|1| Branch1["R0 = R0 + R1&lt;br>R1 = 2 * R1"]
Branch0 --> LoopEnd["अगले बिट पर जाएं"]
Branch1 --> LoopEnd
LoopEnd --> LoopStart
LoopStart -.->|"सभी बिट्स पूरे हुए"| End["अंत: R0 परिणाम (kP) है"]&lt;/div>
&lt;p>मोंटगोमेरी लैडर की सुंदरता इस बात में है कि चाहे बिट &lt;code>0&lt;/code> हो या &lt;code>1&lt;/code>, &lt;strong>&amp;ldquo;हमेशा एक पॉइंट एडिशन और एक पॉइंट डबलिंग&amp;rdquo;&lt;/strong> निष्पादित की जाती है। यह गणना समय की डेटा निर्भरता को पूरी तरह से समाप्त कर देता है।&lt;/p>
&lt;p>हालाँकि, यदि कोई शाखा (branch) (&lt;code>if (k_i == 0)&lt;/code>) स्वयं मौजूद है, तो यह जोखिम रहता है कि निष्पादन समय कंपाइलर अनुकूलन और CPU की शाखा भविष्यवाणी के कारण भिन्न हो सकता है। इसलिए, वास्तविक निरंतर-समय के कार्यान्वयन में, सशर्त शाखाओं (&lt;code>if&lt;/code> कथन) को समाप्त कर दिया जाता है और &lt;strong>बिटवाइज़ संचालन (bitwise operations) का उपयोग करके एक सशर्त स्वैप (Conditional Swap)&lt;/strong> का उपयोग किया जाता है।&lt;/p>
&lt;hr>
&lt;h2 id="8-c-क-उपयग-करक-एलपटक-करव-करपटगरफ-क-करयनवयन">8. C++ का उपयोग करके एलिप्टिक कर्व क्रिप्टोग्राफी का कार्यान्वयन
&lt;/h2>&lt;p>यहाँ से, हम सिद्धांत को C++ कोड में बदलेंगे। व्यावहारिक क्रिप्टोग्राफ़िक लाइब्रेरी (जैसे OpenSSL या libsodium) उन्नत असेंबली अनुकूलन और जैकोबियन निर्देशांक का उपयोग करती हैं, लेकिन यहाँ, गणितीय समझ को गहरा करने के लिए, हम &lt;strong>एफाइन निर्देशांक (Affine Coordinates) का उपयोग करके आसानी से समझे जाने वाले निरंतर-समय कार्यान्वयन&lt;/strong> की रूपरेखा दिखाएंगे।&lt;/p>
&lt;p>हम यह मानेंगे कि बड़े पूर्णांक संचालन के लिए &lt;code>boost::multiprecision::cpp_int&lt;/code> का उपयोग किया जाता है।&lt;/p>
&lt;h3 id="81-मडयलर-अकगणत-और-परतलम">8.1. मॉड्यूलर अंकगणित और प्रतिलोम
&lt;/h3>&lt;p>सबसे पहले, हम परिमित क्षेत्र पर संचालन के लिए सहायक कार्यों को परिभाषित करते हैं। हम फ़र्मेट के छोटे प्रमेय (Fermat&amp;rsquo;s Little Theorem) का उपयोग करके प्रतिलोम गणना को लागू करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdexcept&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// उदाहरण के रूप में secp256k1 की अभाज्य संख्या p और पैरामीटर
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">p&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// धनात्मक शेषफल लौटाने वाला मॉड्यूलो ऑपरेशन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nl">m&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// मॉड्यूलर घातांकीकरण (x^y mod m)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">exp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">exp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">res&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">res&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">base&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">base&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">base&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">res&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// फ़र्मेट के छोटे प्रमेय का उपयोग करके मॉड्यूलर प्रतिलोम
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="nf">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यह मानकर कि m एक अभाज्य संख्या है: n^(m-2) ≡ n^(-1) mod m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">powerMod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="82-बद-परतनधतव-और-समह-सचलन-जड--दहरकरण">8.2. बिंदु प्रतिनिधित्व और समूह संचालन (जोड़ / दोहरीकरण)
&lt;/h3>&lt;p>हम अनंत पर बिंदु को प्रबंधित करने के लिए एक ध्वज (flag) के साथ एक &lt;code>Point&lt;/code> संरचना, और जोड़ सूत्र को लागू करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Point&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अनंत पर बिंदु का निर्माण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// सामान्य बिंदु का निर्माण
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">isInfinity&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">false&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// एलिप्टिक कर्व पर बिंदु जोड़ (R = P + Q)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">isInfinity&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// P + (-P) = अनंत पर बिंदु
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">lambda&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Doubling (P = Q होने पर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (3x^2 + a) / 2y
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Point Addition (P != Q होने पर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// lambda = (y2 - y1) / (x2 - x1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">modInverse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambda&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">den&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">x3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">lambda&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Q&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">y3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mod&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambda&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">x3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="83-नरतर-समय-constant-time-सशरत-सवप-conditional-swap-क-करयनवयन">8.3. निरंतर-समय (Constant-Time) सशर्त स्वैप (Conditional Swap) का कार्यान्वयन
&lt;/h3>&lt;p>निजी कुंजी के बिट मान के आधार पर चर (variables) की सामग्री की अदला-बदली करते समय, हम &lt;code>if&lt;/code> कथन का उपयोग किए बिना केवल बिटवाइज़ संचालन (मास्क) का उपयोग करके स्वैप करते हैं। यह सुनिश्चित करता है कि निष्पादन पथ (execution path) पूरी तरह से स्थिर रहे।&lt;/p>
&lt;blockquote>
&lt;p>[!TIP]
वास्तविक कार्यान्वयन में, &lt;code>cpp_int&lt;/code> जैसे गतिशील रूप से आवंटित बहु-सटीक (multi-precision) पूर्णांक वर्ग निरंतर-समय प्रसंस्करण के लिए उपयुक्त नहीं हैं। ऐसा इसलिए है क्योंकि मेमोरी आवंटन और सरणी आकार में भिन्नता के कारण टाइमिंग जानकारी लीक होती है। व्यावहारिक पुस्तकालयों में, उन्हें एक निश्चित लंबाई (उदाहरण के लिए, uint64_t का 4-तत्व सरणी) के साथ दर्शाया जाता है, और बिट-स्तरीय मास्किंग लागू की जाती है। निम्नलिखित एक वैचारिक उदाहरण है।&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// वैचारिक निरंतर-समय स्वैप (निश्चित लंबाई के पूर्णांक मानकर)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// यदि bit 1 है, तो P1 और P2 को स्वैप करें; यदि 0 है, तो स्वैप न करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">void&lt;/span> &lt;span class="nf">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// bit 0 या 1 है। यदि bit=1 है तो मास्क सभी 1 (0xFF..) है, और यदि 0 है तो सभी 0 है।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// (स्पष्टीकरण के लिए, मान लें कि एक निश्चित लंबाई वाले BigInt वर्ग का प्रत्येक शब्द w है)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="cm">/*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t mask = 0 - (uint64_t)bit;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> for (int i = 0; i &amp;lt; NUM_WORDS; i++) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> uint64_t dummy = mask &amp;amp; (P1.x.words[i] ^ P2.x.words[i]);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P1.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> P2.x.words[i] ^= dummy;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> // y-निर्देशांक और isInfinity ध्वज को भी इसी तरह संसाधित करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// * boost::multiprecision के साथ पूर्ण निरंतर-समय स्वैप मुश्किल है,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// इसलिए यहाँ तर्क को समझने के लिए हम केवल शाखाओं (branches) द्वारा इसका अनुकरण करते हैं।
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bit&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">swap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">P1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">P2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="84-मटगमर-लडर-montgomery-ladder-क-उपयग-करक-अदश-गणन">8.4. मोंटगोमेरी लैडर (Montgomery Ladder) का उपयोग करके अदिश गुणन
&lt;/h3>&lt;p>सुरक्षित अदिश गुणन को लागू करने के लिए हम पहले बताए गए &lt;code>pointAdd&lt;/code> और &lt;code>cswap&lt;/code> को जोड़ते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// अदिश गुणन k * P (मोंटगोमेरी लैडर विधि)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Point&lt;/span> &lt;span class="nf">scalarMultiply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Point&lt;/span> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Point&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// अनंत पर बिंदु
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Point&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">P&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// k की बिट लंबाई प्राप्त करें (secp256k1 के लिए 256 बिट्स)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">256&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">numBits&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">--&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// i-वें बिट का मान प्राप्त करें (0 या 1)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">uint8_t&lt;/span> &lt;span class="n">bit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">static_cast&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint8_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bit_test&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि bit == 1, तो R0 और R1 को स्वैप करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// हमेशा समान संक्रिया निष्पादित करें (पॉइंट एडिशन और पॉइंट डबलिंग)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">R1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">R0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pointAdd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// यदि bit == 1 था, तो स्थिति को पुनर्स्थापित करने के लिए फिर से स्वैप करें
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cswap&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">R0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">R1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">bit&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">R0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस कार्यान्वयन तर्क के साथ, चाहे अदिश $k$ का प्रत्येक बिट &lt;code>0&lt;/code> हो या &lt;code>1&lt;/code>, प्रत्येक लूप पुनरावृत्ति (iteration) के भीतर निष्पादित संक्रियाएँ (&lt;code>cswap&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>pointAdd&lt;/code> $\to$ &lt;code>cswap&lt;/code>) बिल्कुल एक ही प्रवाह का पालन करती हैं, जो समय या कैश एक्सेस पैटर्न में अंतर के माध्यम से गुप्त जानकारी के रिसाव को दृढ़ता से रोकता है।&lt;/p>
&lt;hr>
&lt;h2 id="9-नषकरष">9. निष्कर्ष
&lt;/h2>&lt;p>एलिप्टिक कर्व क्रिप्टोग्राफी (ECC), पहली नज़र में अजीब लग सकती है कि &amp;ldquo;क्यों रेखाएँ खींचने और प्रतिच्छेदनों को प्रतिबिंबित करने जैसी ज्यामितीय संक्रियाएँ एन्क्रिप्शन बन जाती हैं?&amp;quot;। हालाँकि, यह गणित और क्रिप्टोग्राफी के एक चमत्कारी संलयन का परिणाम है जो इसे परिमित क्षेत्र के असतत (discrete) दुनिया में मैप करके एक शानदार वन-वे फ़ंक्शन (असतत लघुगणक समस्या) बनाने की अनुमति देता है।&lt;/p>
&lt;p>इस लेख में हमने निम्नलिखित महत्वपूर्ण बिंदुओं की व्याख्या की है:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>RSA पर लाभ&lt;/strong>: बहुत छोटी कुंजी की लंबाई के साथ मजबूत सुरक्षा प्रदान करता है, जो इसे आधुनिक मोबाइल और IoT युग के लिए आदर्श बनाता है।&lt;/li>
&lt;li>&lt;strong>समूह सिद्धांत और परिमित क्षेत्रों की मूल बातें&lt;/strong>: गणितीय संरचना जो ECC की नींव बनाती है।&lt;/li>
&lt;li>&lt;strong>जोड़ और दोहरीकरण सूत्र&lt;/strong>: वियरस्ट्रास समीकरण का उपयोग करके बीजगणितीय समूह संचालन को लागू करने के तरीके।&lt;/li>
&lt;li>&lt;strong>साइड-चैनल हमलों का खतरा&lt;/strong>: कैसे निजी कुंजी के बिट्स पर निर्भर सशर्त शाखाएं (conditional branches) घातक कमियां पैदा करती हैं।&lt;/li>
&lt;li>&lt;strong>निरंतर-समय (Constant-Time) कार्यान्वयन&lt;/strong>: मोंटगोमेरी लैडर और सशर्त स्वैप (Conditional Swap) का उपयोग करके हार्डवेयर-स्तरीय व्यवहार को सुसंगत बनाने और हमलों को रोकने के लिए C++ कोडिंग तकनीक।&lt;/li>
&lt;/ol>
&lt;p>उत्पादन वातावरण (production environment) में काम करने वाली अपनी खुद की क्रिप्टोग्राफ़िक लाइब्रेरी बनाने को सुरक्षा जोखिमों के कारण अत्यधिक हतोत्साहित किया जाता है (&amp;ldquo;अपना खुद का क्रिप्टो न बनाएं&amp;rdquo;)। हालाँकि, हुड के नीचे काम करने वाले एल्गोरिदम और गणितीय पृष्ठभूमि की गहरी समझ होना, अधिक सुरक्षित और उच्च-प्रदर्शन प्रणाली को डिजाइन और संचालित करने वाले इंजीनियरों के लिए एक अमूल्य और शक्तिशाली हथियार होगा।&lt;/p>
&lt;p>अगले लेख में, हम इस एलिप्टिक कर्व का उपयोग करने वाले डिजिटल हस्ताक्षर एल्गोरिदम &lt;strong>ECDSA (Elliptic Curve Digital Signature Algorithm)&lt;/strong> के तंत्र, और बिटकॉइन में प्रयुक्त &lt;strong>स्क्नोर (Schnorr) हस्ताक्षर&lt;/strong> के बारे में और गहराई से जानेंगे।&lt;/p></description></item></channel></rss>