WMCTF2020密碼學部分詳解


比賽網址:WMCTF2020

一、piece_of_cake

1. 題目信息

附件是一個py腳本,Gitee備份中的task.py。

2. 分析

eat_cake函數中的各個變量的定義如下:

  • \(p,q\)為512位隨機素數,\(ph=(p-1) \cdot (q+1),N=p \cdot q,d=e^{-1}\ \textrm{mod}\ ph\)

  • \(cake\)為768位隨機素數,\(q\)重新賦值為1536位隨機素數,將\(d\)的值賦給\(f\)\(g\)為隨機素數,\(g\)的位數等於\(q\)的位數減去\(f\)的位數再減去1

  • \(h=f^{-1} \cdot g\ \textrm{mod}\ q\)\(r\)為512位隨機素數,\(c=(r \cdot h+cake)\ \textrm{mod}\ q\)

\(h=f^{-1} \cdot g\ \textrm{mod}\ q\)可得\(f \cdot h \equiv g\ \textrm{mod}\ q\),記為\(f \cdot h-t \cdot q=g\),構造矩陣

\[M=\begin{pmatrix} 1 & h\\ 0 & q \end{pmatrix} \]

則有

\[\begin{pmatrix} f & -t \end{pmatrix} \cdot \begin{pmatrix} 1 & h\\ 0 & q \end{pmatrix} = \begin{pmatrix} f & g \end{pmatrix} \]

\( \begin{pmatrix} f & g \end{pmatrix} \)是格\(L(M)\)上的短格基,因此有可能可使用LLL算法或BKZ算法求出,這里說有可能求出,因為在解題時並不是每次都能找到短格基\( \begin{pmatrix} f & g \end{pmatrix} \)
假設我們求出的短格基為\( \begin{pmatrix} f & g \end{pmatrix} \),再由公式\(c=(r \cdot h+cake)\ \textrm{mod}\ q\)

\(f \cdot c \equiv f \cdot (r \cdot h+cake) \equiv (r \cdot g+f \cdot cake)\ \textrm{mod}\ q\)

從而

\((r \cdot g+f \cdot cake)= f \cdot c\ \textrm{mod}\ q\)

兩邊模\(g\)可得

\(f \cdot cake \equiv (f \cdot c\ \textrm{mod}\ q)\ \textrm{mod}\ g\)

於是

\(cake=f^{-1} \cdot (f \cdot c\ \textrm{mod}\ q)\ \textrm{mod}\ g\)

注意,上面等式中\(f^{-1}\)\(f\)\(g\)下的逆,不能與括號內的\(f\)抵消。

3. 解題

上述鏈接中的solve.sage為解題的sage腳本。

4. 備注

此exp並不能保證次次成功!不過它的有效性不可否認,上述鏈接中的test.sage即可驗證。

以下是我對test.sage四次的運行結果:

$ sage test.sage
success! 48 -th
$ sage test.sage
success! 2 -th
$ sage test.sage
success! 50 -th
$ sage test.sage
success! 24 -th

從而驗證了解題腳本solve.sage的有效性。

二、babySum

1. 題目信息

附件是兩個py腳本與一個json文件,Gitee備份中的task.py與check.py。

2. 分析

task.py告訴我們生成data中數據的邏輯,其實很好理解:生成\(n=120\)個150位的隨機數,組成數組\(A\),從中選\(k=20\)個相加生成和\(s\)

記數組\(A=[a_{1},\cdots,a_{n}]\),check.py讀入120個數\(b_{1},\cdots,b_{n}(b_{i}={0,1})\),其中20個為1,另外100個為1,檢驗\(\sum_{i=1}^{n}a_{i} \cdot b_{i}=s\),如果等式成立,就打印出flag。

到這里我們共有3個約束條件:

  • \(\sum_{i=1}^{n}b_{i}=k\)
  • \(\sum_{i=1}^{n}a_{i} \cdot b_{i}=s\)
  • \(b_{i}=0,1;i=1,\cdots,n\)

遇到這種問題一般轉化為格基約減問題,構造矩陣\( \begin{pmatrix} 1 & & & & a_{1} & 1 \\ & 1 & & & a_{2} & 1 \\ & &\ddots & &\vdots &\vdots \\ & & & 1 & a_{n} & 1 \\ & & & & -s & -k & \end{pmatrix}=M \)

那么\( \begin{pmatrix} b_{1} & b_{2} & \cdots & b_{n} & 1 \end{pmatrix} \cdot M=\begin{pmatrix} b_{1} & b_{2} & \cdots & b_{n} & 0 & 0 \end{pmatrix} \)

即通過格基約減可以求出\(b_{1},\cdots,b_{n}\)

理想很豐滿,現實很骨感!

約減后的格基無法達到我們需要的結果!直到看到writeup,這里需要記住一個很有用的技巧,可類比約束優化問題對約束條件的處理,當不滿足約束條件\(\begin{cases} \sum_{i=1}^{n}b_{i}=k\\ \sum_{i=1}^{n}a_{i} \cdot b_{i}=s \end{cases} \)時加大“懲罰”,我們重新設計格基矩陣\(M\)\( \begin{pmatrix} 1 & & & & N \cdot a_{1} & N \\ & 1 & & & N \cdot a_{2} & N \\ & &\ddots & &\vdots &\vdots \\ & & & 1 & N \cdot a_{n} & N \\ & & & & -N \cdot s & -N \cdot k & \end{pmatrix} \)
其中\(N=[\sqrt{n}]\)
此時仍然有\( \begin{pmatrix} b_{1} & b_{2} & \cdots & b_{n} & 1 \end{pmatrix} \cdot M=\begin{pmatrix} b_{1} & b_{2} & \cdots & b_{n} & 0 & 0 \end{pmatrix} \)

然后就是比較玄學的問題,對同一格,改變格基矩陣行的順序,約減的結果也會不同,官方的writeup就是不斷打亂格基矩陣的行,然后進行格基約減;再就是為了更快得到結果,需要進行多線程編程;上述鏈接中的solve.sage為解題的sage腳本;官方設置的8個線程,我自己改成6個線程,跑了幾次,基本上都是20分鍾左右出結果。

$ sage solve.sage   
(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)
cost time:  0:25:27


免責聲明!

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



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