BUUCTF·[网鼎杯 2020 青龙组]you_raise_me_up·WP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4wAiFv1-1668692997009)(assets/image-20221117212737-4mr370b.png)]​

BUUCTF在线评测 (buuoj.cn)

附件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
import random

n = 2 ** 512
m = random.randint(2, n-1) | 1
c = pow(m, bytes_to_long(flag), n)
print 'm = ' + str(m)
print 'c = ' + str(c)

# m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
# c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499

分析

从附件的代码我们可以找到关键字:flag(c = pow(m, bytes_to_long(flag), n))

很明显这里的n不是质数,那么这道题就不是rsa了,查了一下这道题是离散对数问题

那么根据离散对数的原理

c = pow(m, bytes_to_long(flag), n)

mflag ≡ c (mod n)

求解离散对数可以使用python的sympy库,其中的discrete_log函数

已知条件:

n = 2 ** 512
m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499

解题脚本:

from sympy.ntheory import discrete_log
import binascii
n = 2 ** 512
m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
flag_dec = discrete_log(n,c,m) #得到flag的十进制值
flag_hex=hex(flag_dec)
print(flag_hex)
print(binascii.a2b_hex(flag_hex[2:]))

拿到flag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CnlR9s3r-1668692997010)(assets/image-20221117214808-l0kojf1.png)]​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值