實驗內容
【時間】6 月 13 號(周六)晚上
【地點】待定
【編程語言】Python(推薦)或者 C/C++
【實驗目的】
- 了解公鑰加密方案的一般結構;
- 深入理解 RSA 加密原語的密鑰生成;
- 通過使用 Python(推薦)或者 C,編程實現對沒有正確生成密鑰的 RSA 的破解,提醒大家不要嘗試自己隨意實現加密原語。
【實驗內容】
實驗內容和要求請見附件 EXP4-Doc.pdf
實驗准備
本實驗擬采用 C++ 作為編程語言。同實驗二,本實驗也需要配置 GMP 庫,詳細配置過程見實驗二相應部分。
實驗分析
實驗要求
通常,構成 RSA 模數 \(N\) 的素數 \(p\) 和 \(q\) 應該被獨立地產生。但是,假設一個開發者決定通過選擇一個隨機數 \(R\),並搜索其附近的兩個素數作為 \(p\) 和 \(q\)。那么,我們來證明這種方法得到的 RSA 的模數 \(N = pq\) 能被輕易的分解。
假設給定一個合數 \(N\) 並知道 \(N\) 是兩個彼此很接近的素數 \(p\) 和 \(q\) 的乘積,我們的任務是分解 \(N\)。
- 任務 1:模數 \(N\) 是兩個素數 \(p\) 和 \(q\) 的乘積,滿足 \(|p-q|<2 N^{1/4}\)。(模數 \(N\) 請見附件 task.txt)
- 任務 2:模數 \(N\) 是兩個素數 \(p\) 和 \(q\) 的乘積,滿足 \(|p-q|<2^{11} N^{1/4}\)。(模數 \(N\) 請見附件 task.txt)。
任務 1
以下思路來源於附件 EXP4-Doc.pdf
對模數 \(N\) 和素數 \(p\),\(q\) 滿足,
\[|p-q|<2N^{1/4} \tag{1.1} \]
我們令 \(A\) 是兩個素數的算術平均值,即 \(A=\frac{p+q}{2}\)。由於 \(p\) 和 \(q\) 都是奇數,所以 \(A\) 一定是一個整數。為了分解 \(N\),我們需要了解,在條件 \((1.1)\) 下 \(\sqrt{N}\) 是非常接近 \(A\) 的。具體來講,有
由於 \(A\) 是一個整數,將 \(\sqrt{N}\) 湊成最接近的整數便能獲取 \(A\) 的值,即 \(A = \lceil\sqrt{N}\rceil\)。
因為 \(A\) 是 \(p\) 和 \(q\) 的中點,所以有 \(x\) 使得 \(p=A-x\) 以及 \(q=A+x\)。又因為 \(N=pq=(A-x)(A+x)=A^{2}-x^{2}\),因此 \(x=\sqrt{A^{2}-N}\)。那么我們就可以得到通過計算 \(A-x\) 和 \(A+x\) 得到 \(p\) 和 \(q\) 的值了。
void solve1()
{
mpz_class N(
"17976931348623159077293051907890247336179769789423065727343008115773267580550562068698537944921298295958550138"
"75371640157101398586478337786069255834975410851965916151280575759407526350074759352887108236499499407718956170"
"54361149474865046711015101563940680527540071584560878577663743040086340742855278549092581");
mpz_class p, q;
mpz_class A, x;
mpz_sqrt(A.get_mpz_t(), N.get_mpz_t());
// 向上取整
A++;
mpz_class temp = A * A - N;
mpz_sqrt(x.get_mpz_t(), temp.get_mpz_t());
p = A - x;q = A + x;
cout << "p: " << p << "\nq: " << q << endl;
return;
}
對不等式 \(0<A-\sqrt{N}<1\) 的證明
左邊部分 \(A-\sqrt{N}>0\):
由基本不等式 \(\sqrt{ab} \leq \frac{a+b}{2}\) 可以得到 \(\sqrt{pq} < \frac{p+q}{2}\)(因為 \(p \not= q\),所以無法取到等號),即 \(\sqrt{N} < A\)。
右邊部分 $A-\sqrt{N}<1$:首先,因為 \(A=\frac{p+q}{2}\),\(N=pq\),
\[A^{2}-N=\left(\frac{p+q}{2}\right)^{2}-N=\frac{p^{2}+2N+q^{2}}{4}-N=\frac{p^{2}-2 N+q^{2}}{4}=(p-q)^{2}/4 \tag{1.3} \]那么對於左式 \(A-\sqrt{N}\),有:
\[A-\sqrt{N}=\frac{(A-\sqrt{N})(A+\sqrt{N})}{A+\sqrt{N}}=\frac{A^{2}-N}{A+\sqrt{N}}\stackrel{(1.3)}=\frac{(p-q)^{2}/4}{A+\sqrt{N}} \tag{1.4} \]由於 \(\sqrt{N} < A\),那么,
\[A-\sqrt{N}\stackrel{(1.4)}=\frac{(p-q)^{2}/4}{A+\sqrt{N}} < \frac{(p-q)^{2}/4}{\sqrt{N}+\sqrt{N}}=\frac{(p-q)^{2}}{8\sqrt{N}} \tag{1.5} \]由於任務 1 滿足 \(|p-q|<2N^{1/4}\),即 \((p-q)^{2}<4\sqrt{N}\)。最后得到,
\[A-\sqrt{N} \stackrel{(1.5)}< \frac{(p-q)^{2}}{8\sqrt{N}} \stackrel{(1.1)}< \frac{4\sqrt{N}}{8\sqrt{N}}=1/2 < 1 \tag{1.6} \]
任務 2
對模數 \(N\) 和素數 \(p\),\(q\) 滿足,
\[|p-q|<2^{11}N^{1/4} \tag{2.1} \]
和任務 1 一樣,令 \(A\) 是兩個素數的算術平均值。由於任務 2 滿足 \(|p-q|<2^{11}N^{1/4}\),即 \((p-q)^{2}<2^{22}\sqrt{N}\),代入式 \((1.5)\) 可以得到:\(A-\sqrt{N} \stackrel{(1.5)}< \frac{(p-q)^{2}}{8\sqrt{N}} \stackrel{(2.1)}< \frac{2^{22}\sqrt{N}}{8\sqrt{N}}=2^{19}\),所以,有
所以,整數 \(A\) 的范圍為 \(\lceil\sqrt{N}\rceil \leq A \leq \lfloor\sqrt{N}\rfloor + 2^{19}\)。我們只需枚舉范圍內的值,找到整數 \(A\) 滿足 \(N=pq\) 即可,具體做法同任務 1。
void solve2()
{
mpz_class N(
"64845584280807166966282426534677227872634372070697626306043907037879730861808111646271401527606141756919558732"
"18402545206554249067198924288448418393532819729885313105117386489659625828215025049902644521008852816733037111"
"42296421027840289307657458645233683357077834689715838646088239640236866252211790085787877");
mpz_class p, q;
mpz_class A, x;
mpz_sqrt(A.get_mpz_t(), N.get_mpz_t());
for(int i = 1; i < 524288; i++)
{
A++;
mpz_class temp = A * A - N;
mpz_sqrt(x.get_mpz_t(), temp.get_mpz_t());
p = A - x;
q = A + x;
if(p * q == N)
{
cout << "p: " << p << "\nq: " << q << endl;
break;
}
}
return;
}
完整代碼 👉 傳送門
實驗結果
運行代碼,有以下結果:
Task 1:
p: 13407807929942597099574024998205846127479365820592393377723561443721764030073662768891111614362326998675040546094339320838419523375986027530441562135724301
q: 13407807929942597099574024998205846127479365820592393377723561443721764030073778560980348930557750569660049234002192590823085163940025485114449475265364281
Task 2:
p: 25464796146996183438008816563973942229341454268524157846328581927885777969985222835143851073249573454107384461557193173304497244814071505790566593206419759
q: 25464796146996183438008816563973942229341454268524157846328581927885777970106398054491246526970814167632563509541784734741871379856682354747718346471375403