记一道与多项式环有关的题

大佬推荐的,题目:

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

flag = b'xxx'
t = len(flag)//3
part1 = bytes_to_long(flag[:t])
part2 = bytes_to_long(flag[t:2*t])
part3 = bytes_to_long(flag[2*t:])
q = getPrime(1024)
p = next_prime(q)
n = p * q

o = getPrime(11)
r = pow(part1, o, p)
z = pow(part2, o, p)

h1 = (13 * o + 14 * r + r * z + o * z ** 13) % p
h2 = (o ** 13 + r ** 12 + 3 * o * r + o * z * 233) % p
h3 = pow(part3,65537,n)

print(f'n = {n}')
print(f'h1 = {h1}')
print(f'h2 = {h2}')
print(f'h3 = {h3}')

# n = 10850335281775104384842309756387507121367947910896225110655535291748404338588972388693259827067445607230128971155491201985083085890729703137967791325100758142692285049056390126354246953310462082980059949946896088251642305978444680455930662301007461492978866538439458231120357274252592800042668860820459885960472737650446805378098344941597805604577797736381125259746781740429143953876454912647201590679786164678547559344304709889497251430904453036692562053570137262921657887410908992378188055660327282373869435308218926170927366572909858720457530661616332620263301130036238239402855045548920085800254012799063199438351
# h1 = 68971374440570454964336249870184699116849273092766598492393855724166755705038579719086135125490382149633066088736614770735555426661202444613481222308690955829177344713094803125405000495549811601138114210065623933916822257443366983845366477473811412048210602195672314631662681949260715610527325398006214477393
# h2 = 89557070262276493140173989636483552685176823962865601733383032051273942127575151309428084885522955047935745792156087951603894535351765100905696886714983834431355512680521411571740092935206188975497781396247799052916245218545834226095135276633422884113241438747017792108934964361391672183324214279475682695463
# h3 = 1311626365146856567785446974305480952394390450877042514912868019585929680223703697129400820765966547191027907141852232429577556122050933660875292235305985538892538821817570539411355339774474418018682334787217004485252794403892893871864009361554731318803763221581009731474777526380398647174787569510518293833348676730943915073911916070766302422834190969513630361764429111809259665372926096307389623440860840605142551951919723403665762066543095024186705959708920942727754417048332722263643582752118944418881587666520088786189326167958303315156763867706697503512512849397447463575294489956813935149823414834222869976238

解题思路:

  1. 因p、q相近,对n直接开方不断寻找下一个素数直至能被n整除,即得到了p
  2. 根据h1和h2求出r和z

着重讲第二步:

有下面关系:

$h1 = (13 \cdot o + 14 \cdot r + r \cdot z + o \cdot z^{13}) mod p$
$h2 = (o^{13} + r^{12} + 3 \cdot o \cdot r + o \cdot z \cdot 233) mod p$

对h2进行转化:

$o \cdot z \cdot 233 = (h2 - o^{13} - r^{12} - 3 \cdot o \cdot r) mod p$

$z = (h2 - o^{13} - r^{12} - 3 \cdot o \cdot r)\cdot (233 \cdot o)^{-1} mod p$

对于该等式,若o已知,那么z是一个在p下的关于r的等式。

接着利用h1构建域为p的多项式环,同样是在o已知的基础上:

$f = 13 \cdot o + 14 \cdot r + r \cdot z + o \cdot z^{13} - h1$

由于$o = getPrime(11)$,我们可以进行爆破(次数有那么高,从头爆破估计会很慢,事实确实如此,可以逆向爆破)

具体思路代码可以参考大佬:

CTF Crypto — orz!_3tefanie丶zhou的博客-CSDN博客


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1666739907@qq.com
github