0%

BUUCTF 每日打卡 2021-5-9

BUUCTF 每日打卡 2021-5-9

引言

今天的红帽杯,集体摸鱼我是没想到的 第一道 crypto 本质上是一个格密码问题(求助别人) 第二道是椭圆曲线加密(直接放弃)

you_raise_me_up

加密代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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

最后一个有点像 RSA 加密最后一步 没什么思路,就去找 wp 了 原来是一道离散对数题 在这里插入图片描述 对于没学过群论的我来说,一些概念需要补充 群的阶: 参考知乎文章 首先是群元素的阶: 在这里插入图片描述 下面是两个例子: 在这里插入图片描述 循环群的阶(在加密中一般都考虑循环群)就是指: 在这里插入图片描述 而什么是循环群?举一个例子就是整数模 n ,容易发现在模 n 的情况下 1 和 n+1 是相等的,就像循环一样 光滑数: 参考 wiki 在这里插入图片描述 讲的很明白了

然而上面两个概念这道题不需要知道 ctfwiki 提供了暴力破解的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *

m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
n = pow(2, 512)

def bsgs(g, y, p):
m = int(pow(p - 1, 1/2))
S = {pow(g, j, p): j for j in range(m)}
gs = pow(g, p - 1 - m, p)
for i in range(m):
if y in S:
return i * m + S[y]
y = y * gs % p
return None
flag = bsgs(m, c, n)
print(long_to_bytes((flag)))

然而跑了几分钟没有反应 如 wp 所述,建议用 sympy 库求解:

1
2
3
4
5
6
7
8
9
from Crypto.Util.number import *
import sympy

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

flag = sympy.discrete_log(2**512,c,m)
print(long_to_bytes(flag))

结果为:flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}

结语

嘛,还差得远呢 希望继续坚持

欢迎关注我的其它发布渠道

-------- 本文结束 感谢阅读 --------