RSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA

[GKCTF 2021]RRRRsa 1

题目描述:

from Crypto.Util.number import *
from gmpy2 import gcd

flag = b'xxxxxxxxxxxxx'
p = getPrime(512)
q = getPrime(512)
m = bytes_to_long(flag)
n = p*q
e = 65537
c = pow(m,e,n)
print('c={}'.format(c))

p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1*q1
e1 = 65537
assert gcd(e1,(p1-1)*(q1-1)) == 1
c1 = pow(p,e1,n1)
print('n1={}'.format(n1))
print('c1={}'.format(c1))
hint1 = pow(2020 * p1 + q1, 202020, n1)
hint2 = pow(2021 * p1 + 212121, q1, n1)
print('hint1={}'.format(hint1))
print('hint2={}'.format(hint2))

p2 = getPrime(512)
q2 = getPrime(512)
n2 = p2*q2
e2 = 65537
assert gcd(e1,(p2-1)*(q2-1)) == 1
c2 = pow(q,e2,n2)
hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)
print('n2={}'.format(n2))
print('c2={}'.format(c2))
print('hint3={}'.format(hint3))
print('hint4={}'.format(hint4))

#c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
#n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
#c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
#hint1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
#hint2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
#n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
#c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
#hint3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
#hint4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513

题目分析:

  • e,c知道,p,q不知,可知后面的的都是为求p,q做准备,事实上也确实是这样

c1 = pow(p,e1,n1)
c2 = pow(q,e2,n2)
将q,p都看成明文,那么:
p = pow(c1,d1,n1)
q = pow(c2,d2,n2)
其中:
d1 = gmpy2.invert(e,(p1 - 1) * (q1 - 1))
d2 = gmpy2.invert(e,(p2 - 1) * (q2 - 1))

c1,n1,c2,n2都已知,要求p,q,最终要知道p1,q1,p2,q2
没有过多信息了,那么p1,q1,p2,q2的求解只能靠hint1,hint2,hint3,hint4,这4个提示来求解

hint1 = pow(2020 * p1 + q1, 202020, n1)
hint2 = pow(2021 * p1 + 212121, q1, n1)

hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)
  • 一般这种都是要找到某些特殊关系然后再与某个数进行gcd得到p或q
  • 以下为推导式:

    RSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA_第1张图片
  • q1,q2出来了,那么p1,p2也就出来了,那么d1,d2也就出来了,最终p,q也就出来了
import gmpy2
from Crypto.Util.number import *
e = 65537
c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
h1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
h2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
h3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
h4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513
x1 = (h1 * pow(2021,202020,n1)) % n1
x2 = pow(h2 - 212121,202020,n1) * pow(2020,202020,n1) % n1
q1 = gmpy2.gcd(n1,x1 - x2)
p1 = n1 // q1
x3 = pow(h3 * pow(2021,202020,n2),212121,n2) % n2
x4 = pow(h4 * pow(2020,212121,n2),202020,n2) % n2
q2 = gmpy2.gcd(n2,x3 - x4)
p2 = n2 // q2
phi1 = (q1 - 1) * (p1 - 1)
phi2 = (q2 - 1) * (p2 - 1)
d1 = gmpy2.invert(e,phi1)
d2 = gmpy2.invert(e,phi2)
p = pow(c1,d1,n1)
q = pow(c2,d2,n2)
n = p * q
phi = (p - 1)*(q - 1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

东华杯fermat’s revenge

(注:在别人wp中翻到的题,也是与数论推导有关,记录一下)

题目描述:

from Crypto.Util.number import *
f = open('flag.txt', 'rb')
m = bytes_to_long(f.read())
f.close()
e = 65537
p = getPrime(1024)
q = getPrime(1024)
n = p * q
c = pow(m, e, n)
hint = pow(1010 * p + 1011, q, n)
f = open('cipher.txt', 'w')
f.write(f'n={n}\n')
f.write(f'c={c}\n')
f.write(f'hint={hint}\n')
f.close()

题目分析:

 hint = pow(1010 * p + 1011, q, n)

不想再打字了,看看大佬写的吧(讲得很清楚):
RSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA_第2张图片

2019-AceBear Security Contest-babyRSA

题目描述:

from Crypto.Util.number import *
from secret import flag
 
m = bytes_to_long(flag)
 
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 65537
 
c = pow(m, e, n)
 
print(n)
# 132991872691788324082134861997953579720626276400340540687013665099477551458348129102088618361745158673111757871083783880384786818716675179609957267487624993539275409316283860268944400754318665280566429956092526555947286266806591767802818223484766666271142927737412289284611614382748008696676464334157695348471
 
print(c)
# 51298575439582965784709335152059190835305126166438646589369499569428503835480418841408132266294091481013029021796067865137829386370176771358549523435135941877535688535317287350930103706346511719290416785053872504275498831270025102211793188751664805369414883387849038010293938521738911310864582949611581363258
 
print(pow(p+q, 2019, n))
# 116622952696503724444465816906812927416603315297598995734109952470693593204299624097288573735780464942963720997719694033378973971604112334413336782598075611956878592757766346915810900585142701963781432186914454664547551508332077962977944352243565906344660561255453917679867097810681750809061744116605905787747
 
print(pow(p+2019, q, n))
# 46935581819524717607675319301313485106684889957138298327245990937934310422542055504175491111118389178173005337213903985686712577881019021348501335888175248295397612880683801733649468701485843002169345784241756189697901370624950199354359977266595488202827970067500373575114835718127956891051157026649793602861

题目分析:

  • 不得不说三题下来,难度依次递减,前面的看的懂的话,这题就很容易了:

h1 = pow(p + q, 2019, n)
h2 = pow(p + 2019, q, n)

  h2 = pow(p + 2019, q, n)
  h2 = (p + 2019) ^ q % n
  ---> 小费马 a ^ p = a mod p (p为素数,a不为p的倍数)
  h2 = (p + 2019) % q
  
  h1 = pow(p + q, 2019, n)
  h1 = (p + q) ^ 2019 % n
  ---> 二项式定理展开后 mod q
  h1 = p ^ 2019 % q                       ①
  (h2 - 2019) ^ 2019 = p ^ 2019 % q       ②
  
  ① - ② = k * q
  gcd(① - ②,n) = q
  • 解题代码如下:
import gmpy2
from Crypto.Util.number import *
e = 65537
n = 132991872691788324082134861997953579720626276400340540687013665099477551458348129102088618361745158673111757871083783880384786818716675179609957267487624993539275409316283860268944400754318665280566429956092526555947286266806591767802818223484766666271142927737412289284611614382748008696676464334157695348471
c = 51298575439582965784709335152059190835305126166438646589369499569428503835480418841408132266294091481013029021796067865137829386370176771358549523435135941877535688535317287350930103706346511719290416785053872504275498831270025102211793188751664805369414883387849038010293938521738911310864582949611581363258
h1 = 116622952696503724444465816906812927416603315297598995734109952470693593204299624097288573735780464942963720997719694033378973971604112334413336782598075611956878592757766346915810900585142701963781432186914454664547551508332077962977944352243565906344660561255453917679867097810681750809061744116605905787747
h2 = 46935581819524717607675319301313485106684889957138298327245990937934310422542055504175491111118389178173005337213903985686712577881019021348501335888175248295397612880683801733649468701485843002169345784241756189697901370624950199354359977266595488202827970067500373575114835718127956891051157026649793602861
p = gmpy2.gcd(h1 - pow(h2 - 2019,2019,n),n)
q = n // p
n = p * q
phi = (p - 1)*(q - 1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

收获:

  • 数字太大的话模上nRSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA_第3张图片
    我认为这个解答我能接受

  • 这些题挺好的,值得记录

  • 附赠:
    RSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA_第4张图片
    RSA数论推导经典三题 [GKCTF 2021]RRRRsa 1 & 东华杯fermat‘s revenge & 2019-AceBear Security Contest-babyRSA_第5张图片

你可能感兴趣的:(密码RSA,python,buuctf,密码学,安全,python)