共享素数CRT(模不互素)

题目

  • ! Moectf2022-Weird_E_Revenge
from Crypto.Util.number import *
import random
from secret import flag
table='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
pad=100-len(flag)
for i in range(pad):
    flag+=random.choice(table).encode()
e=343284449
m=bytes_to_long(flag)
assert m>(1<<512)
assert m<(1<<1024) 
p=getPrime(512)
q=getPrime(512)
r=getPrime(512)
print('p=',p)
print('q=',q)
print('r=',r)
n1=p*q
n2=q*r
c1=pow(m,e,n1)
c2=pow(m,e,n2)
print('c1=',c1)
print('c2=',c2)
#p= 11820891196647569262137841192985418014377132106496147254821784946481523526822939129065042819464351666077658751406165276121125571355594004514547517855730743
#q= 10450390015864176713581330969519712299844487112687677452105216477861582967322473997670559995588440097951786576039009337782247912476227937589298529580432797
#r= 9484954066160968219229920429258150817546418633451929876581842443665029377287119340232501682142185708534413073877473741393278935479791561681402673403009771
#c1= 69574855207460025252857869494766338442370688922127811393280455950372371842144946699073877876005649281006116543528211809466226185922844601714337317797534664683681334132261584497953105754257846471069875622054326463757746293958069752489458646460121725019594141157667480846709081917530190233900184428943585065316
#c2= 66183492015178047844987766781469734325646160179923242098082430373061510938987908656007752256556018402101435698352339429316390909525615464024332856855411414576031970267795270882896721069952171988506477519737923165566896609181813523905810373359029413963666924039857159685161563252396502381297700252749204993228

解题思路

给定

  • $c_1 \equiv m^e \bmod {pq}$
  • $c_2 \equiv m^e \bmod {qr}$

根据模运算性质

  • $c_1 \equiv m^e \pmod p$ 因为 $p$ 整除 $p*q$
  • $c_2 \equiv m^e \pmod r$ 因为 $r$  整除 $q*r$

这样我们就得到两个独立方程

  • $x \equiv c_1 \bmod p$
  • $x \equiv c_2 \bmod r$

其中 $x = m^e$

由于 $p$ 和 $r$ 互质(都是质数),满足CRT应用条件

  • $x \equiv a \pmod p$
  • $x \equiv b \pmod r$

有唯一解模 $p*r$ ,其中

  • $a = c_1 \bmod p$
  • $b = c_2 \bmod r$

CRT给出解 $x = a * (r * r_{inv}) + b * (p * p_{inv}) \bmod {pr}$

其中

  • $r_{inv} = r^{-1} \bmod p$
  • $p_{inv} = p^{-1} \bmod r$

现在我们有 $x = m^e \bmod (pr)$ ,构造新模数 $n_3 = p*r$ ,计算 $φ(n_3) = (p-1)(r-1)$

求 $e$ 的模逆元 $d$ , $d \equiv e^{-1} \bmod {φ(n_3)}$

最终解密 $m = x^d \bmod (pr)$

解答

  • !! 中国剩余定理算法
from sympy.ntheory.modular import crt
from Crypto.Util.number import *

p = 11820891196647569262137841192985418014377132106496147254821784946481523526822939129065042819464351666077658751406165276121125571355594004514547517855730743
q = 10450390015864176713581330969519712299844487112687677452105216477861582967322473997670559995588440097951786576039009337782247912476227937589298529580432797
r = 9484954066160968219229920429258150817546418633451929876581842443665029377287119340232501682142185708534413073877473741393278935479791561681402673403009771
c1 = 69574855207460025252857869494766338442370688922127811393280455950372371842144946699073877876005649281006116543528211809466226185922844601714337317797534664683681334132261584497953105754257846471069875622054326463757746293958069752489458646460121725019594141157667480846709081917530190233900184428943585065316
c2 = 66183492015178047844987766781469734325646160179923242098082430373061510938987908656007752256556018402101435698352339429316390909525615464024332856855411414576031970267795270882896721069952171988506477519737923165566896609181813523905810373359029413963666924039857159685161563252396502381297700252749204993228
e = 343284449
n1 = p*q
n2 = q*r
n3 = p*r
x = crt([n1,n2],[c1,c2])[0]
m1 = x%p
m3 = x%r
x = crt([p,r],[m1,m3])[0]
d = inverse(e,(p-1)*(r-1))
print(long_to_bytes(pow(x,d,n3)))
#moectf{Th1s_iS_Chinese_rEm41nDeR_The0rEm_CRT!}YWMZSTyfRvhjTCJuQCwALQBcWHFCgTDIZWJaxRUzBPCmFOnbDTRBau
#moectf{Th1s_iS_Chinese_rEm41nDeR_The0rEm_CRT!}
  • !! 扩展欧几里得算法
from Crypto.Util.number import *  
  
def exgcd(a, b):  
    if b == 0:  
        return 1, 0, a  
    else:  
        x, y, q = exgcd(b, a % b)  
        x, y = y, (x - (a // b) * y)  
        return x, y, q  
  
p = 11820891196647569262137841192985418014377132106496147254821784946481523526822939129065042819464351666077658751406165276121125571355594004514547517855730743  
q = 10450390015864176713581330969519712299844487112687677452105216477861582967322473997670559995588440097951786576039009337782247912476227937589298529580432797  
r = 9484954066160968219229920429258150817546418633451929876581842443665029377287119340232501682142185708534413073877473741393278935479791561681402673403009771  
n1 = p*q  
n2 = q*r  
r1 = 69574855207460025252857869494766338442370688922127811393280455950372371842144946699073877876005649281006116543528211809466226185922844601714337317797534664683681334132261584497953105754257846471069875622054326463757746293958069752489458646460121725019594141157667480846709081917530190233900184428943585065316  
r2 = 66183492015178047844987766781469734325646160179923242098082430373061510938987908656007752256556018402101435698352339429316390909525615464024332856855411414576031970267795270882896721069952171988506477519737923165566896609181813523905810373359029413963666924039857159685161563252396502381297700252749204993228  
e = 343284449  
  
x0, y0, q = exgcd(n1, n2)  
k1 = (r2-r1)*x0//q  
x = r1+k1*n1  
phi = (p-1)*(r-1)  
d = inverse(e, phi)  
m = pow(x, d, p*r)  
print(long_to_bytes(m))  
#moectf{Th1s_iS_Chinese_rEm41nDeR_The0rEm_CRT!}YWMZSTyfRvhjTCJuQCwALQBcWHFCgTDIZWJaxRUzBPCmFOnbDTRBau  
#moectf{Th1s_iS_Chinese_rEm41nDeR_The0rEm_CRT!}
posted @ 2025-07-25 19:32  sevensnight  阅读(44)  评论(0)    收藏  举报