如何帮币友找回了1万个EOS
作者:网友投稿 时间:2018-06-03 21:05

一位朋友在去年9月4日的时候参与ico.info,网站关闭前夕把1万个EOS提到imtoken钱包,备份了keystore文件,可是不知道还要备份密码,现在只能看到钱包里面的币,可惜取不出来。6月1日EOS主网即将上线,如果再想不起来密码,这些EOS就将永远沉睡在以太坊的区块链里。

区块链的世界里私钥就是一切,以太坊的keystore相当于加密过的私钥,它采用了对称性加密算法,如果不知道密码的特征,用普通的电脑穷举所有的8位字母和数字的排列组合,也得花费相当长的时间。
我自告奋勇揽下了这项任务,因为我知道每个人设置密码时都有一些特殊的习惯,并且很少使用超过8位的密码,对于这样的情况,暴力搜索的范围会大幅缩小,仍有一线希望找回密码。
KeyStore加密原理
以前只知道keystore把私钥加密处理后保存为一个文本文件,但背后的技术细节并没关注。这次拿到朋友的keystore文件之后,马上开始研究keystore的加密存储方式,网上的一篇文章比较详细地介绍了keystore的加密存储原理(https://ethfans.org/posts/what-is-an-ethereum-keystore-file)。keystore是一个json字符串,里面最重要的是crypto信息。
"crypto" :
{
"cipher" : "aes-128-ctr", //对称 AES 算法的名称
"cipherparams" : { // 加密时用到的参数
"iv" : "83dbcc02d8ccb40e466191a123791e0e"
},
"ciphertext" : "d172bf743a674d.....4e6ad2fbde479c", //加密后得到的字符串
"kdf" : "scrypt", //密钥生成函数
"kdfparams" : { //上面kdf需要的参数
"dklen" : 32,
"n" : 262144,
"r" : 1,
"p" : 8,
"salt" : "ab0c78760.....43190334ba19"
},
"mac" : "2103ac29920d71.....56c331e3097" //用于验证密码是否正确的代码
}
整个过程还是蛮复杂的,有一张图说明了整个过程,非程序员和黑客可以忽略这张图。这里有一个重要的细节,mac信息可以用于校验密码是否正确,从而可以快速地(几秒之内)判断一个密码是否准确无误,可以节省大把的尝试时间。

图片取自ethfans.org
以太坊密码恢复工具pyethrecover
李笑来说过“你并不孤独”,世界上肯定有人与你有同样的遭遇,程序员们非常忌讳重复发明轮子,写代码之前先用google搜索一下,马上发现了pyethrecover这个工具(https://github.com/ryepdx/pyethrecover)。这段python程序能够根据你给出的密码片段的特征,生成一个包含所有组合的密码本,然后用程序一个一个地尝试这些密码。
正好以前学过python,按照github原作者的介绍,该程序可以运行在python 3环境中。可是在我实际安装时,某一个依赖的类库遇到了setup.py脚本无法执行的问题,折腾几次后,又找了另外一个github源程序,仍然无法正确安装。初步判断是windows环境的原因,准备切换到Linux环境中再试试。
.NET环境中的以太坊编程工具Nethereum




