Bitcoin-Core
蠻力比特幣地址-我知道單詞+公共地址但不知道順序
我有一長串 12 字 BIP39 種子的 100 萬多個排列。我怎樣才能在比特幣地址上全部嘗試?
編輯:我知道地址和 12 個單詞,但我不知道單詞的順序
這樣做需要三件事:
- 種子詞的排列
- 您嘗試查找的地址
- 該地址的派生路徑。
在這種特定情況下,地址是 reddit 上的這個謎題導致的地址,所以我們假設派生路徑是
m/49'/0'/0'/0/0
這是一個簡單的 nodejs 腳本,使用 bitcoinjs-lib 從文件中讀取種子,驗證它們,然後針對您正在搜尋的地址嘗試第一個地址。您可以通過將輸入文件分成幾部分並在每個文件中執行一次來並行化它。
請注意,12 個單詞意味著大約十億個組合。雖然這在今天的計算能力下是可行的,但仍然需要很長時間。一些快速測試表明,在我的筆記型電腦上大約需要 4 天,儘管您可以通過使用更快的語言或併行化來加速它。
var bip39 = require('bip39'); var bitcoin = require('bitcoinjs-lib') var lineReader = require('readline').createInterface({ input: require('fs').createReadStream('addresses.txt') }); var ctr = 1; lineReader.on('line', function (line) { if (ctr%100 == 0) { console.log("Processing #" + ctr); } if (bip39.validateMnemonic(line)) { var roothex = bip39.mnemonicToSeedHex(line); var rootnode = bitcoin.HDNode.fromSeedHex(roothex); var basechild = rootnode.deriveHardened(49) .deriveHardened(0) .deriveHardened(0) .derive(0); for (var i = 0; i < 3; i++) { var child = basechild.derive(i); var keyhash = bitcoin.crypto.hash160(child.getPublicKeyBuffer()) var scriptSig = bitcoin.script.witnessPubKeyHash.output.encode(keyhash) var addressBytes = bitcoin.crypto.hash160(scriptSig) var outputScript = bitcoin.script.scriptHash.output.encode(addressBytes) var address = bitcoin.address.fromOutputScript(outputScript) if (address == "3CcxyPhyvyc3S9UuPfu42GNZLvVVV11Uk8") { console.log("Found seed! " + line) } } } ctr++; });
為此,您需要安裝 nodejs 和 bitcoinjs-lib。