week 8

针对青龙杯2020“you raise me up"的学习

题目如下:

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

这题就是显而易见已知m,n,c,c等于m^flag模n,但是这个n非常非常大,直接爆破显然有些不合理,因此通过查询得知这题是一个离散对数问题,在sympy库里有很多解决离散对数的问题,这里采用discrete_log函数直接解决(注:dsicrete_log(x,y,z)中,x是模数,y是余数,z是底数),从而得到flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}。

m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
n=2**512
import sympy
import binascii
flag=sympy.discrete_log(n,c,m)
print(binascii.unhexlify(hex(flag)[2:]))

但是显然这题不能到这里就结束了,针对其他的离散对数问题,也深入学习了一下

1.BSGS(小步大步算法)

目前存在一个问题:A^x\equiv B\left ( modP \right ),求解x

我们已知A^{_{P-1}}\equiv 1\left ( modP \right )

则P-1就是最小的阶,设已知一个数m,我们不妨把x表示成x=mi-j,且j\in [1,m-1],所以会存在

A^{mi-j}\equiv B(modP)

A^{mi}\equiv A^{j}B(modP)

此时直接爆破i和j即可。

2.pohlig-hellman算法(复杂度高于BSGS)

设存在质数PA^x\equiv B\left ( modP \right )

目前已知A^{_{P-1}}\equiv 1\left ( modP \right )

设其原根为G,则使G^{a_{i}}=A,G^{b_{i}}=B

则有G^{a_{i}x}\equiv G^{b_{i}}(modP)\Rightarrow G^{a_{_{i}}x}-G^{b_{i}}=P*K\Rightarrow G^{P-1}-1=K{}'*P\Rightarrow G^{a_{_{i}}x}-G^{b_{i}}=K/K{}'*(G^{P-1}-1)

 也即G^{b_{i}}(G^{a_{i}x-b_{i}}-1)=K/K{}'(G^{P-1}-1)

a_{i}x-b_{i}//p-1\Rightarrow a_{i}x\equiv b_{i}(modP-1)

即求ai,bi。

此时进行素数分解\rho (P)=P-1

P-1=P_{1}^{K1}P_{2}^{K2}...P_{m}^{Km}

将X写作P_{i}进制,使得每一个因数都不大于P_{i}

 X=P_{i}^{0}a_{0}+P_{i}^{1}a_{1}+......+P_{i}^{Ki-1}a_{Ki-1}

原式化成(a^{x})^{(p-1)/p_{i}^{r}}\equiv b^{(p-1)/p_{i}^{r}}(modP)

展开Xa^{a_{0}\frac{p-1}{p_{i}^{r}}}*a^{a_{1}*\frac{p-1}{p_{i}^{r-1}}}......\equiv b^{\frac{p-1}{p_{i}^{r}}}(modP)

令r=1.则前一项后的所有项均为一(费马小定理),从而可得到a0,以此类推,得到ai的值

从而得到X的值,最后可得m个关于X的式子,运用中国剩余定理可解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值