[CISCN2018]oldstreamgame

encrypt

flag = "flag{xxxxxxxxxxxxxxxx}"
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==14

def lfsr(R,mask):
    output = (R << 1) & 0xffffffff
    i=(R&mask)&0xffffffff
    lastbit=0
    while i!=0:
        lastbit^=(i&1)
        i=i>>1
    output^=lastbit
    return (output,lastbit)

R=int(flag[5:-1],16)
mask = 0b10100100000010000000100010010100

f=open("key","w")
for i in range(100):
    tmp=0
    for j in range(8):
        (R,out)=lfsr(R,mask)
        tmp=(tmp << 1)^out
    f.write(chr(tmp))
f.close()

decrypt

一道lfsr题目,题目告诉了我们mask,通过对函数分析我们知道,这道题目就是原明文在不断地向左移动,而右边添加的是与mask异或后为1的位置的模2加的结果.解题的关键是发现在明文只剩最后一位时,可以通过最后的结果来求出最后一位,然后就可以反推回去了.

#mask=0b10100100000010000000100010010100 #0,2,5,12,20,24,27,29
f=open('key','rb').read()
import Crypto.Util.number
c=Crypto.Util.number.bytes_to_long(f)
c=bin(c)[2:].zfill(100*8)
print(c)
def solve(c):
    li=[]
    for i in range(32):
        temp='1'+''.join(li)+c[:31-len(li)]
        if int(temp[0])^int(temp[2])^int(temp[5])^int(temp[12])^int(temp[20])^int(temp[24])^int(temp[27])^int(temp[29])==int(c[31-len(li)]):
         
            li.insert(0,'1')
        else:
            
            li.insert(0,'0')
    return li
flag=solve(c)
print(hex(eval('0b'+''.join(flag))))

#flag{926201d7} 在buuctf提交时要添加0x,为此白给了好多次.

你可能感兴趣的:(lfsr)