[鹤城杯 2021]BabyRSA

学习sage用法 学习p高位泄露

chall.py

from Crypto.Util.number import getPrime, bytes_to_long
from secret import flag

p = getPrime(1024)
q = getPrime(1024)
n = p * q
e = 65537
hint1 = p >> 724
hint2 = q % (2 ** 265)
ct = pow(bytes_to_long(flag), e, n)
print(hint1)
print(hint2)
print(n)
print(ct)
"""
hint1 = 1514296530850131082973956029074258536069144071110652176122006763622293335057110441067910479
hint2 = 40812438243894343296354573724131194431453023461572200856406939246297219541329623
n = 21815431662065695412834116602474344081782093119269423403335882867255834302242945742413692949886248581138784199165404321893594820375775454774521554409598568793217997859258282700084148322905405227238617443766062207618899209593375881728671746850745598576485323702483634599597393910908142659231071532803602701147251570567032402848145462183405098097523810358199597631612616833723150146418889589492395974359466777040500971885443881359700735149623177757865032984744576285054725506299888069904106805731600019058631951255795316571242969336763938805465676269140733371287244624066632153110685509892188900004952700111937292221969
ct = 19073695285772829730103928222962723784199491145730661021332365516942301513989932980896145664842527253998170902799883262567366661277268801440634319694884564820420852947935710798269700777126717746701065483129644585829522353341718916661536894041337878440111845645200627940640539279744348235772441988748977191513786620459922039153862250137904894008551515928486867493608757307981955335488977402307933930592035163126858060189156114410872337004784951228340994743202032248681976932591575016798640429231399974090325134545852080425047146251781339862753527319093938929691759486362536986249207187765947926921267520150073408188188
"""

这里p给了高300bit q给了低265bit
有个很巧妙的推导image
这样就可以得到p的低265bit
我们想要通过sage解出中间未知的bit
此时如果直接sage解 会出现问题:
image
这里index out of range就是解不出根
看了看网上说要已知>=570bit 所以我们还需要枚举>=5bit

two265 = 2**265
n = 21815431662065695412834116602474344081782093119269423403335882867255834302242945742413692949886248581138784199165404321893594820375775454774521554409598568793217997859258282700084148322905405227238617443766062207618899209593375881728671746850745598576485323702483634599597393910908142659231071532803602701147251570567032402848145462183405098097523810358199597631612616833723150146418889589492395974359466777040500971885443881359700735149623177757865032984744576285054725506299888069904106805731600019058631951255795316571242969336763938805465676269140733371287244624066632153110685509892188900004952700111937292221969
pp=133637329398256221348922087205912367118213472434713498908220867690672019569057789598459580116381660337896625098556368545248196507626349729706457101126024168716571826358365042526770728843351292981722231975708177064106134661389148866193795283769334725490165401865964607228639621048516044804458648084762954673495
PR.<x> = PolynomialRing(Zmod(n))
for i in range(2**6):
    f = pp+x*two265*2**6
    f=f.monic()
    px=f.small_roots(X=2^453,beta=0.4)
    if(px):
        break
    pp+=two265
p = pp+px[0]*64*two265
assert n%p == 0
print(p)

注意sage求解的固定方式

  • PR. = PolynomialRing(Zmod(n))
  • f = ...
  • f = f.monic()
  • f.small_roots(X=2^453,beta=0.4)

具体的small_roots参考官方文档

解出p后就easy了
image

posted @ 2023-10-22 17:24  N0zoM1z0  阅读(272)  评论(0编辑  收藏  举报