
बिटकॉइन कुंजी एंट्रॉपी का शैक्षिक अध्ययन: कमज़ोर-RNG वॉलेट गणना (Milk Sad / CVE-2023-39910 श्रेणी) बनाम एक अच्छी कुंजी को ब्रूट-फोर्स करने की असंभवता।
बिटकॉइन कुंजी सुरक्षा वास्तव में कहाँ से आती है — और कहाँ से नहीं आती — इसका एक शैक्षिक अध्ययन। यह वास्तविक BIP39/BIP32 व्युत्पत्ति के इर्द-गिर्द निर्मित है, जिसमें दो प्रयोग हैं जो एक ही विचार के विपरीत छोरों पर स्थित हैं:
| प्रयोग | खोज स्थान | संभव? | यह क्या सिखाता है |
|---|---|---|---|
weak_entropy — कमजोर-RNG वॉलेट स्थान की गणना | 2³² (एक खराब RNG) | हाँ, दिनों में | एक वॉलेट उतना ही मज़बूत है जितनी उसके पीछे की एन्ट्रॉपी। |
blind_search — एक अच्छे कुंजी स्थान पर ब्रूट-फोर्स | 2¹⁶⁰ (एक अच्छा RNG) | नहीं, कभी नहीं | वास्तविक एन्ट्रॉपी के साथ, कुंजी स्थान भौतिक रूप से अखोजनीय है। |
पूरा मुद्दा इस विरोधाभास का है: कुंजियाँ खराब रैंडमनेस पर हमला करके चुराई जाती हैं, अच्छी रैंडमनेस की गणना को पीछे छोड़कर कभी नहीं। दोनों प्रयोग एक ही तरह के वास्तविक मेननेट पते व्युत्पन्न करते हैं, इसलिए एकमात्र चर एन्ट्रॉपी है।
यह रिपॉज़िटरी रक्षात्मक शिक्षा और सुरक्षा अनुसंधान के लिए है: यह समझने के लिए कि कमजोर-RNG वॉलेट बग (Milk Sad / CVE-2023-39910, 2018 का Trust Wallet एक्सटेंशन बग, और उनके जैसे अन्य) विनाशकारी क्यों थे, और एक सही ढंग से जनरेट की गई कुंजी पर ब्रूट-फोर्स करना क्यों नहीं है।
weak_entropy एक स्व-निहित सिंथेटिक स्थान की गणना करता है। इसका weak_entropy() भेद्यता वर्ग का एक जानबूझकर बनाया गया मॉडल है — एक 32-bit PRNG जो BIP39 को फीड करता है — न कि किसी वास्तविक वॉलेट के RNG की बाइट-सटीक प्रतिकृति। यह जो पते उत्पन्न करता है वे किसी के भी वास्तविक वॉलेट के अनुरूप नहीं हैं।blind_search आपके अपने नोड के विरुद्ध एक केवल-पठन शेषराशि जाँच है। यह कोई कुंजी व्युत्पन्न नहीं करता और कुछ खर्च नहीं कर सकता; इसका मुख्य मोड अंधी खोज की निरर्थकता को मापता है।इसे उन वॉलेट्स पर उपयोग करें जिन्हें आप नियंत्रित करते हैं, testnet पर, या सैंडबॉक्स के रूप में। इसे दूसरे लोगों के पैसे पर न लगाएँ।
केवल शिक्षा और अधिकृत सुरक्षा अनुसंधान के लिए। इसे केवल उन कुंजियों, वॉलेट्स और प्रणालियों पर उपयोग करें जिनके स्वामी आप हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। दूसरों के वॉलेट्स या प्रणालियों तक अनधिकृत पहुँच और डिजिटल परिसंपत्तियों की चोरी, तकनीकी साधनों की परवाह किए बिना, US CFAA (18 U.S.C. § 1030), UK Computer Misuse Act 1990, और EU Directive 2013/40/EU जैसे कानूनों के तहत अवैध है। "जैसा है" (as is), बिना वारंटी के प्रदान किया गया; लेखक दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करते। यह कानूनी सलाह नहीं है। पूर्ण शर्तें और उत्तरदायी प्रकटीकरण मार्गदर्शन: DISCLAIMER.md।
एक वॉलेट की सुरक्षा उस एन्ट्रॉपी से सीमित होती है जो उसके सीड में डाली गई थी, न कि आगे के चरणों में उपयोग होने वाले SHA-256 / PBKDF2 / secp256k1 की मज़बूती से।
BIP39 एन्ट्रॉपी को म्नेमोनिक में बदलता है, PBKDF2 इसे एक सीड में विस्तारित करता है, और BIP32 कुंजियों का एक वृक्ष व्युत्पन्न करता है। यह सब मज़बूत है। लेकिन इनमें से कोई भी एन्ट्रॉपी जोड़ता नहीं है — यदि सीड एक छोटे समुच्चय से लिया गया था, तो वॉलेट जो भी पता उत्पन्न कर सकता है वह गणनीय है, और कोई भी हैशिंग इसे छिपा नहीं सकती।
bitcoin-security/
├── bitcoin_security/ # the package
│ ├── derivation.py # shared core: BIP39 + BIP32 + P2PKH/WIF
│ ├── data/english.txt # BIP39 English wordlist (2048 words)
│ ├── weak_entropy/ # Experiment 1 — enumerable weak space
│ │ ├── enumerate.py # recovery demo + full-space dump
│ │ └── README.md
│ └── blind_search/ # Experiment 2 — futile brute-force search
│ ├── scan.py # UTXO-set balance scanner + odds
│ └── README.md
├── tests/ # offline test suites (no node/network)
│ ├── test_blind_search_addresses.py
│ └── test_blind_search_pipeline.py
├── docs/FINDINGS.md # benchmarks + exact full-space size derivation
├── pyproject.toml
├── requirements.txt
└── LICENSE
यह संरचना विचार को दर्शाती है: एक साझा derivation कोर, दो प्रयोग जो एक ही पता स्थान के बारे में विपरीत निष्कर्षों तक पहुँचने के लिए इसका उपयोग करते हैं।
pip install -r requirements.txt # runtime deps
# optional — installs the package + `bsec-enumerate` / `bsec-scan` commands:
pip install -e .
coincurve (native libsecp256k1) व्युत्पत्ति को ~5× तेज़ बनाता है लेकिन वैकल्पिक है — derivation.py समान आउटपुट के साथ pure-Python ecdsa पर वापस आ जाता है। यहाँ कुछ भी नेटवर्क को स्पर्श नहीं करता, सिवाय ऑप्ट-इन --check-balance फ्लैग और blind_search के (जिसे एक स्थानीय Bitcoin नोड चाहिए)।
सब कुछ रिपॉज़िटरी रूट से एक मॉड्यूल के रूप में चलता है; किसी स्थापना की आवश्यकता नहीं:
python3 -m bitcoin_security.weak_entropy --help
python3 -m bitcoin_security.blind_search --help
weak_entropy: कमजोर एन्ट्रॉपी गणनीय हैवॉलेट की BIP39 एन्ट्रॉपी के "यादृच्छिक" 16 बाइट्स वास्तव में एक 32-bit सीड से आते हैं। पूरी व्युत्पत्ति वास्तविक है और स्पेक वेक्टर्स के विरुद्ध सत्यापित है।
seed32 ──MT19937──▶ 16-byte entropy ──BIP39──▶ mnemonic ──PBKDF2(2048)──▶ 64-byte seed
│
address ◀──hash160──── pubkey ◀──BIP32 m/44'/0'/0'/0/0
# Recovery: derive a victim wallet from a weak seed, then recover its full
# mnemonic + private key knowing only the public address.
python3 -m bitcoin_security.weak_entropy
# Expand one seed into every form.
python3 -m bitcoin_security.weak_entropy --show 3571
# Materialize the whole 2**32 space to sharded, resumable files.
python3 -m bitcoin_security.weak_entropy --dump-all --out-dir space_dump --max-file-mb 1000
पंक्तियाँ न्यूनतम हैं (address <TAB> seed32) क्योंकि हर अन्य रूप seed32 का एक नियतात्मक फलन है, जिसे --show के साथ माँग पर पुनर्जनित किया जाता है। डंप शार्ड स्तर पर फिर से शुरू करने योग्य हैं (सत्यापित किया गया है कि वे सतत, अंतराल-रहित, डुप्लिकेट-रहित कवरेज पुनरुत्पादित करते हैं)। पूर्ण फ्लैग संदर्भ weak_entropy/README.md में।
पैमाने की चेतावनी। पूर्ण 2³² डंप ~196 GB (न्यूनतम) या ~1.05 TB (
--full) है और native बैकएंड के साथ भी दिनों का समय लेता है — देखेंdocs/FINDINGS.md। आपको लगभग कभी भी पूरी चीज़ की आवश्यकता नहीं होती; निरीक्षण के लिए एक सीमित हिस्सा ही डंप करें।
blind_search: आप एक अच्छी कुंजी पर ब्रूट-फोर्स नहीं कर सकतेscantxoutset के माध्यम से एक स्थानीय (pruning-OK) नोड के UTXO सेट पर एक वास्तविक, कार्यशील शेषराशि स्कैनर। इसका उद्देश्य शून्य परिणाम है: पता स्थान को आँख बंद करके खोजें, मापें कि आपको कुछ नहीं मिलता, और वह अंकगणित प्रिंट करें जो दिखाता है कि आपको हमेशा कुछ नहीं मिलेगा।
python3 -m bitcoin_security.blind_search --odds-only # just the math, no node
python3 -m bitcoin_security.blind_search --random 200000 --odds # search 200k random addrs, then the math
python3 -m bitcoin_security.blind_search --control # verify the pipeline finds known-funded addrs
परिणाम: स्थान 2¹⁶⁰ ≈ 1.46×10⁴⁸ है; ~55M पतों में शेषराशि है; इसलिए एक यादृच्छिक पते के वित्तपोषित होने की प्रायिकता ~3.8×10⁻⁴¹ है। एक अरब पते/सेकंड की गति पर भी आपको ~8×10²³ वर्ष प्रतीक्षा करनी पड़ेगी — ब्रह्मांड की आयु का ~61 ट्रिलियन गुना। यह हार्डवेयर की समस्या नहीं है: Landauer की सीमा के अनुसार, केवल 2¹⁶⁰ तक गिनती करना भी सूर्य की शेष ऊर्जा उत्पादन से अधिक है। नोड सेटअप blind_search/README.md में।
दोनों प्रयोग एक ही तरह का पता व्युत्पन्न करते हैं। एकमात्र अंतर उस समुच्चय का आकार है जिससे सीड लिया गया था:
वह अंतर — 128 बिट — पूरी बाज़ी है। इस वर्ग की हर वास्तविक चोरी उसी अंतराल में हुई थी।
python3 tests/test_blind_search_addresses.py # BIP-173/350/380 address vectors
python3 tests/test_blind_search_pipeline.py # scan pipeline, RPC stubbed
python3 -m bitcoin_security.derivation # derivation self-test (spec vectors)
पूर्ण विवरण, विधियाँ और मशीन विनिर्देश docs/FINDINGS.md में।
ecdsa को coincurve (libsecp256k1) से बदलने पर Apple M3 Max पर प्रति-वॉलेट व्युत्पत्ति 3.02 ms → 0.591 ms (~5.1×) हो गई; शेष निचली सीमा 0.463 ms/वॉलेट पर PBKDF2-HMAC-SHA512 ×2048 है।--full, seed32 अंकों के लिए एक सटीक बंद रूप और मापी गई औसत पता लंबाई से।bx seed (समय से सीड किया गया 32-bit MT19937)। वास्तविक धन चोरी हुआ। https://milksad.info/MIT — देखें LICENSE। उपयोग शर्तें और उत्तरदायी प्रकटीकरण मार्गदर्शन: DISCLAIMER.md। रिपोर्टिंग: SECURITY.md।