如何用随机打乱顺序的12个助记词生成指定钱包私钥|NodeJS
November 5th, 2022

前段时间参加了一个游戏活动,给出12个助记词但是打乱顺序,钱包里有1个Eth,FCFS。

在没有任何提示的情况下会有12!(479001600)种可能。

这不就是全排列吗!

一、准备工作

创建一个目录然后初始化项目

npm init

安装yarn

npm install -g yarn

安装依赖模块

yarn add bip39 ethereum-hdwallet

二、代码部分

创建index.js文件

导入模块

var fs = require("fs")
const bip39 = require('bip39')
const HDWallet = require('ethereum-hdwallet');

配置参数

//计数器
var count = 0;
//已知的12个助记词
var arrtemp = ['cluster', 'violin', 'cart', 'steel', 'crouch', 'olive', 'water', 'pass', 'lab', 'father', 'until', 'exercise'];
//需要对比的钱包地址
var create_address = '0x1c5ea7f3a722ea2606cfbd4d6b3aaec488906553'.toLowerCase();

实现部分

//全排列 非递归 求模算法
async function perm(arr) {  
    var result = new Array(arr.length);  
    var fac = 1;  
    for (var i = 2; i <= arr.length; i++)  
        fac *= i;  
    for (index = 0; index < fac; index++) {  
        var t = index;  
        for (i = 1; i <= arr.length; i++) {  
            var w = t % i;  
            for (j = i - 1; j > w; j--)  
                result[j] = result[j - 1];  
            result[w] = arr[i - 1];  
            t = Math.floor(t / i);  
        }  

		//console.log(result); 
		var returnFlag = await getAddress(result);
		if(returnFlag)
		{
                        //创建文件保存正确的助记词顺序
			fs.writeFile('keyword.txt', result.toString(), function(err, fd) {});
			console.log("Find Key:"+result.toString());
			console.log("total", count);
			process.exit(1);
		}
    }  
	console.log("total", count);
}  

//用打乱生成的助记词生成公私钥、地址
async function getAddress(inputarr) {
    var flag = false;
    var temp = inputarr;
    var str = '';
    for (var i = 0; i < temp.length; i++) {
      str += temp[i] + ' ';
    }
    mnemonic = str;

    var seed = await bip39.mnemonicToSeed(mnemonic); //生成种子
    //console.log(seed)
    var hdwallet = HDWallet.fromSeed(seed);
    for (var i = 0; i < 1; i++) { // 用同一个种子生成多个地址
      count++;

      //console.log('=============地址' + (i + 1) + '=================')

      var key = hdwallet.derive("m/44'/60'/0'/0/" + i); // 地址路径的最后一位设置为循环变量
	  //console.log(create_address);
      var EthAddress = '0x' + key.getAddress().toString('hex'); //地址
      if (EthAddress == create_address) {
        console.log("PrivateKey = " + key.getPrivateKey().toString('hex')); // 私钥
        console.log("PublicKey = " + key.getPublicKey().toString('hex')); // 公钥
        console.log('ETH Address = ' + EthAddress);
        flag = true;
      }
      else {
        console.log('=============address count:' + (count) + ' =================');
        console.log('=============address:' + EthAddress + ' =================');
		flag = false;
      }

    }
	
	return flag;

}

perm(arrtemp);

最后执行

node index.js

效果如下

如果匹配到结果会在当前文件夹下生成keyword.txt文件来保存结果。

三、总结

这代码可以改进的还有很多,比如用多线程来执行,会快很多。

最后一提当我还在运行的时候,已经被某个人拿走了那1ETH。。

如有任何问题欢迎来沟通交流,关注推特不定期更新。

Subscribe to dapaopao
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from dapaopao

Skeleton

Skeleton

Skeleton