[羊城杯 2020]RRRRRRRSA

20 篇文章 1 订阅
18 篇文章 0 订阅

[羊城杯 2020]RRRRRRRSA

题目:

import hashlib
import sympy
from Crypto.Util.number import *

flag = 'GWHT{*********}'

flag1 = flag[:14]
flag2 = flag[14:]
assert(len(flag) == 27)

P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)

Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)

N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2

E1 = getPrime(1024)
E2 = sympy.nextprime(E1)

m1 = bytes_to_long(flag1)
m2 = bytes_to_long(flag2)

c1 = pow(m1, E1, N1)
c2 = pow(m2, E2, N2)


output = open('secret', 'w')
output.write('N1=' + str(N1) + '\n')
output.write('c1=' + str(c1) + '\n')
output.write('E1=' + str(E1) + '\n')
output.write('N2=' + str(N2) + '\n')
output.write('c2=' + str(c2) + '\n')
output.write('E2=' + str(E2) + '\n')
output.close()

分析

发现这一道题加密的时候用了很大的E1 E2,则其对应的d可能很小,我们尝试着用wiener attack去攻击试一试。

wiener attack

维纳(Wiener)的方法

  • 维纳Wiener提出了一种关于私钥过小时对N 进行分解的一种方式。并给出了证明当

    d < 1 3 N 1 4 d<\frac{1}{3}N^{\frac{1}{4}} d<31N41

    满足时 (还应满足 q < p < 2 q q<p<2q q<p<2q)一定能够分解NN。

在本题中,p,q的生成方式刚好满足 q < p < 2 q q<p<2q q<p<2q这一条件,而E很大对应着可能满足 d < 1 3 N 1 4 d<\frac{1}{3}N^{\frac{1}{4}} d<31N41

例如:
e d = 1 ( m o d φ ( N ) ) ed =1\pmod{\varphi(N)} ed=1(modφ(N))得到 e d = k ∗ φ ( N ) + 1 ed=k*\varphi(N)+1 ed=kφ(N)+1

e φ ( N ) = k d + 1 φ ( N ) \frac{e}{\varphi(N)}=\frac{k}{d}+\frac{1}{\varphi(N)} φ(N)e=dk+φ(N)1

φ ( N ) 非 常 大 \varphi(N)非常大 φ(N), 则 φ ( N ) ≈ N 则\varphi(N)\approx N φ(N)N
所以有 e N − k d = 1 φ ( N ) \frac{e}{N}-\frac{k}{d}=\frac{1}{\varphi(N)} Nedk=φ(N)1

e N ≈ k d \frac{e}{N}\approx\frac{k}{d} Nedk
e N \frac{e}{N} Ne​​进行连分数展开,得到的一串分数的分母很有可能就是d。

其检验就可以通过用已知公钥和加密已知明文,然后用d解密检验一下就可以了。

回到本题中看一看,参数的生成方式:

P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)

Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)

N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2

E1 = getPrime(1024)
E2 = sympy.nextprime(E1)

P 2 与 P 1 很 接 近 , Q 1 与 Q 2 也 很 接 近 , 但 位 数 小 了 很 多 。 N 1 = P 1 ∗ P 1 ∗ Q 1 ① N 2 = P 2 ∗ P 2 ∗ Q 2 ② P2与P1很接近,Q1与Q2也很接近,但位数小了很多。\\N1=P1*P1*Q1①\\N2=P2*P2*Q2② P2P1Q1Q2N1=P1P1Q1N2=P2P2Q2

① / ② 可 得 N 1 N 2 = ( P 1 P 2 ) 2 ∗ Q 1 Q 2 ∵ P 1 < P 2 ∴ N 1 N 2 < Q 1 Q 2 ∵ Q 1 < Q 2 ∴ Q 1 Q 2 ∈ [ N 1 N 2 , 1 ] ①/②可得\\\frac{N1}{N2}=(\frac{P1}{P2})^2*\frac{Q1}{Q2}\\\because P1<P2\\\therefore \frac{N1}{N2}<\frac{Q1}{Q2}\\\because Q1<Q2\\\therefore\frac{Q1}{Q2}\in[\frac{N1}{N2},1] /N2N1=(P2P1)2Q2Q1P1<P2N2N1<Q2Q1Q1<Q2Q2Q1[N2N1,1]

所以尝试对 N 1 N 2 \frac{N1}{N2} N2N1用连分数展开并求各项的渐进分数,其中某个连分数的分母可能就是Q1。

from gmpy2 import *
from Crypto.Util.number import *
N1=28539239760609998188190348006307254423529984523926011298354682217538318221201323233400895681944936240127760319591714405028970789289069319799896668405374649890651532747231344681669678805558659075027847592497103008180667401328194026698749233856463858487096300279373254961880228864461848969277992345170787143090948199697266462389362914238819698112687026213976658417210663710975098053456243238943838516217798558036642447022751111845270483110159293737669560262193958772015914816987850140197853369767380678566336063010710812528919482513791382363881826680659095433918156094107350594201368395060384315773118343026193511099009931177740948978534045707679969732723167077325752299598557383348276880809860413060977442176372544771414690543709674125255716088409107695219200275948083389811120343
c1=1432582014696304280729383293185554513436929310033823269133977593539672022744978340029313742941392672688363895524640351487464959860278576282854691764963077939567531721178912737755379413034164798305484717033762726637503348022397339246940965129765378824268519081645805470821347112369377592502109678876165836108257610182421452838639591697308432137885174692492190957254254995673010537260331832973067691597718100899475899017281060822990010249568584370589711942182283002241043038119931455622397903939297537776804134742442672001638774739818585840571993745726530468147630711418520486306194651956014117679528472239294239116641656014852458465706006398065574504399016286485027421474307531748266141136418468990741046806688381193860509615850629805172129297224123462801586090084637746562423808
E1=165789626975534012040420057284463500775834911397214992496515507176272849770841998477139944440126985014248815418211585858658342524799286016374109756516450870298232454995876047057825952563581619963387275065218691863272435560584657400761485940130783607258311246708485662913432455714363728035174035069036312370233
N2=28539239760609998188190348006307254423529984523926011298354682217538318221201323233400895681944936240127760319591714405028970789289069319799896668405377378062335966544017315329665365256524558696688888741558627244653037221467229159144343040629127843297021870442297090214085287305843208151069804261723045390513830069085816369993597001968164660390663983571269250460727348123970070188870297493687465127551913118724304293942732950040939150438510454614095673775735977217966562306548665616925803946575019193754095625773160561193234183507671760318885800972555685452762447998320093072265818485061557955267533908006243431570323359331106169234651310488306412479972526063665874847216797986275140105142694301359006633212114432527436809944525332728559649659936613255629968696993687582732203577
c2=15573518512630583133605706431375892476846434992703760807266881477212729790675502562405142453118932977842339803883111403869334521098950030048699583130857582338419182841819307757252097704148569218757559761264396801310961344678392000382263595912787825617009851110457692404940207973548999796553024456145274114257889573707649959860997335143214788897776951837248853483762434899857463503651914305981628033038172123120703537802061315610043298426738218704990852775023413248589434394708618489802771255075164976384643287270994751622452142844176084933641827641239534332334446368745588970480750957569438747829980771324981588625047320914720986351721280038816715323656526802000900688313558979941992015923305782197562859553039256619824373010017972420560224632828808074734952385591551175446599133
E2=165789626975534012040420057284463500775834911397214992496515507176272849770841998477139944440126985014248815418211585858658342524799286016374109756516450870298232454995876047057825952563581619963387275065218691863272435560584657400761485940130783607258311246708485662913432455714363728035174035069036312370859
def continuedFra(x, y): #不断生成连分数的项
    cF = []
    while y:
        cF += [x // y]
        x, y = y, x % y
    return cF
def Simplify(ctnf): #化简
    numerator = 0
    denominator = 1
    for x in ctnf[::-1]: #倒叙遍历
        numerator, denominator = denominator, x * denominator + numerator
    return (numerator, denominator) #把连分数分成分子和算出来的分母
def getit(c):
    cf=[]
    for i in range(1,len(c)):
        cf.append(Simplify(c[:i])) #各个阶段的连分数的分子和分母
    return cf #得到一串连分数
def wienerAttack(e, n):
    cf=continuedFra(e,n)
    for (Q2,Q1) in getit(cf):#遍历得到的连分数,令分子分母分别是Q2,Q1
        if Q1 == 0:
            continue
        if N1%Q1==0 and Q1!=1:#满足这个条件就找到了
            return Q1
    print('not find!')
Q1=wienerAttack(N1,N2)
print(N1%Q1)
Q2=next_prime(Q1)
P1=iroot(N1//Q1,2)[0]
P2=next_prime(P1)
phi1=(P1)*(P1-1)*(Q1-1)
phi2=(P2)*(P2-1)*(Q2-1)
d1=invert(E1,phi1)
d2=invert(E2,phi2)
flag1=long_to_bytes(pow(c1,d1,N1))
flag2=long_to_bytes(pow(c2,d2,N2))
print(flag1+flag2)

参考:

https://ctf-wiki.org/crypto/asymmetric/rsa/d_attacks/rsa_extending_wiener/

https://eprint.iacr.org/2015/399.pdf

https://blog.csdn.net/a5555678744/article/details/117701126

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值