litecoin密码忘记后...

来源:互联网 发布:矩阵论视频教程 编辑:程序博客网 时间:2024/05/11 05:28
知识共享许可协议

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。


       这一段时间一直在挖矿,毕竟买个能玩极品飞车效果全开的中档显卡,只上网有点浪费。所以就挖挖比特币,后来发现以PC机挖比特币就是脑袋抽抽,就改挖莱特币(litecoin)。前几天莱特币价格暴涨(从27到380),就像兑换点人民币买点电。结果突然发现,半年前我脑袋进水了,居然设了一个钱包密码,结果钱包只能进不能出。

       哎呦,这坑爹啊,我试了能想起来的所有密码都不对。眼看着好多money就打水瓢了,不甘心啊!咱是工程师,虽然理论水平不高,不过暴力破解还是可以的,无非是暴力破解自己的密码。那么,现在来梳理一下已知条件和未知条件,以及目标,然后设计一个稍微高效的暴力破解程序

已知条件:

1.我的密码就那几个,不会是一个完全随机数。强度一般

2.litecoin钱包密码可尝试无数次,不会有锁定、验证码的问题

未知条件:

1.如何自动测试密码?这是暴力破解的关键,否则手动输入的话,就不是对程序使用暴力了,而是对自己使用暴力了。(我想起了红烧猪蹄~~~)

2.暴力破解简单来说就是使用程序遍历密码字典,那么字典如何生成?什么样的字段适合现在的情况?

目标:

找到钱包密码

        网上搜了一下,也看了一下litecoin的源码,最后发现litecoin-0.8.5.1这个版本(之前的版本没测试过)有两个钱包程序,一个是daemon方式的,没有GUI;一个是基于QT的GUI。最开始,我在windows环境下,使用python调用win32con库,模拟键盘输入来测试,速度很快,但是密码框没有显示明文,也不知道输入的内容是否正确。也懒得安装QT Creator修改LineEdit的显示属性。感兴趣的话可以自己搜索,不过要注意一点,键码和ascii是不一样的。

        网上很多文章(大部分是转载同一篇文章)都是使用win32con.keybd_event()这个函数,第一个参数是按键码,文章多是说可以通过ord('a')来获取按键码,但是ord是获取ascii码的,与键码基本都不相同。比如,你要模拟键盘输入小写字母'a',它的ascii码为97,按键码是65,所以keybd_event()的第一个参数就是65,而如果要输入大写字母'A',就需要实现shift+a的操作。简单来说,你怎么用键盘输入字符,就怎么使用这个模拟函数。

        扯的远了,回归正题。我最后是在linux环境下,通过rpc和litecoin的守护进程通信,执行unlock操作,进行密码试错的。首先要配置litecoin.conf文件添加rpcpassword,不知道从哪个版本开始使用litecoind需要设置rpc密码了。

~/.litecoin$ cat litecoin.conf rpcpassword=123

在命令行启动litecoind守护进程

./litecoind -daemon
建议找一台独立的电脑,把有密码的钱包文件wallet.dat拷过去,避免出现某些不可遇见的错误。

下面这条命令就是用于钱包解锁的

./litecoind walletpassphrase YOUR-PASSWORD 120

如果解锁失败,会返回如下信息

error: {"code":-14,"message":"Error: The wallet passphrase entered was incorrect."}
解锁成功无返回信息,不过重复解锁会返回:

error: {"code":-17,"message":"Error: Wallet is already unlocked."}
如果你看到这个信息,往上找log,肯定有一个密码是正确的


我弄了一个shell脚本自动尝试解锁操作

#!/bin/bashfor line in `cat code`do        echo "testing  "$line        `./litecoind -rpcpassword=123 walletpassphrase $line 120`        echo $line >> testedcodedone
其中code是字典文件

那么,最重要的字典文件如何创建呢?这个就和个人习惯有关了。我的习惯是用自己常用的密码进行组合生成新的密码,相信很多人都是这个习惯,又可以保证密码强度和长度,又不容易忘记。所以,我用python脚本帮忙生成全排列组合(高中概率学基本知识,看不懂回家翻书),并保存在文件中(这些文件最后一定要都删除了,小心密码泄露)。下面是字典生成代码:

from itertools import productheads=["aaaa","bbbb"] #这里是常用的密码组合开头chars=["ccc","dd","123","*()"]count = 0f = open("code", "w")for h in heads:    for l in range(4):        ret = list(product(chars, repeat=l))        for c in ret:            c = "".join(c)            c = h+c            #密码长度规则            if len(c) < 8:                continue            count += 1            f.write(c+"\n")f.close()print count
简单说明一下,itertools.product是python的一个迭代工具中的全排列生成函数,其中repeat表示重复次数,可以在python的执行环境中做做试验,很简单的。

我把密码进行了分组,有些密码是只会出现在开头的(个人喜欢而已)。分组的好处是减少组合个数。


最后,终于把密码找到了,万幸啊!


如果你找回自己的密码,来点捐赠吧,让我有点成就感:LYM4ruVfHn57qLNBdk97VSEv8am8WXRDoy