Random Number Generator, यानी RNG, संख्यात्मक मान बनाने वाला उपकरण या प्रोग्राम है। वॉलेट को क्रिप्टोग्राफ़िक रूप से सुरक्षित जनरेटर चाहिए: पुराने परिणाम या बनाने का समय जानकर भी हमलावर व्यावहारिक रूप से नए रहस्य का अनुमान न लगा सके। इसमें एंट्रॉपी के स्रोत, एल्गोरिदम और ऐप में उनके सही इस्तेमाल की भूमिका होती है। यहाँ एंट्रॉपी का मतलब परिणाम को लेकर हमलावर के लिए बची अनिश्चितता है।
मान लीजिए कोई वॉलेट अपना रहस्य केवल वर्तमान समय से बनाता है। परिणाम जटिल दिख सकता है, लेकिन वॉलेट बनने का समय जानने वाले को बहुत कम संभावनाएँ आज़मानी पड़ेंगी। RFC 4086 ऐसे ही अनुमान लगाने योग्य इनपुट से सावधान करता है। इसलिए गेम या सिमुलेशन के लिए अच्छा जनरेटर ज़रूरी नहीं कि कुंजियों के लिए भी ठीक हो। अच्छा सांख्यिकीय वितरण भी अपने आप सुरक्षा का प्रमाण नहीं है। [2]
आम तौर पर कई हिस्से साथ काम करते हैं। स्रोत अनिश्चितता देता है, उसके आउटपुट को ज़रूरत के अनुसार संसाधित किया जाता है और क्रिप्टोग्राफ़िक नियतात्मक जनरेटर एक गुप्त आंतरिक अवस्था से आगे के मान बनाता है। नियतात्मक का अर्थ है कि आंतरिक अवस्था और इनपुट समान हों, तो परिणाम भी समान होगा। इसलिए उस अवस्था को गुप्त रखना ज़रूरी है। ऐप सिस्टम के इंटरफ़ेस से ये मान माँगता है। इसलिए लौटाए गए हर बिट के लिए नया भौतिक मापन आवश्यक नहीं है। NIST SP 800-90C बताता है कि 90A के जनरेटरों को 90B के स्रोतों के साथ कैसे जोड़ा जाता है। [1]
BIP39 में वॉलेट बहाल करने का आधार पहले शब्द के बनने से पहले तैयार होता है: जनरेटर 128 से 256 बिट प्रारंभिक एंट्रॉपी बनाता है। बिट सूचना की बुनियादी इकाई है, शून्य या एक; ज़रूरी यह है कि हमलावर बनी हुई श्रृंखला का अनुमान न लगा सके। फिर चेकसम जोड़ा जाता है, जो लिखकर उतारने की कुछ गलतियाँ पकड़ने में मदद करने वाला छोटा मान है। पूरी जानकारी को रिकवरी शब्दों में बदला जाता है। आप इनके साथ passphrase, यानी अतिरिक्त गुप्त टेक्स्ट भी जोड़ सकते हैं। PBKDF2 फ़ंक्शन इन इनपुट से 512-बिट seed निकालता है। यह वह गुप्त शुरुआती मान है जिससे वॉलेट की कुंजियाँ बनती हैं। न लंबा आउटपुट और न चेकसम कम पड़ी यादृच्छिकता जोड़ता है। इसलिए रिकवरी शब्द खुद न चुनें। [6]
उपकरण को ऐसी खराबी पकड़नी चाहिए जिसमें शोर का स्रोत एक ही मान दोहराने लगे। इसलिए NIST SP 800-90B शुरुआत में और संचालन के दौरान स्रोत की जाँच तथा मिली खराबियों को सँभालने की माँग करता है। त्रुटि को अनदेखा करके आउटपुट को जाँची हुई यादृच्छिकता बताना ठीक नहीं है। ये जाँचें स्रोत की निगरानी करती हैं; पूरे वॉलेट की सुरक्षा की गारंटी नहीं देतीं। [3]
नियतात्मक जनरेटर आगे के परिणाम निकालने के लिए एक आंतरिक अवस्था रखता है। NIST SP 800-90A उसका निर्माण, मानों का उत्पादन, नई एंट्रॉपी जोड़ना (reseed) और समापन बताता है। अवस्था लीक होने पर केवल एक और कॉल से सुरक्षा बहाल हो जाए, यह ज़रूरी नहीं है। इसके लिए सही प्रक्रिया और हमलावर से अनजान नई एंट्रॉपी चाहिए। इससे पहले ही उजागर हो चुकी कुंजियाँ हमलावर के हाथ से नहीं निकल जातीं। [7]
आपको अपना RNG प्रोग्राम करने की ज़रूरत नहीं है। देखें कि वॉलेट के उस विशेष संस्करण में मान बनाने और त्रुटियाँ सँभालने का तरीका दर्ज है या नहीं। केवल “हार्डवेयर” या “ऑफ़लाइन” लिखा होना इसका प्रमाण नहीं है। समीक्षा में स्रोत, एल्गोरिदम, आरंभीकरण और ऐप का इंटरफ़ेस शामिल होने चाहिए। सही ढंग से बनाया गया रहस्य भी असुरक्षित हो जाता है यदि आप बाद में उसका बैकअप बता दें। [1] [2]
Linux का getrandom() सामान्यतः urandom के आरंभीकरण का इंतज़ार करता है; GRND_NONBLOCK के साथ वह इंतज़ार करने के बजाय EAGAIN लौटा सकता है। आरंभीकरण के बाद urandom से अधिकतम 256 बाइट माँगने पर सिग्नल से बाधित हुए बिना पूरी मात्रा मिलने की गारंटी है। बड़े अनुरोधों पर यह गारंटी नहीं है। प्रोग्राम को वापसी की स्थिति और वास्तव में मिले बाइटों की संख्या जाँचनी चाहिए। [4]
Web Crypto का getRandomValues() समर्थित पूर्णांक ऐरे को क्रिप्टोग्राफ़िक रूप से मज़बूत मानों से भरता है। 65536 बाइट से अधिक होने पर QuotaExceededError आता है। समर्थित एल्गोरिदम की कुंजियों के लिए विनिर्देश generateKey() सुझाता है; यह हर तरह का बिटकॉइन वॉलेट बनाने वाला उपकरण नहीं है। API का सही इस्तेमाल भी पेज की विश्वसनीयता का प्रमाण नहीं है: उसका कोड बने हुए रहस्य तक पहुँच सकता है। [5]
पूरी तस्वीर के लिए इस प्रविष्टि के साथ यह भी पढ़ें Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. इस प्रविष्टि का उल्लेख यहाँ भी है CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.