题目
flag = open("flag", "r").read().strip()
assert len(flag) == 32
def str2num(s):
return int(s.encode('hex'), 16)
def bbencode(n):
a = 0
for i in bin(n)[2:]:
a = a << 1
if (int(i)):
a = a ^ n
if a >> 256:
a = a ^ 0x10000000000000000000000000000000000000000000000000000000000000223L
return a
print bbencode(str2num(flag))
#result:61406787709715709430385495960238216763226399960658358000016620560764164045692
可以看到算法是异或然后位移,当a长度为257bits时,结束并异或一个key
可以理解为在 2^(256) 下的一个环,遍历2^256一定可以找到原文
但是实际上并不需要遍历2^256这么多次
类似于流密码生成器一样,并不是256位就会生成2**256的密钥流
简单爆破就出来了
#flag = open("flag", "r").read().strip()
#assert len(flag) == 32
def str2num(s):
return int(s.encode('hex'), 16)
def num2str(n):
return str(hex(n)[2:-1])
def bbencode(n):
a = 0
for i in bin(n)[2:]:
a = a << 1
if (int(i)):
a = a ^ n
if a >> 256:
a = a ^ 0x10000000000000000000000000000000000000000000000000000000000000223L
return a
#print bbencode(str2num(flag))
#result:61406787709715709430385495960238216763226399960658358000016620560764164045692
flag = 61406787709715709430385495960238216763226399960658358000016620560764164045692
for i in range(2**16):
flag = bbencode(flag)
if 'flag'.encode('hex') in num2str(flag):
print num2str(flag).decode('hex')
