LitCTF-Polynomial_plus

今天看了一题,然后借鉴了一下一些师傅的题解。

题目是这样的

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)

while True:
    k = getRandomNBitInteger(64)
    p = k**10 + 22*k**8 + 53*k**6 - 22*k**4 - 39*k**2 + 114514
    q = k**9 + 10*k**7 - 13*k**6 - 2*k**4 + 111*k**2 + 1919810
    if isPrime(p) and isPrime(q):
        e = 65537
        n = p * q
        c = pow(m,e,n)
        print(f"n = {n}")
        print(f"c = {c}")
        break

'''
n = 343424787688946710828788193478518340184635630498236346907606509763011890082198311173501834898393322176325060349656021994088578448585570427399686920253145504431065451412326430233084073651599248661762036671841142048573051549474182586297565046285161375600990596119448538118327240405957845178956427810835797220204485242640945891970398041508724313442375608608662117158013
c = 300097152084696274516003269451037367405899874736667089358316145472977115856239312841307278390995620995063953407731245808077915106161525019835875978698148238617148929170257141762407514139479267867121064342168993486529889088067645866930029787500052390195406519896658384623575160091828173111087120708969655686251340535134778177193882787257773427670338018428731395437974
'''

总之就是两个多项式,一般我们碰到Polynomial题型,都是用sage来求根,这边好几题都是这样。

我们把k解决,然后欧拉函数就可以知道了

from Crypto.Util.number import *
import gmpy2
e=65537
n=343424787688946710828788193478518340184635630498236346907606509763011890082198311173501834898393322176325060349656021994088578448585570427399686920253145504431065451412326430233084073651599248661762036671841142048573051549474182586297565046285161375600990596119448538118327240405957845178956427810835797220204485242640945891970398041508724313442375608608662117158013
c=300097152084696274516003269451037367405899874736667089358316145472977115856239312841307278390995620995063953407731245808077915106161525019835875978698148238617148929170257141762407514139479267867121064342168993486529889088067645866930029787500052390195406519896658384623575160091828173111087120708969655686251340535134778177193882787257773427670338018428731395437974
PR.<k> = PolynomialRing(ZZ)
p = k ** 10 + 22 * k ** 8 + 53 * k ** 6 - 22 * k ** 4 - 39 * k ** 2 + 114514
q = k ** 9 + 10 * k ** 7 - 13 * k ** 6 - 2 * k ** 4 + 111 * k ** 2 + 1919810
n0=p*q
f = n - n0
sol = f.roots()
x = sol[0][0]
p = p(x)
q = q(x)
d = inverse_mod(e, (p-1)*(q-1))
m = pow(c, d, n)
print(long_to_bytes(int(m)))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值