Simple Crypto - 0x10(2023 Lab - coppersmith)
Background
Source code
1 | |
Recon
這一題看到e=3直覺會想到小明文攻擊,但是前提除了$e$要很小以外,明文也不能太大,要不然會找很久,他的原理是(假設e=3):
所以可以枚舉很多的k,並且依次開三次方,直到開出整數為止,但就像前面的前提,明文不能太大,不然也會找的很痛苦,此時就可以用到上課教到的coppersmith,解出這樣的問題
-
Review Coppersmith Attack 問題:如果有一個${f(x)\equiv 0\ (mod\ N)\ |x=r, N\in \mathbb{Z}, f(x)\in \mathbb{Z}{[x]}}$,當$x=r$的時候會同餘$0$ 想求:$r$是多少能符合以上的式子
首先這個問題因為mod是一個循環,所以正常情況下很難知道$r$多少能符合,因此我們可以簡化一下問題,或者說增加一些限制,這樣在尋找$r$的時候會比較好找一點
-
首先構造一個
\[\{Q(x)=s(x)\cdot f(x)+t(x)\cdot N\ (mod\ N)\ |\ Q(r)\equiv 0\ (mod\ N), r\in \mathbb{Z}\}\]在這裡可以先把$r$帶進去這個構造的式子,就會發現其實跟一開始求的問題,也就是$f(x)\equiv 0\ (mod\ N)$其實一樣,但為甚麼要這樣做呢?是因為把問題拉到實數域中求解後比較好做,等我們拿到$r$在實數域得到的root之後就可以帶回去$f(x)$中。
我們可以把$r$想像成是一個flag,然後flag會有一個最大可能性的上界,也就是$R$,假設flag有32個字元,代表256個bits,我們可以想像$R=2^{256}$,我們不知道flag是多少,但一定在$R$的這個範圍中,且flag一定是整數(換算成int的話)
-
所以我們就可以重新寫一個bounded equation
\[Q(r)=|Q_nr^n+...+Q_2r^2+Q_1r^1+Q_0|\le |Q_n|R^n+...+|Q_2|R^2+|Q_1|R+|Q_0|\]有了這個bound equation後,我們就可以說
\[\because |Q(r)| < |Q(R)| < N且Q(r) ≡ 0\ mod\ N\\ \therefore Q(r)=0\]有了以上條件和說明,此時我們確定把問題拉到實數域上了,現在還不知到$r$為多少
-
而要知道$r$就必須知道$Q(r)$,只要得到$Q(r)$再利用找root的sage method就可以直接得到$r$為多少,但在得到$Q(r)$之前我們要先得到$Q(R)$,我們可以利用前面提到的$s(x)\cdot f(x)+t(x)\cdot N\ (mod\ N)$建一個多項式,然後用matrix表示並把$R$帶入,再利用LLL求shortest vector,此時的shortest vector是以$x=R$為條件帶入,所以只要在各個term把$R$除掉,就可以得到$Q(r)$各個term的係數,然後就求得$r$為多少了,舉例來說:
在RSA中,已知$c= m^e\ (mod\ N)$,當我們今天拿到一個有padding明文(當然我們拿到的是密文,只是知道明文有經過padding,且padding的部分我們知道,另外flag的大小也不能太大,具體能多大可以看影片),且$e=3$,我們可以rewrite整個式子(假設padding的部分為$a$,flag的部分為$x$)
\[\begin{aligned} m &= padding + flag\\ c &= m^3 = (padding + flag)^3\ (mod\ N)\\ f(x) &= (padding + flag)^3 - c\ (mod\ N) \end{aligned}\\ \downarrow\\ s(x)\cdot f(x)+t(x)\cdot N\ (mod\ N)\\ =c_3(x^3 + 3ax^2 + 3a^2x + (a^3 - c)) + (c_2x^2 + c_1x + c_0)\cdot N\\ =\begin{bmatrix} c_3, c_2, c_1, c_0 \end{bmatrix}\cdot\begin{bmatrix} x^3 & 3ax^2 & 3a^2x & a^3 - c\\ 0 & Nx^2 & 0 & 0 \\ 0 & 0 & Nx & 0\\ 0 & 0 & 0 & N \end{bmatrix}\]$s(x)=c_3$,如果把$f(x)$乘開就會是$x^3 + 3ax^2 + 3a^2x + (a^3 - c)$,而$t(x)=c_2x^2 + c_1x + c_0$。此時把矩陣的$x$帶入上界$R$再利用LLL求shortest vector,也就是
\[\begin{bmatrix} c_3R^3\\ (c_33a + c_2N)*R^2\\ (c_33a^2 + c_1N)*R\\ (c_3(a^3-c) + c_0N) \end{bmatrix}^T\]詳細過程如下:
\[\begin{aligned} M&=\begin{bmatrix} R^3 & 3aR^2 & 3a^2R & a^3 - c\\ 0 & NR^2 & 0 & 0 \\ 0 & 0 & NR & 0\\ 0 & 0 & 0 & N\\ \end{bmatrix} | x = R\\ LLL(M)&=\begin{bmatrix} c_3R^3\\ (c_33a + c_2N)*R^2\\ (c_33a^2 + c_1N)*R\\ (c_3(a^3-c) + c_0N) \end{bmatrix}^T \end{aligned}\\ ↪Q(x)=\begin{bmatrix} c_3\\ c_33a + c_2N\\ c_33a^2 + c_1N\\ c_3(a^3-c) + c_0N \end{bmatrix}^T\begin{bmatrix} x^3\\ x^2\\ x^1\\ x^0 \end{bmatrix}\le Q(R) = \begin{bmatrix} Q_3\\ Q_2\\ Q_1\\ Q_0 \end{bmatrix}^T \begin{bmatrix} R^3\\ R^2\\ R\\ 1\\ \end{bmatrix}\le N\] -
求flag(也就是求得$Q(x)$的root $x_0$) 由以上過程,我們已經取得了$Q(x)$,則我們就可以在實數域中求$Q(x)$的根$x_0$
-
-
基本上這一題就是按照上面講的這樣解就可以了
Exploit
1 | |
Flag: FLAG{RandomPaddingIsImportant}