[GKCTF 2021]RRRRsa

题目:

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

首先,观察题目,我们知道了p和q的生成方式,知道了两组数学公式,接下来我们需要做的便是求解两组方程从而得到我们所需的p值和q值:

一、p值求解(p1和q1求解)

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

==>

hint1 = (2020*p1+q1)^202020 mod n1

=>(2020*p1)^202020+q1^202020 mod n1 => (2020*p1)^202020+q1^202020 mod p1

hint2 = (2021*p1+212121)^q1 mod n1 由费马小定理,a^p=a mod p

=>hint2 = (2021*p1+212121)^q1 mod p1(同余转换) =>2021*p1+212121 mod p1

==>目标为消去p1和q1中的一个

(hint2-212121)^202020 = (2021*p1)^202020 mod p1

hint1= (2020*p1)^202020+q1^202020 mod p1

==>令a=(2021^202020)*(2020^202020)

(2020^202020)*(hint2-212121)^202020=a*p1+k1*q1    ——(1)

(2121^202020)*hint1=a*p1+k2*q1                                 ——(2)

两者相减,通过gcd((1)-(2),n1)即可求出我们所需的q1值

#q1 p1求解
hint1_=hint1*gmpy2.powmod(2021,202020,n1)
hint2_=gmpy2.powmod(hint2-212121,202020,n1)*gmpy2.powmod(2020,202020,n1)
q1=gmpy2.gcd(hint1_-hint2_,n1)
print(q1)
p1=n1//q1
phi1=(p1-1)*(q1-1)
d1=gmpy2.invert(e,phi1)
p=gmpy2.powmod(c1,d1,n1)

 二、q值大小求解(p2和q2的求解)

hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)

==>

hint3 = (2020*p2)^202020 + (2021*q2)^202020 mod n2

hint4 = (2021*p2)^212121 + (2020*q2)^212121 mod n2

==>求得相同的p2值前缀 

hint3^212121 = (2020*p2)^(202020*212121) + (2021*q2)^(202020*212121) mod n2

hint4^202020 = (2021*p2)^(202020*212121) + (2020*q2)^(202020*212121) mod n2

2021^(202020*212121)*hint3^212121=a*p2+k1*q2   ——(1)

2020^(202020*212121)*hint4^202020=a*p2+k2*q2   ——(2)

==>相同思路同上,求解

gcd((2)-(1),n2)=q2

#q2 p1求解
hint3_=gmpy2.powmod(hint3,212121,n2)*gmpy2.powmod(2021,212121*202020,n2)
hint4_=gmpy2.powmod(hint4,202020,n2)*gmpy2.powmod(2020,212121*202020,n2)
q2=gmpy2.gcd(hint4_-hint3_,n2)
print(q2)
p2=n2//q2
phi2=(p2-1)*(q2-1)
d2=gmpy2.invert(e,phi2)
q=gmpy2.powmod(c2,d2,n2)

解出我们所需的p值和q值后,通过 m = c^d mod n即可求得我们所需的m值

exp:

import gmpy2
from Crypto.Util.number import *

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

#q1 p1求解
hint1_=hint1*gmpy2.powmod(2021,202020,n1)
hint2_=gmpy2.powmod(hint2-212121,202020,n1)*gmpy2.powmod(2020,202020,n1)
q1=gmpy2.gcd(hint1_-hint2_,n1)
print(q1)
p1=n1//q1
phi1=(p1-1)*(q1-1)
d1=gmpy2.invert(e,phi1)
p=gmpy2.powmod(c1,d1,n1)

#q2 p1求解
hint3_=gmpy2.powmod(hint3,212121,n2)*gmpy2.powmod(2021,212121*202020,n2)
hint4_=gmpy2.powmod(hint4,202020,n2)*gmpy2.powmod(2020,212121*202020,n2)
q2=gmpy2.gcd(hint4_-hint3_,n2)
print(q2)
p2=n2//q2
phi2=(p2-1)*(q2-1)
d2=gmpy2.invert(e,phi2)
q=gmpy2.powmod(c2,d2,n2)

phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
print(long_to_bytes(gmpy2.powmod(c,d,p*q)))



 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: [gkctf 2021]rrrrsa 是一道RSA加密相关的题目,需要解密出明文。具体的解题思路可以参考以下步骤: 1. 首先,我们需要获取到题目中给出的公钥和密文。公钥包括两个参数:n和e,密文为c。 2. 接下来,我们需要对公钥进行分解,得到p和q两个质数。可以使用工具或算法进行分解,比如使用yafu等工具。 3. 然后,我们可以计算出phi(n) = (p-1) * (q-1)。 4. 接着,我们需要求出d,即私钥。可以使用扩展欧几里得算法求解,也可以使用工具进行计算。 5. 最后,我们可以使用私钥d对密文c进行解密,得到明文m。 具体的实现过程可以参考RSA加密算法的原理和实现方法。需要注意的是,在实际的CTF比赛中,可能会对RSA加密算法进行一些变形或者加入一些附加条件,需要根据具体情况进行调整和处理。 ### 回答2: [gkctf 2021]rrrrsa 是 2021年GKCTF信息安全比赛中的一道题目。这是一道RSA算法的题目,题目中给定了两个密文和两个公钥,要求参赛者求出明文。 要解决这道题目,需要对RSA算法有一定的了解,RSA算法是目前公认比较安全的加密算法之一,其基本原理是利用大数的分解难题来实现加密和解密。 在这道题目中,给出了两个密文和两个公钥,首先需要利用公钥将密文解密得到明文,然后用相应的算法求解出两个私钥。在RSA算法中,私钥的求解需要知道两个质数p和q,故需要对公钥进行分解并求出其中的两个质数。一旦求出两个私钥,则可用私钥解密密文得到明文。 在这道题目中,给出的密文是以十六进制表示的大数,而公钥是由两个大质数乘积构成的。根据RSA算法的基本原理,通过对密文使用公钥进行解密,即可得到明文,但需要注意的是,密文和公钥都需要进行处理,才能保证它们能够正确地被计算机所处理。 因此,参赛者需要熟练地掌握RSA算法的原理及应用,同时还需要具备一定的计算机处理能力,才能够成功地解决这道[gkctf 2021]rrrrsa的挑战。 ### 回答3: [gkctf 2021]rrrrsa是一道RSA密码学题目,在这道题目中,我们需要通过分解RSA公钥中的N来找到是否存在两个相同的质因数,从而破解RSA加密的密文,获得明文。 首先,我们可以通过给定的公钥N、e和密文c,利用RSA加密算法求出c的解密结果m。但是,这样显然并不是题目要求我们做的事情,因为我们无法知道RSA公钥中的质数。 那么,如何判断公钥中是否存在两个相同的质数呢?我们可以利用RSA加密算法的一个性质:当我们选择两个质数p和q,然后对它们进行乘法运算得到N时,我们再进行分解N时能得出的两个质数就是p和q。 因此,我们可以对给定的公钥N进行分解得到它的质数因子p和q,如果存在两个质因子相等,则说明存在两个相同的质数,这就意味着我们可以破解RSA加密的密文。 具体地说,在这道题目中,我们可以利用Python的gmpy2工具库中的下列函数来分解公钥N: gmpy2.factor(n) 接着,我们可以利用Python脚本进行以下步骤: 1. 读入给定的公钥N,调用函数factor分解出p和q; 2. 计算φ(N) = (p-1)*(q-1); 3. 计算d = e^-1 mod φ(N); 4. 调用Python库中的pow函数计算c^d mod N,得到明文m。 最后,我们就能够通过这些步骤,破解出RSA加密的密文c,获得明文m,完成这道[gkctf 2021]rrrrsa的挑战。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值