प्रस्तावना: वॉन न्यूमैन की “पाप की अवस्था” और नियतिवादी संयोग का विरोधाभास
1951 में, आधुनिक कंप्यूटर के जनक जॉन वॉन न्यूमैन (John von Neumann) ने कंप्यूटर विज्ञान के इतिहास का एक अमर वाक्य कहा था: “जो कोई भी यादृच्छिक अंक (random digits) उत्पन्न करने के लिए अंकगणितीय विधियों पर विचार करता है, वह निस्संदेह ‘पाप की अवस्था (in a state of sin)’ में है।" एक डिजिटल कंप्यूटर पूर्णतः नियतिवादी परिमित-अवस्था मशीन (deterministic finite-state machine) है: समान प्रारंभिक अवस्था और निर्देश दिए जाने पर उसका प्रत्येक अगला बिट 100% पूर्वनिर्धारित होता है। फिर भी, परमाणु भौतिकी में मोंटे कार्लो सिमुलेशन और वीडियो गेम की दुनिया के निर्माण से लेकर TLS सत्र कुंजियों, SSH की-पेयर्स और ECDSA डिजिटल हस्ताक्षरों तक, हमारी आधुनिक सभ्यता प्रति सेकंड खरबों यादृच्छिक संख्याओं का उपभोग करती है।
एक पूर्णतः निर्धारित एल्गोरिदम अप्रत्याशितता कैसे पैदा कर सकता है? और क्यों सांख्यिकीय रूप से उत्कृष्ट जनरेटर जैसे मर्सेन ट्विस्टर (MT19937) को पासवर्ड रीसेट टोकन बनाने में उपयोग करने पर वह भयानक रूप से असुरक्षित हो जाता है, जिससे केवल 624 क्रमिक आउटपुट देखने वाला हमलावर भविष्य और अतीत की 100% संख्याओं की भविष्यवाणी कर सकता है?
अध्याय 1: PRNG की गणितीय संरचना ── बीज (Seed), परिमित अवस्था समष्टि और कबूतरखाना सिद्धांत
औपचारिक रूप से, एक छद्म-यादृच्छिक संख्या जनरेटर (PRNG) एक नियतिवादी ऑटोमैटोन $(\mathcal{S}, \mathcal{O}, f, g, s_0)$ है जिसमें $|\mathcal{S}| = 2^b$ आकार की परिमित आंतरिक अवस्था समष्टि $\mathcal{S}$, एक प्रारंभिक बीज (Seed) $s_0 \in \mathcal{S}$, अवस्था संक्रमण फलन $f: \mathcal{S} \to \mathcal{S}$ और आउटपुट फलन $g: \mathcal{S} \to \mathcal{O}$ होता है:
$$s_{i+1} = f(s_i), \qquad r_i = g(s_i) \qquad \left(|\mathcal{S}| = 2^b \implies \text{Period } P \le 2^b\right)$$एक बार बीज $s_0$ तय हो जाने पर संपूर्ण अनुक्रम $r_0, r_1, r_2, \dots$ पूर्णतः निर्धारित हो जाता है। यह पुनरुत्पादनीयता (Reproducibility) वैज्ञानिक सिमुलेशन की डिबगिंग के लिए अमूल्य है। किंतु कबूतरखाना सिद्धांत (Pigeonhole Principle) के अनुसार, अधिकतम $2^b$ चरणों के भीतर मशीन को किसी पूर्व अवस्था $s_{k+P} = s_k$ पर लौटना ही पड़ता है, जिससे वह आवर्तकाल (Period) $P \le 2^b$ के अनंत चक्र में फँस जाती है।
flowchart LR
S0["प्रारंभिक बीज s0"] --> S1["अवस्था s1 = f(s0)"]
S1 --> S2["अवस्था s2 = f(s1)"]
S2 -. "पूर्व-आवर्तकाल (Tail)" .-> Sk["चक्र प्रवेश sk"]
Sk --> Sk1["अवस्था s(k+1)"]
Sk1 -. "आवर्तकाल P <= 2^b का चक्र" .-> Skm1["अवस्था s(k+P-1)"]
Skm1 -- "f(s(k+P-1)) = sk" --> Sk
वॉन न्यूमैन की 1949 की मध्य-वर्ग विधि (Middle-Square Method) ($2k$ अंकों की संख्या का वर्ग करके बीच के $2k$ अंक निकालना) बीजगणितीय संरचना के अभाव में तुरंत 0000 या लंबाई 4 के छोटे चक्रों में सिमट जाती है।
अध्याय 2: लीनियर कॉन्ग्रुएंशियल जनरेटर (LCG) और मार्सग्लिया का प्रमेय ── IBM RANDU की 15-समतल त्रासदी
1949 में डी. एच. लेहमर ने लीनियर कॉन्ग्रुएंशियल जनरेटर (LCG) प्रस्तुत किया: $X_{n+1} = (a X_n + c) \bmod m$। हल-डोबेल प्रमेय (Hull-Dobell Theorem, 1962) के अनुसार, LCG पूर्ण आवर्तकाल $P = m$ तभी प्राप्त करता है जब: (1) $\gcd(c, m) = 1$, (2) $m$ का प्रत्येक अभाज्य गुणनखंड $p$, $a-1$ को विभाजित करे, और (3) यदि $4 \mid m$ तो $4 \mid (a-1)$ हो।
1968 में सांख्यिकीविद् जॉर्ज मार्सग्लिया (George Marsaglia) ने अपने प्रसिद्ध शोधपत्र “Random numbers fall mainly in the planes” में सिद्ध किया कि किसी भी LCG द्वारा उत्पन्न क्रमिक $d$-आयामी बिंदु $(X_n, \dots, X_{n+d-1})$ अधिकतम $(d! \cdot m)^{1/d}$ समानांतर हाइपरप्लेन (क्रिस्टल जालक) पर ही स्थित होते हैं!
इतिहास का सबसे कुख्यात उदाहरण IBM System/360 मेनफ़्रेम का मानक जनरेटर RANDU ($m = 2^{31}, c = 0, a = 65539 = 2^{16} + 3$) था:
सर्वसमिका $X_{n+2} \equiv 6 X_{n+1} - 9 X_n \pmod{2^{31}}$ के कारण, इकाई घन (unit cube) में RANDU द्वारा उत्पन्न सभी 3D बिंदु केवल 15 समानांतर समतलों पर कैद हो गए जिनके बीच विशाल खाली अंतराल थे, जिससे दशकों तक हज़ारों मोंटे कार्लो भौतिकी सिमुलेशन दूषित हो गए!
अध्याय 3: मर्सेन ट्विस्टर (MT19937) और आधुनिक सांख्यिकीय PRNG (PCG64, Xoshiro256++)
1997 में जापानी गणितज्ञ माकोतो मात्सुमोतो और ताकुजी निशिमुरा ने परिमित क्षेत्र $\mathbb{F}_2 = \{0, 1\}$ पर आधारित मर्सेन ट्विस्टर (MT19937) का आविष्कार किया (जो Python random, R, MATLAB, C++ std::mt19937 का डिफ़ॉल्ट इंजन बना):
- विशाल आवर्तकाल और 623-आयामी समवितरण: 32-बिट के $624$ शब्दों ($19,937$ सक्रिय बिट) की आंतरिक अवस्था मर्सेन अभाज्य आवर्तकाल $P = 2^{19937} - 1 \approx 4.315 \times 10^{6001}$ और 623 आयामों तक पूर्ण समवितरण (equidistribution) सुनिश्चित करती है!
- टेम्परिंग रूपांतरण (Tempering): आउटपुट से पहले प्रत्येक अवस्था शब्द $x$ को $\mathbb{F}_2^{32}$ पर एक व्युत्क्रमणीय (invertible) मैट्रिक्स से गुणा किया जाता है:
MT19937 के बड़े स्टेट आकार ($2.5\text{ KB}$) और TestU01 (BigCrush) में दो $\mathbb{F}_2$-रैखिकता परीक्षणों में विफलता को दूर करने के लिए, 2010 के दशक में PCG64 (मेलिसा ओ’नील 2014: डेटा-निर्भर बिट रोटेशन के साथ 128-बिट LCG; NumPy में डिफ़ॉल्ट) और Xoshiro256++ (ब्लैकमैन और विग्ना 2018: गैर-रैखिक स्क्रैम्बलर के साथ 256-बिट स्टेट; Rust और Java में प्रयुक्त) विकसित किए गए, जो 100% BigCrush परीक्षणों को उत्तीर्ण करते हैं।
अध्याय 4: सांख्यिकीय पूर्णता $\neq$ क्रिप्टोग्राफिक सुरक्षा ── 624 आउटपुट से MT19937 का क्लोन और CSPRNG
4.1 Tempering का व्युत्क्रमण: 624 आउटपुट से MT19937 की आंतरिक अवस्था चुराना
सेशन टोकन या पासवर्ड के लिए MT19937 का उपयोग एक घातक भूल है: Tempering के चारों चरण $\mathbb{F}_2^{32}$ पर $O(1)$ समय में पूर्णतः व्युत्क्रमणीय (invertible) हैं!
| |
यदि कोई हमलावर MT19937 का उपयोग करने वाले सर्वर के केवल 624 क्रमिक 32-बिट आउटपुट ($2,496\text{ बाइट्स}$) देख लेता है, तो वह प्रत्येक पर untemper(z) चलाकर सर्वर की संपूर्ण 624-शब्द आंतरिक अवस्था को 100% क्लोन कर लेता है! उस क्षण से वह भविष्य के 100% आउटपुट की भविष्यवाणी कर सकता है और अतीत के सभी टोकन भी निकाल सकता है।
4.2 एंड्रयू याओ का प्रमेय (1982) और क्रिप्टोग्राफिक रूप से सुरक्षित जनरेटर (CSPRNG)
क्रिप्टोग्राफी के लिए CSPRNG (Cryptographically Secure PRNG) अनिवार्य है, जो तीन सिद्धांतों पर आधारित है:
- अगले बिट की अप्रत्याशितता $\iff$ कम्प्यूटेशनल अविभेद्यता (याओ का प्रमेय 1982 / ब्लम-मिकाली): प्रथम $k$ बिट्स जानने वाला कोई भी बहुपद-समय हमलावर $\mathcal{A}$, $(k+1)$-वें बिट का अनुमान सिक्का उछालने ($1/2$) से बेहतर नहीं लगा सकता:
- फॉरवर्ड सीक्रेसी (Forward Secrecy / पश्चगामी प्रतिरोध): प्रत्येक आउटपुट के तुरंत बाद आंतरिक कुंजी को एकदिशीय फलन द्वारा मिटाकर बदल दिया जाता है (Fast-Key-Erasure), जिससे वर्तमान अवस्था लीक होने पर भी पुरानी कुंजियाँ सुरक्षित रहती हैं।
- बैकवर्ड सीक्रेसी (Backward Secrecy / भविष्यवाणी प्रतिरोध): ताज़ा हार्डवेयर एन्ट्रॉपी के निरंतर मिश्रण (Reseeding) से लीक के बाद भी भविष्य की सुरक्षा बहाल हो जाती है।
flowchart TD
subgraph Insecure ["सांख्यिकीय PRNG (LCG / MT19937 / Xoshiro)"]
StateM["आंतरिक अवस्था s_i (624 शब्द)"] -- "व्युत्क्रमणीय F2-रैखिक Tempering" --> OutM["आउटपुट r_i"]
OutM -- "untemper() 624 आउटपुट से पूरी अवस्था क्लोन करता है!" --> StateM
end
subgraph Secure ["क्रिप्टोग्राफिक CSPRNG (ChaCha20 / AES-CTR_DRBG)"]
Entropy["हार्डवेयर एन्ट्रॉपी स्रोत<br/>(थर्मल नॉइज़ / RDSEED)"] -- "नियमित Reseeding (Backward Secrecy)" --> StateC["256-बिट गुप्त कुंजी और काउंटर"]
StateC -- "एकदिशीय साइफ़र (ChaCha20 / AES)<br/>[उलटने में 2^256 संक्रियाएँ!]" --> OutC["क्रिप्टोग्राफिक यादृच्छिक धारा r_i"]
StateC -- "Fast-Key-Erasure Key' = PRF(Key)<br/>[Forward Secrecy!]" --> StateC_Next["नवीनीकृत कुंजी Key'"]
end
आधुनिक CSPRNG में ChaCha20-RNG (Linux कर्नेल, OpenBSD, Rust) और AES-CTR_DRBG (NIST SP 800-90A) या गुणनखंडन समस्या पर आधारित Blum-Blum-Shub ($x_{n+1} = x_n^2 \bmod M$) शामिल हैं। इसके विपरीत, 2006 में NIST द्वारा मानकीकृत दीर्घवृत्तीय वक्र जनरेटर Dual_EC_DRBG में NSA का क्लेप्टोग्राफिक बैकडोर छिपा था (जिसकी पुष्टि 2013 के स्नोडेन दस्तावेजों से हुई: $P = d \cdot Q$ का गुप्त असतत लघुगणक $d$ जानने वाला व्यक्ति केवल 32 बाइट आउटपुट से आंतरिक अवस्था निकालकर संपूर्ण TLS ट्रैफ़िक डिक्रिप्ट कर सकता था)।
| जनरेटर वर्ग | प्रतिनिधि एल्गोरिदम | अवस्था आकार | आवर्तकाल $P$ | BigCrush परीक्षण | क्रिप्टोग्राफिक सुरक्षा | मुख्य उपयोग |
|---|---|---|---|---|---|---|
| शास्त्रीय LCG | RANDU, C rand() | 32–64 बिट | $\le 2^{64}$ | विफल (हाइपरप्लेन) | असुरक्षित | केवल पुराने कोड में |
| आधुनिक सांख्यिकीय PRNG | MT19937, PCG64, Xoshiro256++ | 128 बिट – 2.5 KB | $2^{128} \sim 2^{19937}-1$ | उत्तीर्ण | असुरक्षित (624 आउटपुट / Z3) | मोंटे कार्लो, सिमुलेशन, गेम |
| क्रिप्टोग्राफिक (CSPRNG) | ChaCha20-RNG, AES-CTR_DRBG | 256–512 बिट | $\ge 2^{256}$ | 100% उत्तीर्ण | सुरक्षित (Forward/Backward Secret) | TLS/SSH कुंजियाँ, पासवर्ड, टोकन |
| भौतिक यादृच्छिक (TRNG) | थर्मल नॉइज़, ज़ेनर ब्रेकडाउन, रिंग ऑसिलेटर (RDSEED) | भौतिक सातत्य | अनावर्ती ($\infty$) | व्हाइटनिंग के बाद | सच्ची भौतिक एन्ट्रॉपी | CSPRNG सीडिंग और रीसीडिंग |
अध्याय 5: भौतिक जनरेटर (TRNG), मिन-एन्ट्रॉपी ($H_\infty$) और OS एन्ट्रॉपी पूल
CSPRNG का प्रारंभिक बीज हार्डवेयर ट्रू रैंडम नंबर जनरेटर (TRNG / HRNG) से आता है जो सूक्ष्म भौतिक हलचल को मापता है: प्रतिरोधकों में जॉनसन-नाइक्विस्ट थर्मल नॉइज़, ज़ेनर डायोड एवलांच ब्रेकडाउन का क्वांटम शॉट नॉइज़, और रिंग ऑसिलेटर फेज़ जिटर (Intel/AMD CPU में RDSEED/RDRAND निर्देश)। क्रिप्टोग्राफी (NIST SP 800-90B) में सबसे खराब स्थिति की अप्रत्याशितता को औसत शैनन एन्ट्रॉपी $H_1$ के बजाय मिन-एन्ट्रॉपी ($H_\infty$) से मापा जाता है:
कच्चे भौतिक शोर को वॉन न्यूमैन डीबायसिंग या क्रिप्टोग्राफिक हैश एक्सट्रैक्टर (Linux कर्नेल में BLAKE2s, Leftover Hash Lemma के तहत) द्वारा व्हाइटनिंग (Whitening) करके CSPRNG में भेजा जाता है।
आधुनिक Linux (5.6+) में /dev/random और /dev/urandom दोनों एक ही ChaCha20 कर्नेल CSPRNG का उपयोग करते हैं; डेवलपर्स को हमेशा getrandom(2) (या Python secrets, JS crypto.getRandomValues(), Rust OsRng/ThreadRng, Go crypto/rand) का उपयोग करना चाहिए। 2008 की डेबियन OpenSSL त्रासदी (CVE-2008-0166) — जहाँ Valgrind चेतावनी हटाने के लिए एक पंक्ति को कमेंट करने से दो वर्षों तक दुनिया भर में बनी सभी RSA/SSH कुंजियों की एन्ट्रॉपी केवल 15-बिट प्रोसेस ID ($32,768$ संभावित कुंजियाँ!) तक सिमट गई — और सोनी PlayStation 3 की ECDSA स्थैतिक नॉनस ($k$) विफलता (2010) यह अकाट्य नियम सिद्ध करती हैं: किसी भी क्रिप्टोग्राफिक प्रणाली की सुरक्षा कभी भी उसकी कुंजियाँ बनाने वाले रैंडम नंबर जनरेटर की एन्ट्रॉपी से अधिक नहीं हो सकती।
