Ps:感谢D大神提供的代码,给我带来了很多的帮助。
这几天在作比赛,挺有意思的,听说是给大一的孩子玩的,我们这帮老人就无耻地去参加了。。
有道题,给出了一个Gesture.key,要我们破解。
这个就是SHA1的加密嘛。
在看雪有一个讲解原理的帖子:
http://bbs.pediy.com/showthread.php?t=166933
其实真不难写:
1.python的穷举怎么搞?
def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
用到了:itertools.product()
那么在本次解决方案中就应该:s="\x00\x01\x02\x03\x04\x05\x06\x07\x08"
for a,b,c,d,e,f,g,h,i in itertools.product(s,repeat=9):
这个其实真不算难题,只是我个人傻逼而已,很简单,\x00 就表示16进制的0
代码:
import hashlib
import itertools
s="\x00\x01\x02\x03\x04\x05\x06\x07\x08"
hashkey=open('Gesture.key','rb').read()
for a,b,c,d,e,f,g,h,i in itertools.product(s,repeat=9):
if hashlib.sha1(a+b+c+d+e+f+g+h+i).digest()==hashkey:
for x in a,b,c,d,e,f,g,h,i:
print chr(ord(x)+0x30),
print "\n"
break
上述代码,其实是默认解码的手势为9个点,也算是运气好吧,9个就出来key了。。
严谨点应该repeat = 9,8,7,6,5,4 都有可能!