Crypto RSA中的数学技巧

闲聊两句

之前做到[GKCTF 2021]RRRRsa的时候遇到过这种问题,就是去构造hint和p,q的关系,感觉也没啥好说的,就是去想、去试,当时也没啥记录,没想到这次2021东华杯遇到了老朋友,感觉有必要写篇文章总结下了。

问题解析

先看[GKCTF 2021]RRRRsa

from Crypto.Util.number import *
from gmpy2 import gcd
import gmpy2
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

很显然,要解决的问题就是联立hint1和hint2,解出{p1,q1},hint3和hint4同理

前一组可以通过

q1 = gcd(n1,(hint1*pow(2021,202020,n1))%n1-(pow(2020*(hint2-212121),202020,n1))%n1)

原因是

hint1*2021^{202020}=(2020 * p1 + q1)^{202020}*2021^{202020}=(2020*2021*p1)^{202020}(mod\ q1)

(2020*(hint2-212121))^{202020}=(2020*2021*p1)^{202020}(mod\ q1)

那么上面这两个式子相减就是q1的倍数,或者说该式子和n的最大公因数是q1(在这里就是)

q2 = gcd(n2,pow(hint3*pow(2021,202020,n2),212121,n2) - pow(hint4*pow(2020,212121,n2),202020,n2))

q2类似,也是通过mod p2来看两个hint之间的关系,然后用拓展欧几里得算法得到n和组合出来的式子之间的最大公因数。

这道题还算是比较仁慈的

东华杯fermat's revenge

这道题和上面这道可以说是表兄弟,甚至算式的结构很像

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,其他结构都是正常的RSA

这下没法联立hint来借其中一个因数了,但是思想还是类似的——mod 其中一个因数看看规律

hint=1011^{q}(mod\ p)

但是只有一个hint,不容易想出来下面的式子(不过能用的数字和变量就那么多,遍历试试还是能试出来一个合适的)

1011^{N}=1011^{p*q}=1011^{q}(mod\ p)

这两个式子和n求最大公因数就可以得到n的分解了

就能拿到最后的flag

总结

这类问题比较好识别,一般会给一个hint,它和p和q之间有直接关系。

至于解法。。按照我现在的经验,一般都是尝试mod p或者mod q看一下,利用已知的条件,在同余式中消去另一个因数,建议把题目给的条件组合组合,在我们规定的mod p或者mod q的条件下,看看都是什么结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值