Rsa

RSA,指數是模的一個因子

  • March 30, 2022

這個週末我參加了一個 CTF,但遇到了一個我無法解決的任務。我找不到任何文章,所以我希望你能幫助我。

鑑於: $$ n = pq\ c_1\cong m_1^{\hspace{.3em}p} \mod n\ c_2\cong m_2^{\hspace{.3em}q} \mod n $$ 了解價值觀 $ c_1,c_2,n $ 然後 $ p $ 是 1024 位和 $ q $ 是 1000 位,與 $ p,q $ 是素數。有沒有有效的恢復方法 $ m_1,m_2 $ ?

我知道如果我能夠恢復 $ p,q $ 由於費馬定理,這是微不足道的,但是這個問題又是使 RSAP 變得困難的原因。

唯一給出的其他資訊是 $ m_1,m_2 $ 為 25 個字節(200 位)。沒有任何服務可以充當神諭。

這裡的關鍵思想是 $ m_1 $ (或者 $ m_2 $ ) 相對於模量非常小。這讓我們可以應用通常的 Coppersmith 技術

我們知道 $ c_1 = m_1^p \bmod n $ ,這需要 $ c_1 \equiv m_1 \bmod p $ . 由此我們知道 $ c_1 - m_1 = t\cdot p $ , 對於一些 $ t $ . 換句話說, $ \gcd(c_1 - x, n) = p \ge n^{1/2} $ 對於一些 $ x = m_1 \le n^{1/4} $ . 這裡是我們的預期 $ x = m_1 $ 遠小於 $ n^{1/4} $ ,事實上,這使得事情更容易計算。

這在 Sage 中很容易重現:

sage: p = random_prime(2^1024, lbound=2^1023+2^1022)                                                                                                          
sage: q = random_prime(2^1000, lbound=2^999+2^998)                                                                                                            
sage: n = p*q                                                                                                                                                 
sage:                                                                                                                                                         
sage: m1 = randint(0, 2^200)                                                                                                                                  
sage: m2 = randint(0, 2^200)                                                                                                                                  
sage: c1 = power_mod(m1, p, n)                                                                                                                                
sage: c2 = power_mod(m2, q, n)                                                                                                                                
sage:                                                                                                                                                         
sage: P.<x> = Zmod(n)[]                                                                                                                                       
sage: f = (c1 - x).monic()                                                                                                                                    
sage: f.small_roots(beta=0.5)                                                                                                                                 
[1106883791702122199703869965196585780508362129433642126297878]
sage: m1                                                                                                                                                      
1106883791702122199703869965196585780508362129433642126297878

恢復 $ m_2 $ 可以以相同的方式完成,或者通過恢復因子一次 $ m_1 $ 被收回—— $ p = \gcd(c_1 - m_1, n) $ ——和解密 $ m_2 $ 一般。

引用自:https://crypto.stackexchange.com/questions/99370