巅峰极客 2024 CryptoWp

backdoor++++++++++++++

给了原始签名恶意签名的r,可以看作为p1的x坐标

已知椭圆曲线参数可以恢复p1该点,利用原始签名的p1=k1*G可以计算出恶意签名中的

z = (k1 - w * t) * G + (-a * k1 - b) * Y

= p1 - w * G - a * X * p1 - b * Y

从而绕过k1直接得到z

rsa部分p为k2后第99个素数,q为第100素数,可以得到p,q,但flag为42字节,p*q为320比特,还需要爆破填充一下。

import tqdm
import hashlib
import gmpy2
from Crypto.Util.number import *
a, b, w, X = 751818, 1155982, 908970521, 20391992
message1 = b'It sounds as though you were lamenting,'
message2 = b'a butterfly cooing like a dove.'
hash_message1 = int(hashlib.sha1(message1).hexdigest(), 16)
hash_message2 = int(hashlib.sha1(message2).hexdigest(), 16)

n = 6277101735386680763835789423176059013767194773182842284081
c_a, c_b = -3, 2455155546008943817740293915197451784769108058161191238065
c_p = 6277101735386680763835789423207666416083908700390324961279

E = EllipticCurve(GF(c_p), [c_a, c_b])
G = E(602046282375688656758213480587526111916698976636884684818,
      174050332293622031404857552280219410364023488927386650641)
r = 6052579169727414254054653383715281797417510994285530927615
PR.<y> = Zmod(c_p)[]
f = y*y-r**3-c_a*r-c_b
res = f.roots()
for  y in res:
    k1_G = E(r, y[0])
    Y = X * G
    z = k1_G - w * G - a * X * k1_G - b * Y
    k2 = int(hashlib.sha1(str(z[0]).encode()).hexdigest(), 16)
    p = k2
    for i in range(99):
        p = gmpy2.next_prime(p)
    q = gmpy2.next_prime(p)
    e = 65537
    phi = (p - 1) * (q - 1)
    c = 1294716523385880392710224476578009870292343123062352402869702505110652244504101007338338248714943
    flag = int(pow(c, inverse_mod(e, phi), p * q))
    for i in tqdm.tqdm(range(300000)):
        flag += int(p * q)
        m = long_to_bytes(int(flag))
        if b'flag' in m:
            print(m)
            break
        if len(m) > 42: break
# b'flag{0c75afae-f8ad-4df1-b2d9-a9ca348cb226}'

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mxx307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值