2023DASCTF X 0psu3十一月挑战赛
GeneratePrime
解最多的题,但我不会做。赛后一看wp,好啊原来是原题。研究一下原理,感觉确实难度可以。
题目
1 |
|
分析
参考博客 \[n=(p^4+p^3+p^2+p+1)\cdot p\cdot r\]
\[p^5-1=(p-1)\cdot(p^4+p^3+p^2+p+1)=(p-1)\cdot q\]
构造一个阶为\(p^5-1\)的域,利用其生成元\(g\)计算\(g^n\)的阶。
\[order(g^n)=\frac{p^5-1}{gcd(n,p^5-1)}=\frac{p^5-1}{q}=p-1\]
对于阶的定义,我们可以得到阶为\(p-1\)的任意元素\(a\)满足\(a^{p-1}=1\),\(1\)指幺元。
参考上述博客,应用群环域的性质得到\(g^n=ax^2+bx+c\),即表示成度最大为二的多项式。
结合上述两式写成如下形式: \[(0x^2+0x+c)^{p-1}=1,c \in (0,p)\]
此时用到另一条性质,阶为\(p-1\)的元素个数为\(\phi(p-1)\)个,而\(c\)的取值个数要大于\(\phi(p-1)\)个,因此\(g^n\)只能由常数产生。
至此上述的分析都是在阶为\(p^5-1\)的环上进行的讨论,而实际当中我们并没有p,倘若构造出模\(n\)的环,那么在该环上计算得到的\(g^n\)的一次项和二次项系数应该都是\(kp\),这样再与\(n\)求解gcd即可。
exp
1 |
|
FindPrime
没啥意思,就嗯缝,agcd+amm
1 |
|
exp
1 |
|
MathFactor1
题目
1 |
|
思路一
给了\(p^{21}+q^{17}\)的低位,相当于给了一组剪枝条件,从低位开始爆破即可,最后得到的p_list
都不算长,遍历一下通过coppersmith
打一个高位就可。这是官方wp给的解法,用剪枝确实不好想,给了这样一个限制剪枝效果确实挺好。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50def get_pq(n,d1):
a = [0]
b = [0]
maskx = 1
maskn = 2
for i in range(300):
nbit = n % maskn
t_a = []
t_b = []
for j in range(len(a)):
for aa in range(2):
for bb in range(2):
d=d1% maskn
tmp2 = n % maskn
tmp_p=(aa * maskn // 2 + a[j])
tmp_q=(bb * maskn // 2 + b[j])
tmp1 =(tmp_p**21+tmp_q**17) % maskn
tmp3=(tmp_p*tmp_q)%maskn
if tmp2 == tmp3:
if tmp1==d:
t_a.append(aa * maskn // 2 + a[j])
t_b.append(bb * maskn // 2 + b[j])
maskx *= 2
maskn *= 2
a = t_a
b = t_b
return a,b
n=89049581381915401856270440494182068395799559452947499744642830361236578373835725708887668528820916651578050248209041339369091828040992115394942524278397293747808840107939504743946806866214713225533666120894844131211241905215662457238793580469827973839976134854993162976454283311566973255659612267446150515233
e=65537
c=16305239798028293699632813396005973660370581911030264211210444559974188415332021689054795983319112132645051076901780239982290095820283651929773925636804434706351474493000010749679965744672518110692104573489299874390925347271040454693791271882869477780584606934066152476594086178041874762147934091597942667138
d1=1253867202722198232827428701701674148965306906567632781415318063046179456643047348348144258
p_list,q_list=get_pq(n,d1)
R.<x>=Zmod(n)[]
for p_ in p_list:
f=p_+pow(2,299)*x
f1=f.monic()
r=f1.small_roots(X=2^214,beta=0.49)
if r:
p=f(r[0])
p=int(p)
print(p)
assert isPrime(p)
q=n//p
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
flag=long_to_bytes(int(m))
print(flag)
break
思路二
通过解模\(2^{300}\)的方程来得到可能的低300位p,\(d=p^{21}+q^{17}\),再遍历求高位即可。
1 |
|