攻防世界-密碼學-streamgame1


1. 題目信息

附件給出實現流加密的Python腳本與一段輸出的密鑰流。

2. 分析

通過對加密腳本的理解,可得本題的LFSR模型:

其中 \(a_{n-1},a_{n-2},\cdots,a_0\) 為程序中 mask 的二進制位,當 \(a_i=1\) 時,將 \(b_i\) 輸入異或運算,否則 \(b_i\) 不輸入異或運算;根據模型我們可以得到如下等式:

\[\begin{pmatrix} k_{1} \\ k_{2} \\ \vdots \\ k_{n-1} \\ k_{n} \\ \end{pmatrix}=\begin{pmatrix} b_{n-1} & b_{n-2} & \cdots & b_{1} & b_{0} \\ b_{n-2} & b_{n-3} & \cdots & b_{0} & k_{1} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ b_{1} & b_{0} & \cdots & k_{n-3}&k_{n-2} \\ b_{0} & k_{1} & \cdots & k_{n-2}&k_{n-1} \\ \end{pmatrix}\cdot \begin{pmatrix} a_{n-1} \\ a_{n-2} \\ \vdots \\ a_{1} \\ a_{0} \\ \end{pmatrix} \]

其中的加法為異或,因為\(a_{n-1} =1\),將上式重寫如下:

\[\begin{pmatrix} k_{1} \\ k_{2} \\ \vdots \\ k_{n-1} \\ k_{n} \\ \end{pmatrix}=\begin{pmatrix} b_{n-1} \\ b_{n-2} \\ \vdots \\ b_{1} \\ b_{0} \\ \end{pmatrix}\oplus \begin{pmatrix} b_{n-2} & \cdots & b_{1} & b_{0} \\ b_{n-3} & \cdots & b_{0} & k_{1} \\ \vdots & \ddots & \vdots & \vdots \\ b_{0} & \cdots & k_{n-3}&k_{n-2} \\ k_{1} & \cdots & k_{n-2}&k_{n-1} \\ \end{pmatrix}\cdot \begin{pmatrix} a_{n-2} \\ a_{n-3} \\ \vdots \\ a_{1} \\ a_{0} \\ \end{pmatrix} \]

由異或性質:

\[\begin{pmatrix} b_{n-1} \\ b_{n-2} \\ \vdots \\ b_{1} \\ b_{0} \\ \end{pmatrix}=\begin{pmatrix} k_{1} \\ k_{2} \\ \vdots \\ k_{n-1} \\ k_{n} \\ \end{pmatrix}\oplus \begin{pmatrix} b_{n-2} & \cdots & b_{1} & b_{0} \\ b_{n-3} & \cdots & b_{0} & k_{1} \\ \vdots & \ddots & \vdots & \vdots \\ b_{0} & \cdots & k_{n-3}&k_{n-2} \\ k_{1} & \cdots & k_{n-2}&k_{n-1} \\ \end{pmatrix}\cdot \begin{pmatrix} a_{n-2} \\ a_{n-3} \\ \vdots \\ a_{1} \\ a_{0} \\ \end{pmatrix} \]

再將等式“還原”:

\[\begin{pmatrix} b_{n-1} \\ b_{n-2} \\ \vdots \\ b_{1} \\ b_{0} \\ \end{pmatrix}=\begin{pmatrix} k_{1} & b_{n-2} & \cdots & b_{1} & b_{0} \\ k_{2} & b_{n-3} & \cdots & b_{0} & k_{1} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ k_{n-1} & b_{0} & \cdots & k_{n-3}&k_{n-2} \\ k_{n} & k_{1} & \cdots & k_{n-2}&k_{n-1} \\ \end{pmatrix}\cdot \begin{pmatrix} a_{n-1} \\ a_{n-2} \\ \vdots \\ a_{1} \\ a_{0} \\ \end{pmatrix} \]

計算的順序由下至上,即可解出初始狀態的所有比特位。

3. 解題

實現的Python腳本如下:

from gmpy2 import c_div

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

def cal(s,mask):
    lm=len(bin(mask))-2
    R=int(s[-1:]+s[:-1],2)
    ss=''
    for j in range(lm,0,-1):
        (_,tk)=lfsr(R,mask)
        ss=str(tk)+ss
        R=int(s[j-2]+str(tk)+bin(R)[2:].rjust(lm,'0')[1:-1],2)
    return ss

def solve():
    mask=0b1010011000100011100
    lm=len(bin(mask))-2
    with open('key','rb') as f:
        stream=f.read(c_div(lm,8))
    s=''.join([bin(256+ord(it))[3:] for it in stream])
    flag='flag{'+cal(s[:lm],mask)+'}'
    return flag

if __name__=='__main__':
    print solve()

程序運行結果如下:

$ python solve.py
flag{1110101100001101011}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM