# 如何用随机打乱顺序的12个助记词生成指定钱包私钥|NodeJS **Published by:** [dapaopao](https://paragraph.com/@dapaopao/) **Published on:** 2022-11-05 **URL:** https://paragraph.com/@dapaopao/12-nodejs ## Content 前段时间参加了一个游戏活动,给出12个助记词但是打乱顺序,钱包里有1个Eth,FCFS。 在没有任何提示的情况下会有12!(479001600)种可能。 这不就是全排列吗!一、准备工作创建一个目录然后初始化项目npm init 安装yarnnpm 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。。 如有任何问题欢迎来沟通交流,关注推特不定期更新。 https://twitter.com/dapaopao_eth ## Publication Information - [dapaopao](https://paragraph.com/@dapaopao/): Publication homepage - [All Posts](https://paragraph.com/@dapaopao/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@dapaopao): Subscribe to updates - [Twitter](https://twitter.com/dapaopao_eth): Follow on Twitter