मुख्य सामग्री पर जाएं

क्रिप्टोकरेंसी में एंट्रॉपी और रैंडमनेस: यह क्यों महत्वपूर्ण है

प्रत्येक क्रिप्टोकरेंसी निजी कुंजी, प्रत्येक बीज वाक्यांश, और आप जो भी पता उपयोग करते हैं वह एक यादृच्छिक संख्या से शुरू होता है। आपके संपूर्ण क्रिप्टो पोर्टफोलियो की सुरक्षा एक धारणा पर निर्भर करती है: वह संख्या सत्यिक रूप से अप्रत्याशित थी। यदि वह यादृच्छिक संख्या जनरेटर जिसने आपकी कुंजी तैयार की थी, कमजोर, पूर्वाग्रहपूर्ण या पूर्वानुमेय था, तो आपके फंड चोरी हो सकते हैं — क्रिप्टोग्राफी को तोड़कर नहीं, बल्कि कुंजी का अनुमान लगाकर।

यह गाइड बताता है कि एंट्रॉपी का अर्थ क्रिप्टोग्राफिक संदर्भ में क्या है, यादृच्छिक संख्या जनरेटर कैसे काम करते हैं, ऐतिहासिक रूप से क्या गलत हुआ है जब रैंडमनेस विफल हुई है, और आप कैसे सुनिश्चित कर सकते हैं कि आपकी कुंजी पीढ़ी सुरक्षित है।

एंट्रॉपी क्या है?

सूचना सिद्धांत में, एंट्रॉपी डेटा में अनिश्चितता या अप्रत्याशितता की मात्रा को मापता है। क्रिप्टोग्राफी में, एंट्रॉपी परिमाण करता है कि किसी मान में कितनी बिट्स की वास्तविक रैंडमनेस है।

एक 256-बिट निजी कुंजी में 256 बिट्स की एंट्रॉपी होनी चाहिए — यानी एक हमलावर को औसतन इसे खोजने के लिए 2^255 अनुमान लगाने पड़ेंगे (खोज स्थान का आधा, औसत पर)। यदि कुंजी केवल 32 बिट्स की वास्तविक एंट्रॉपी के साथ तैयार की गई थी (क्योंकि RNG खराब था), तो हमलावर को केवल लगभग 2^31 अनुमान की आवश्यकता है — लगभग 2 बिलियन — जिसे एक आधुनिक कंप्यूटर मिनटों में पूरा कर सकता है।

एंट्रॉपी को मापना

एंट्रॉपी को बिट्स में मापा जाता है। एक यादृच्छिक चर X की एंट्रॉपी है:

H(X) = -sum(p(x) * log2(p(x))) for all possible values x

एक समान रूप से यादृच्छिक 256-बिट संख्या के लिए:

  • प्रत्येक बिट के 0 या 1 होने की संभावना 0.5 है।
  • एंट्रॉपी = 256 बिट्स (इस आकार के लिए अधिकतम)।

एक पूर्वाग्रहपूर्ण जनरेटर के लिए जहां प्रत्येक बिट के 1 होने की संभावना 0.7 है:

  • प्रति बिट एंट्रॉपी = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 बिट्स।
  • 256 बिट्स के लिए कुल एंट्रॉपी = 225.5 बिट्स (आदर्श से 11.9% कम)।

यहां तक कि छोटे पूर्वाग्रह भी कई बिट्स पर बढ़ते हैं और प्रभावी सुरक्षा स्तर को महत्वपूर्ण रूप से कम कर सकते हैं।

BIP-39 संदर्भ में एंट्रॉपी

आनेमोनिक लंबाईएंट्रॉपीसुरक्षा स्तर10^12/sec पर ब्रूट-फोर्स
12 शब्द128 बिट्स128-बिट~10^19 वर्ष
15 शब्द160 बिट्स160-बिट~10^28 वर्ष
18 शब्द192 बिट्स192-बिट~10^38 वर्ष
24 शब्द256 बिट्स256-बिट~10^57 वर्ष

ये संख्याएं मानती हैं कि एंट्रॉपी सत्यिक रूप से समान है। यदि RNG खराब है, तो वास्तविक सुरक्षा स्तर नाटकीय रूप से कम हो सकता है।

यादृच्छिक संख्या जनरेटर के प्रकार

सच्चे यादृच्छिक संख्या जनरेटर (TRNG)

TRNGs भौतिक घटनाओं को नमूना लेते हैं जो क्वांटम स्तर पर अंतर्निहित रूप से अप्रत्याशित हैं:

  • थर्मल शोर — प्रतिरोधकों में यादृच्छिक वोल्टेज में उतार-चढ़ाव जो इलेक्ट्रॉनों के थर्मल आंदोलन के कारण होता है।
  • शॉट शोर — करंट में यादृच्छिक उतार-चढ़ाव इलेक्ट्रॉन प्रवाह की असतत प्रकृति के कारण।
  • रेडियोएक्टिव क्षय — व्यक्तिगत क्षय घटनाओं का समय मौलिक रूप से अप्रत्याशित है।
  • वायुमंडलीय शोर — बिजली और अन्य वायुमंडलीय प्रक्रियाओं से रेडियो-आवृत्ति शोर।

Ledger और Trezor जैसे हार्डवेयर वॉलेट ऑन-चिप TRNGs का उपयोग करते हैं। ये भौतिक शोर स्रोतों को नमूना लेते हैं और आउटपुट को व्हाइटनिंग और स्वास्थ्य परीक्षणों के माध्यम से संशोधित करते हैं।

लाभ: भौतिकी से सच्ची रैंडमनेस; कोई नियतात्मक स्थिति नहीं जो भविष्यवाणी की जा सकती है। नुकसान: हार्डवेयर-आश्रित; शोर स्रोत खराब होने पर चुप रहकर विफल हो सकता है; थ्रूपुट सीमित हो सकता है।

क्रिप्टोग्राफिक रूप से सुरक्षित छद्म-यादृच्छिक संख्या जनरेटर (CSPRNG)

एक CSPRNG एक नियतात्मक एल्गोरिथ्म है जो पर्याप्त रूप से यादृच्छिक बीज दिए जाने पर आउटपुट तैयार करता है जो सच्ची रैंडमनेस से अभेद्य है:

  • Linux: /dev/urandom (ChaCha20 या समान सिफर का उपयोग करता है, हार्डवेयर एंट्रॉपी से बीजित)।
  • macOS: /dev/urandom (arc4random, हार्डवेयर एंट्रॉपी से बीजित)।
  • Windows: BCryptGenRandom (CNG प्रदाता)।
  • वेब ब्राउज़र: crypto.getRandomValues() (OS CSPRNG को संदर्भित करता है)।
  • Python: os.urandom() या secrets मॉड्यूल।
  • Node.js: crypto.randomBytes()

लाभ: तेज़; अच्छी तरह से अध्ययन किए गए एल्गोरिदम; सभी प्लेटफॉर्म पर उपलब्ध। नुकसान: केवल प्रारंभिक बीज एंट्रॉपी जितना मजबूत; नियतात्मक — यदि आंतरिक स्थिति ज्ञात है, तो सभी भविष्य के आउटपुट पूर्वानुमेय हैं।

गैर-क्रिप्टोग्राफिक PRNGs (कुंजी के लिए कभी भी उपयोग न करें)

अधिकांश प्रोग्रामिंग भाषाओं में मानक लाइब्रेरी यादृच्छिक कार्य सांख्यिकीय अनुकरण के लिए डिज़ाइन किए गए हैं, क्रिप्टोग्राफी के लिए नहीं:

  • Python: random.random() (मर्सेनने ट्विस्टर — नियतात्मक, 624 आउटपुट से पुनः प्राप्त करने योग्य स्थिति)।
  • JavaScript: Math.random() (V8 में xorshift128+ — पूर्वानुमेय)।
  • C: rand() (रैखिक सर्वांगसम जनरेटर — तुच्छ रूप से पूर्वानुमेय)।
  • Java: java.util.Random (रैखिक सर्वांगसम — पूर्वानुमेय)।

इन जनरेटर में कम एंट्रॉपी, कम अवधि, और पूर्वानुमेय स्थिति है। कुंजी पीढ़ी के लिए उनका उपयोग करना कोई रैंडमनेस का उपयोग न करने के बराबर है। इन कार्यों के साथ निजी कुंजी या बीज वाक्यांश कभी न बनाएं।

रैंडमनेस की ऐतिहासिक विफलताएं

Android SecureRandom बग (2013)

अगस्त 2013 में, Android के SecureRandom कार्यान्वयन में एक महत्वपूर्ण खामी की खोज की गई। Java PRNG को कुछ Android उपकरणों पर सही तरीके से बीजित नहीं किया गया था, जिससे कई Bitcoin वॉलेट ऐप्स एक पूर्वानुमेय स्थिति से निजी कुंजियां तैयार कर रहे थे। एक हमलावर ने इसका दुरुपयोग करके लगभग 55 BTC चोरी किए। बग ने ECDSA हस्ताक्षर nonce पीढ़ी को प्रभावित किया — एक ही nonce दो बार का उपयोग करने से दो हस्ताक्षरों से निजी कुंजी की गणना की जा सकती है।

"ब्लॉकचेन डाकू" (2019)

सुरक्षा शोधकर्ता Adrian Bednarek ने खोज की कि वॉलेट तुच्छ रूप से कमजोर निजी कुंजियों के साथ तैयार किए गए थे — 1, 2, 3, या सरल शब्दकोश शब्दों को एक बार हैश किए गए कुंजियां। एक हमलावर ने कम-एंट्रॉपी कुंजियों को व्यवस्थित रूप से एनमेरेट किया और सत्यापित किया कि क्या उन्होंने फंड रखे थे, वर्षों तक 45,000 ETH से अधिक जमा करते हुए।

कुंजी उदाहरण जो खाली किए गए:

  • निजी कुंजी 0x0000000000000000000000000000000000000000000000000000000000000001 (संख्या 1)
  • सामान्य पासवर्ड और वाक्यांशों से प्राप्त निजी कुंजियां

मिल्क सैड कमजोरी (2023)

libbitcoin-explorer (bx) टूल का seed कमांड मर्सेनने ट्विस्टर का उपयोग करता था जिसे केवल 32 बिट्स की सिस्टम समय से बीजित किया गया था। इसका मतलब था कि इस टूल के साथ तैयार की गई सभी कुंजियों में अधिकतम 32 बिट्स की एंट्रॉपी थी — लगभग 4.3 बिलियन संभावनाएं। हमलावरों ने इन कुंजियों को ब्रूट-फोर्स किया और फंड चोरी किए।

Debian OpenSSL कमजोर कुंजी बग (2008)

एक Debian रखरखाव कर्ता ने गलती से एक पंक्ति हटा दी जो OpenSSL के यादृच्छिक संख्या जनरेटर को एंट्रॉपी प्रदान करती थी। दो वर्षों (2006-2008) के लिए, Debian और Ubuntu सिस्टम पर तैयार की गई प्रत्येक क्रिप्टोग्राफिक कुंजी में प्रक्रिया ID से केवल 15 बिट्स की एंट्रॉपी थी, जो अधिकतम 32,767 अद्वितीय कुंजियां तैयार करती थी। इस अवधि के दौरान प्रभावित सिस्टम पर तैयार की गई सभी SSH कुंजियां, SSL प्रमाणपत्र, और कोई भी क्रिप्टोकरेंसी कुंजियां समझौता की गई थीं।

सीखे गए पाठ

  1. सत्यापन के बिना एंट्रॉपी के किसी भी एकल स्रोत पर कभी भी विश्वास न करें।
  2. छोटी कार्यान्वयन त्रुटियां एंट्रॉपी को विनाशकारी रूप से कम कर सकती हैं।
  3. हमलावर सक्रिय रूप से कमजोर रैंडमनेस का दुरुपयोग करते हैं — यह सैद्धांतिक नहीं है।
  4. एंट्रॉपी-महत्वपूर्ण संचालन के लिए ओपन-सोर्स, ऑडिट किया गया कोड आवश्यक है।

विस्तार में एंट्रॉपी स्रोत

ऑपरेटिंग सिस्टम एंट्रॉपी पूल

आधुनिक ऑपरेटिंग सिस्टम कई स्रोतों से खिलाए गए एंट्रॉपी पूल को बनाए रखते हैं:

  • इंटरप्ट समय — हार्डवेयर इंटरप्ट के समय (कीबोर्ड, माउस, डिस्क, नेटवर्क) अप्रत्याशित इनपुट प्रदान करता है।
  • डिस्क I/O समय — डिस्क रीड/राइट संचालन का सटीक समय मैकेनिकल और इलेक्ट्रॉनिक कारकों के कारण भिन्न होता है।
  • हार्डवेयर RNG — आधुनिक CPUs (Intel RDRAND, AMD) में ऑन-चिप यादृच्छिक संख्या जनरेटर शामिल हैं।
  • बूट-समय एंट्रॉपी — कुछ सिस्टम बूट्स के आर-पार एंट्रॉपी सहेजते हैं (Linux पर /var/lib/systemd/random-seed)।

OS इन स्रोतों को क्रिप्टोग्राफिक आदिमों का उपयोग करके एंट्रॉपी पूल में मिलाता है, फिर अपने CSPRNG को बीजित करने के लिए पूल का उपयोग करता है। आधुनिक Linux कर्नेल (5.18+) पर, /dev/urandom बूट में पर्याप्त एंट्रॉपी एकत्रित होने तक ब्लॉक करेगा, फिर कभी भी ब्लॉक नहीं करेगा।

ब्राउज़र एंट्रॉपी (crypto.getRandomValues)

जब आप SafeSeed जैसे वेब-आधारित टूल का उपयोग करते हैं, तो ब्राउज़र का crypto.getRandomValues() API का उपयोग किया जाता है। यह ऑपरेटिंग सिस्टम के CSPRNG को संदर्भित करता है:

  • Chrome: OS CSPRNG को संदर्भित करता है (BoringSSL)।
  • Firefox: OS CSPRNG को संदर्भित करता है (NSS)।
  • Safari: OS CSPRNG को संदर्भित करता है (CommonCrypto)।

यह कुंजी पीढ़ी के लिए सुरक्षित माना जाता है, बशर्ते अंतर्निहित OS सुरक्षित हो। मुख्य चिंता एक ऐसे वातावरण में चलना है जहां OS CSPRNG समझौता किया जा सकता है (उदाहरण के लिए, अपर्याप्त एंट्रॉपी स्रोतों वाली वर्चुअल मशीन, या समझौता किया गया ऑपरेटिंग सिस्टम)।

हार्डवेयर वॉलेट एंट्रॉपी

हार्डवेयर वॉलेट ऑन-चिप सच्चे यादृच्छिक संख्या जनरेटर का उपयोग करते हैं:

  • Ledger (सुरक्षित तत्व ST33): ST33 चिप के TRNG का उपयोग करता है, जो एनालॉग शोर को नमूना लेता है। आउटपुट उपयोग से पहले NIST SP 800-90B स्वास्थ्य परीक्षणों को पास करता है।
  • Trezor: STM32 चिप के हार्डवेयर RNG का उपयोग करता है। Trezor उपयोगकर्ता-प्रदान किए गए पासा रोल एंट्रॉपी में मिश्रण का भी समर्थन करता है।
  • Coldcard: ATECC608A सुरक्षित तत्व के TRNG और MCU के हार्डवेयर RNG दोनों का उपयोग करता है, दोनों स्रोतों को मिलाता है।

पासा रोल एंट्रॉपी

मैनुअली पासा रोल करना सबसे पारदर्शी एंट्रॉपी पीढ़ी विधि है:

  • एक न्यायसंगत छह-पक्षीय मरता है log2(6) = 2.585 बिट्स की एंट्रॉपी प्रति रोल तैयार करता है।
  • 100 रोल लगभग 258.5 बिट्स की एंट्रॉपी तैयार करते हैं — 24-शब्द बीज वाक्यांश के लिए पर्याप्त।
  • उपयोगकर्ता रैंडमनेस को भौतिक रूप से सत्यापित कर सकता है (न्यायसंगत पासा, न्यायसंगत रोल, कोई हेराफेरी नहीं)।

पासा न्यायसंगतता सत्यापित करना:

  • कैसीनो-ग्रेड सटीक पासा का उपयोग करें (तीव्र किनारे, गोल नहीं)।
  • एक कठोर, समतल सतह पर एक बैकस्टॉप के साथ रोल करें।
  • पासा न "रखें" — उन्हें स्वतंत्र रूप से घूमने दें।
  • प्रत्येक परिणाम को तुरंत और क्रमिक रूप से रिकॉर्ड करें।
SafeSeed टूल

SafeSeed बीज वाक्यांश जनरेटर आपको अपनी स्वयं की एंट्रॉपी (जैसे पासा रोल परिणाम) इनपुट करने की अनुमति देता है ताकि एक BIP-39 बीज वाक्यांश तैयार किया जा सके। यह आपको रैंडमनेस स्रोत सत्यापित करते हुए टूल के सही BIP-39 कार्यान्वयन से लाभान्वित होने देता है। अधिकतम सुरक्षा के लिए टूल को ऑफलाइन उपयोग करें — हमारी ऑफलाइन कुंजी पीढ़ी गाइड देखें।

रैंडमनेस को परीक्षण और सत्यापित करना

NIST सांख्यिकीय परीक्षण सुइट

NIST SP 800-22 यादृच्छिक संख्या जनरेटर का मूल्यांकन करने के लिए परीक्षणों का एक बैटरी परिभाषित करता है:

  • आवृत्ति परीक्षण — क्या 0s और 1s की लगभग बराबर संख्याएं हैं?
  • ब्लॉक आवृत्ति परीक्षण — क्या बिट्स के उप-ब्लॉक लगभग समान रूप से वितरित हैं?
  • रन परीक्षण — क्या लगातार समान बिट्स (रन) की अनुमानित लंबाई के हैं?
  • सबसे लंबा रन परीक्षण — क्या सबसे लंबा रन अपेक्षित सीमा के भीतर है?
  • मैट्रिक्स रैंक परीक्षण — क्या बाइनरी मैट्रिक्स रैंक अपेक्षित वितरण का पालन करते हैं?
  • वर्णक्रमीय परीक्षण — क्या बिट अनुक्रम के DFT अपेक्षित गुण दिखाते हैं?

ये परीक्षण पूर्वाग्रह और पैटर्न का पता लगा सकते हैं लेकिन एक जनरेटर सुरक्षित है यह साबित नहीं कर सकते। वे केवल विफलताओं का पता लगा सकते हैं।

Dieharder परीक्षण सुइट

एक अधिक व्यापक सांख्यिकीय परीक्षण बैटरी जिसमें मूल Diehard परीक्षण और अतिरिक्त परीक्षण शामिल हैं। Linux पर ओपन-सोर्स सॉफ़्टवेयर के रूप में उपलब्ध।

उपयोगकर्ताओं के लिए व्यावहारिक सत्यापन

अधिकांश उपयोगकर्ता NIST परीक्षण सुइट नहीं चला सकते हैं। व्यावहारिक सत्यापन चरण:

  1. स्रोत सत्यापन — क्या टूल crypto.getRandomValues(), os.urandom(), या हार्डवेयर RNG का उपयोग कर रहा है? स्रोत कोड जांचें।
  2. क्रॉस-पीढ़ी परीक्षण — कई बीज वाक्यांश तैयार करें और सत्यापित करें कि वे हर बार अलग हैं।
  3. एंट्रॉपी डिस्प्ले — कु