NKCTF

Crypto

baby_RSA

题目连接

https://pan.baidu.com/s/1gHXugkve5NbHg0n7Zd5KPg?pwd=2023

通过dp求出P,Q,即c1,c2关键是公式变换,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RSA
n = p*q
c1 = m^p mod (p*q)
c2 = m^p mod (p*q)
费马小定理
m^p ≡ m mod (p)
m^q ≡ m mod (p)
/*个人感觉这里是m<p,那么m^p<p*q,才能有下面的结果*/
c1 = m + k1*p + k2*p*q=m+k3*p
同理
c2 = m +k4*q
c1*c2 = m^2 +m(k3*p+k4*q)+ k3*k4*n
(c1+c2)m =2(m^2) + m(k3*p+k4*q)
所以m^2 - (c1+c2)m + c1 * c2 = k3 * k4 * m ≡ 0 mod (n)
即构建关于m的多项式,使用coppersmith方法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
n =  114101396033690088275999670914803472451228154227614098210572767821433470213124900655723605426526569384342101959232900145334500170690603208327913698128445002527020347955300595384752458477749198178791196660625870659540794807018881780680683388008090434114437818447523471527878292741702348454486217652394664664641
N =  1159977299277711167607914893426674454199208605107323826176606074354449015203832606569051328721360397610665453513201486235549374869954501563523028914285006850687275382822302821825953121223999268058107278346499657597050468069712686559045712946025472616754027552629008516489090871415609098178522863027127254404804829735621706042266140637592206366042515190385496909533329383212542170504864473944657824502882014292528444918055958758310544435120502872883857209880723535754528096143707324179005292445100655695427777453144657819474805882956064292780031599790769618615908501966912635232746588639924772530057835864082951499028
dP =  33967356791272818610254738927769774016289590226681637441101504040121743937150259930712897925893431093938385216227201268238374281750681609796883676743311872905933219290266120756315613501614208779063819499785817502677885240656957036398336462000771885589364702443157120609506628895933862241269347200444629283263
e=65537
P=0
e=65537

temp=dP*e
for i in range(1,e):
    if(temp-1)%i==0:
        x=(temp-1)//i+1
        y=N%x
        if y==0:
            P=x
            break

#print(P)
P=37269067352457630263351774206178494913957088859822110344334922741582406663357663275001777826744534556652993452577088773275825539553907027527722045884489297259984687894496505265384077983882580247333972954704644517469999916574893996324149548980338301147983367163067556434434982470623587914250041142380667816331
Q=N//P

#sage
Q,P=(31124398373258967647259273958463995255448332282733968391096762136494537693158180734634142626374694999391960402681114664140356232930100613919064790135723294710984789809295862966052914533841176463683069225072916170624016363164528353386087305805869313783193076760778433672011918504199905552973276891160558444988, 37269067352457630263351774206178494913957088859822110344334922741582406663357663275001777826744534556652993452577088773275825539553907027527722045884489297259984687894496505265384077983882580247333972954704644517469999916574893996324149548980338301147983367163067556434434982470623587914250041142380667816331)
n =  114101396033690088275999670914803472451228154227614098210572767821433470213124900655723605426526569384342101959232900145334500170690603208327913698128445002527020347955300595384752458477749198178791196660625870659540794807018881780680683388008090434114437818447523471527878292741702348454486217652394664664641
R.<m>=Zmod(n)[]
f=m**2-(P+Q)*m+P*Q
m=f.monic().small_roots()

print(m)
#m=152099310694956022622926857538598513541723670773227126074246760446874272165452073476477

这段代码是用SageMath进行的多项式操作

1
2
3
4
R.<m>=Zmod(n)[]#定义了一个在模n下的多项式环,m是环中的元素

f=m**2-(P+Q)*m+P*Q#定义了一个二次多项式,monic()方法返回该多项式的首项系数为1的首一多项式,
m=f.monic().small_roots()

monic()方法返回该多项式的首项系数为1的首一多项式,small_roots()方法返回多项式的所有小根,即在模n下使多项式等于0的所有整数解。