RSA杂记

概念性质什么的 

import gmpy2

I = gmpy2.invert(q,p)

mp = pow(c,dp,p)

mq = pow(c,dq,q) #求幂取模运算

m = (((mp-mq)*I)%p)*q+mq #求明文公式

已知  p q dp dq c

来自 <BUUCTF RSA题目全解1_buuctf rsa1-CSDN博客>

dpe=(p-1)x+1

···x∈(1,e)

m=c1^s1*c2^s2 mod n(共模攻击)

gmpy2.gcdext(e1, e2)

e1*s1+e2*s2=gcd(e1,e2)

gcd(e1,e2)=1

来自 <BUUCTF RSA2&RSA3 解题思路及公式推导_buuctf rsa3_拔草能手晓寒的博客-CSDN博客>

1.当M^e < n 时,

 C = M^e ,所以对C开方就能得到M

2. 当M^e > n 时,此时用爆破的方法

 假设我们  M^e / n 商 k 余数为c,

 所以M^e  = k*n + C,对K进行爆破,只要k满足 k*n + C能够开方就可以

由q = next_prime(getPrime(16) * p + 38219)可知,q为p*getPrime(16)+38219的下一个素数,因此getPrime(16)较小,所以我们可以在其取值范围为遍历出符合题目的值,从而解出q。

for i in range(2 ** 15, 2 ** 16):

    if isPrime(i):

        q = next_prime(i * iroot(n // i, 2)[0] + 38219)

        if n % q == 0:

            print(q)

            break

(代码实现)

def chinese_remainder(modulus, remainders):

    Sum = 0

    prod = reduce(lambda a, b: a*b, modulus)

    for m_i, r_i in zip(modulus, remainders):

        p = prod // m_i

        Sum += r_i * (inverse(p,m_i)*p)

    return Sum % prod

#modulus为m1..mk,remainders为余数a1…ak,prod为M,p为Mi,inverse(p,m_i)为Mi的逆元。

(a * x) % m = b

x = (a_inv * b) % m

(乘法逆元的实际应用)

【Crypto】RSA_rsa已知pqe求d_轻闲一号机的博客-CSDN博客(RSA)

已知ned,求k

求p,q

c = m ** e mod n

dp = d mod (p-1)

c**dp = m**(e*dp) mod n

c**dp mod p = m**(e*dp) mod p

e*dp = e*d mod (p-1) = 1 mod (p-1)

c**dp mod p = m**(1+k*(p-1)) mod p

#由费马小定理得 m**(p-1)=1 mod p

#故有pow(c,dp,p) = m mod p

#当然前提是m本身比p小,以最终flag的长度猜测,实际上是符合该条件的

y = 123

g = 2

x = 2019*p**2 + 2020*p**3 + 2021*p**4

c1 = pow(g, x, y)

print "c1 = " + str(c1)

解:

x=sympy.discrete_log(y,c1,g)

刷题

1.RSA Variation II 

from secret import flag
from Crypto.Util.number import *

p = getPrime(1024)
q = getPrime(1024)

N = p*p*q

d= inverse(N, (p-1)*(q-1)//GCD(p-1, q-1))

m = bytes_to_long(flag)

c = pow(m, N, N)

print('c =', c)
print('N =', N)
print('d =', d)

# c = 1653396627113549535760516503668455111392369905404419847336187180051939350514408518095369852411718553340156505246372037811032919080426885042549723125598742783778413642221563616358386699697645814225855089454045984443096447166740882693228043505960011332616740785976743150624114653594631779427044055729185392854961786323215146318588164139423925400772680226861699990332420246447180631417523181196631188540323779487858453719444807515638025771586275969579201806909799448813112034867089866513864971414742370516244653259347267231436131850871346106316007958256749016599758599549180907260093080500469394473142003147643172770078092713912200110043214435078277125844112816260967490086038358669788006182833272351526796228536135638071670829206746835346784997437044707950580087067666459222916040902038574157577881880027391425763503693184264104932693985833980182986816664377018507487697769866530103927375926578569947076633923873193100147751463
# N = 1768427447158131856514034889456397424027937796617829756303525705316152314769129050888899742667986532346611229157207778487065194513722005516611969754197481310330149721054855689646133721600838194741123290410384315980339516947257172981002480414254023253269098539962527834174781356657779988761754582343096332391763560921491414520707112852896782970123018263505426447126195645371941116395659369152654368118569516482251442513192892626222576419747048343942947570016045016127917578272819812760632788343321742583353340158009324794626006731057267603803701663256706597904789047060978427573361035171008822467120148227698893238773305320215769410594974360573727150122036666987718934166622785421464647946084162895084248352643721808444370307254417501852264572985908550839933862563001186477021313236113690793843893640190378131373214104044465633483953616402680853776480712599669132572907096151664916118185486737463253559093537311036517461749439
# d = 20650646933118544225095544552373007455928574480175801658168105227037950105642248948645762488881219576174131624593293487325329703919313156659700002234392400636474610143032745113473842675857323774566945229148664969659797779146488402588937762391470971617163496433008501858907585683428652637958844902909796849080799141999490231877378863244093900363251415972834146031490928923962271054053278056347181254936750536280638321211545167520935870220829786490686826062142415755063724639110568511969041175019898031990455911525941036727091961083201123910761290998968240338217895275414072475701909497518616112236380389851984377079

 考察了Schmidt-Samoa密码系统,[GUET-CTF2019]Uncle Sam(考点:Schmidt-Samoa密码系统)-CSDN博客

exp:

import gmpy2

N =  
#N = p^2*q
d = 
c = 
tmp = pow(2,d*N,N) - 2
pq = gmpy2.gcd(mpz(tmp),N)

m = pow(c,d,pq)
print(bytes.fromhex(hex(m)[2:]))
# flag{l3arn_s0m3_e1ement4ry_numb3r_the0ry}

低P

from Crypto.Util.number import *
import gmpy2
from flag import flag
def gen_prime(number):
    p = getPrime(number//2)
    q = getPrime(number//2)
    return p,q

m = bytes_to_long(flag.encode())
p,q = gen_prime(1024)
print(p*q)
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1))
print(d%(p-1))
print(pow(m,e,p*q))
# 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
# 307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
# 52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089

exp:

from Crypto.Util.number import long_to_bytes
import gmpy2

n = 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
dp = 307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
c = 52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089
e =65537

def dp_leak(dp,c,n,e):
    for i in range(1,e):
        t = (dp * e - 1) % i        
        if t == 0:
            p = (dp * e - 1) // i + 1
            if n % p == 0:
                q = n // p
                d = gmpy2.invert(e,(p-1)*(q-1))
                print(long_to_bytes(pow(c,d,n)))
                
dp_leak(dp,c,n,e)
#flag{cd5ff82d-989c-4fbf-9543-3f98ab567546}

强网杯2022-强网先锋-ASR

题目

from Crypto.Util.number import getPrime
from secret import falg
pad = lambda s:s + bytes([(len(s)-1)%16+1]*((len(s)-1)%16+1))

n = getPrime(128)**2 * getPrime(128)**2 * getPrime(128)**2 * getPrime(128)**2
e = 3

flag = pad(flag)
print(flag)
assert(len(flag) >= 48)
m = int.from_bytes(flag,'big')
c = pow(m,e,n)

print(f'n = {n}')
print(f'e = {e}')
print(f'c = {c}')

'''
n = 8250871280281573979365095715711359115372504458973444367083195431861307534563246537364248104106494598081988216584432003199198805753721448450911308558041115465900179230798939615583517756265557814710419157462721793864532239042758808298575522666358352726060578194045804198551989679722201244547561044646931280001
e = 3
c = 945272793717722090962030960824180726576357481511799904903841312265308706852971155205003971821843069272938250385935597609059700446530436381124650731751982419593070224310399320617914955227288662661442416421725698368791013785074809691867988444306279231013360024747585261790352627234450209996422862329513284149
'''

首先对n进行分解得到4个素数,p、q、r、t,可以使用在线的factordb网站分解,也可以用yafu(使用该工具建议先开方,然后将其值再分解)

p = 225933944608558304529179430753170813347
q = 260594583349478633632570848336184053653
r = 218566259296037866647273372633238739089
t = 223213222467584072959434495118689164399
 

sage脚本如下

import libnum
n = 8250871280281573979365095715711359115372504458973444367083195431861307534563246537364248104106494598081988216584432003199198805753721448450911308558041115465900179230798939615583517756265557814710419157462721793864532239042758808298575522666358352726060578194045804198551989679722201244547561044646931280001
e = 3
c = 945272793717722090962030960824180726576357481511799904903841312265308706852971155205003971821843069272938250385935597609059700446530436381124650731751982419593070224310399320617914955227288662661442416421725698368791013785074809691867988444306279231013360024747585261790352627234450209996422862329513284149
p = 225933944608558304529179430753170813347
q = 260594583349478633632570848336184053653
r = 218566259296037866647273372633238739089
t = 223213222467584072959434495118689164399

R.<x> = Zmod(p)[]
f = x^e-c
f = f.monic()
results1 = f.roots()

R.<x> = Zmod(q)[]
f = x^e-c
f = f.monic()
results2 = f.roots()

R.<x> = Zmod(r)[]
f = x^e-c
f = f.monic()
results3 = f.roots()

R.<x> = Zmod(t)[]
f = x^e-c
f = f.monic()
results4 = f.roots()
for i in results1:
    for j in results2:
        for l in results3:
            for k in results4:
                param1 = [int(i[0]),int(j[0]),int(l[0]),int(k[0])]
                param2 = [p,q,r,t]
                m = CRT_list(param1,param2)
                flag = libnum.n2s(int(m))
                if b'flag' or b'gwb' or b'FLAG' or b'GWB' in flag:
                    print(flag)

强网杯2023——not only rsa

题目

​
from Crypto.Util.number import bytes_to_long
from secret import flag
import os

n = 6249734963373034215610144758924910630356277447014258270888329547267471837899275103421406467763122499270790512099702898939814547982931674247240623063334781529511973585977522269522704997379194673181703247780179146749499072297334876619475914747479522310651303344623434565831770309615574478274456549054332451773452773119453059618433160299319070430295124113199473337940505806777950838270849
e = 641747
m = bytes_to_long(flag)

flag = flag + os.urandom(n.bit_length() // 8 - len(flag) - 1)
m = bytes_to_long(flag)

c = pow(m, e, n)

with open('out.txt', 'w') as f:
    print(f"{n = }", file=f)
    print(f"{e = }", file=f)
    print(f"{c = }", file=f)

​
n = 6249734963373034215610144758924910630356277447014258270888329547267471837899275103421406467763122499270790512099702898939814547982931674247240623063334781529511973585977522269522704997379194673181703247780179146749499072297334876619475914747479522310651303344623434565831770309615574478274456549054332451773452773119453059618433160299319070430295124113199473337940505806777950838270849
e = 641747
c = 730024611795626517480532940587152891926416120514706825368440230330259913837764632826884065065554839415540061752397144140563698277864414584568812699048873820551131185796851863064509294123861487954267708318027370912496252338232193619491860340395824180108335802813022066531232025997349683725357024257420090981323217296019482516072036780365510855555146547481407283231721904830868033930943

sage

​
#sage
from Crypto.Util.number import *

p = 91027438112295439314606669837102361953591324472804851543344131406676387779969
n = 6249734963373034215610144758924910630356277447014258270888329547267471837899275103421406467763122499270790512099702898939814547982931674247240623063334781529511973585977522269522704997379194673181703247780179146749499072297334876619475914747479522310651303344623434565831770309615574478274456549054332451773452773119453059618433160299319070430295124113199473337940505806777950838270849
e = 641747
c = 730024611795626517480532940587152891926416120514706825368440230330259913837764632826884065065554839415540061752397144140563698277864414584568812699048873820551131185796851863064509294123861487954267708318027370912496252338232193619491860340395824180108335802813022066531232025997349683725357024257420090981323217296019482516072036780365510855555146547481407283231721904830868033930943

res = Zmod(n)(c).nth_root(e, all=True)
# print(res)

for m in res:
    flag = long_to_bytes(int(m))
    if b"flag" in flag:
        print(flag)
        break
#flag{c19c3ec0-d489-4bbb-83fc-bc0419a6822a}

​

强网青少赛——未解之谜

题目

from Crypto.Util.number import getPrime, getRandomRange, inverse, bytes_to_long
from gmpy2 import root
from secret import flag


p = getPrime(1024)
q = getPrime(1024)
n = p * q

phi = (p - 1) * (q - 1)
d = phi - getRandomRange(2, int(root(n, 4))) // 8
e = inverse(d, phi)

print('n =', n)
print('e =', e)
print('c =', pow(bytes_to_long(flag), e, n))

"""
n = 25104277676119161522476112705793911276186101133479173238944044444464009124657009694225705909271077799809201079535406029771187080821769825464939077364642964415589149682726638069269303311285936728041400854664257359847513887226478935580304175033826156547132233021300058658354982546861556682763142936482347346981937850032206377127314298996750210542463016619202624387167346335084458869807050799087359137798417551118968333882132707224657634668232656084437165318707402672030846390316318799964502570888352016316259499484840687212162216956553959109504315812401670136366987689573854797204256680114377923495968022852465088943989
e = 20178654515985191683778773315986117381438788487541162528625194682232622732804488937715690749685871993409744005510930308420585745479669138349385107492298100706904329996211024990254138155122883012416834611836914150399764071426903891183064811037874610688800753516815651605274198703402396721086099787022825008576711822311154359274255900798872482666009298170322494751141546145941540881032818218463468104215745893024753697280199179802990999289320485792935099342229022401065822066935230288340988833699778866513151729621894378561772202838242163207916815287677576914310414398842800437151570085615904905893908276037442921399227
c = 17919859480795687548085357946533906742006563498678009884880024066719328584604178565823672582612851264338072607103147445102727569389591915368827826312868652213968050837327044813877938386742395231183072530875013974151364420171911413436696049091197432327690528295737499380220977246385029611858967823050774781344312401574401181366787200767075321779650346958885769663961952777015710540836731205786542415656103087841645510635687411784335649106356843368609597447408986641261723987501544380365356737604262721383825893578507628688434330167951610192310425417890688432557997801981742408687534970307199203734028604303069367331398
"""

维纳攻击:

exp:

# sage
from Crypto.Util.number import *

n = 25104277676119161522476112705793911276186101133479173238944044444464009124657009694225705909271077799809201079535406029771187080821769825464939077364642964415589149682726638069269303311285936728041400854664257359847513887226478935580304175033826156547132233021300058658354982546861556682763142936482347346981937850032206377127314298996750210542463016619202624387167346335084458869807050799087359137798417551118968333882132707224657634668232656084437165318707402672030846390316318799964502570888352016316259499484840687212162216956553959109504315812401670136366987689573854797204256680114377923495968022852465088943989
e = 20178654515985191683778773315986117381438788487541162528625194682232622732804488937715690749685871993409744005510930308420585745479669138349385107492298100706904329996211024990254138155122883012416834611836914150399764071426903891183064811037874610688800753516815651605274198703402396721086099787022825008576711822311154359274255900798872482666009298170322494751141546145941540881032818218463468104215745893024753697280199179802990999289320485792935099342229022401065822066935230288340988833699778866513151729621894378561772202838242163207916815287677576914310414398842800437151570085615904905893908276037442921399227
c = 17919859480795687548085357946533906742006563498678009884880024066719328584604178565823672582612851264338072607103147445102727569389591915368827826312868652213968050837327044813877938386742395231183072530875013974151364420171911413436696049091197432327690528295737499380220977246385029611858967823050774781344312401574401181366787200767075321779650346958885769663961952777015710540836731205786542415656103087841645510635687411784335649106356843368609597447408986641261723987501544380365356737604262721383825893578507628688434330167951610192310425417890688432557997801981742408687534970307199203734028604303069367331398

cf = continued_fraction(Integer(e) / Integer(n))

for i in range(1,10000):
    k = int(cf.numerator(i))
    d = int(cf.denominator(i))
    m = pow(c,-d,n)
    flag = long_to_bytes(int(m))
    if b"flag" in flag:
        print(f"d = {d}")
        print(i)
        print(flag)
        # flag{c30d7177-1bb7-4caf-b602-39f8d2e9792b}
        break

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值