2024CISCN

第一次打国赛,只会两个签到题,求放过

Crypto

古典密码

1
AnU7NnR4NassOGp3BDJgAGonMaJayTwrBqZ3ODMoMWxgMnFdNqtdMTM9

我们观察这一串字符,猜测使用了base64换表,进行解密,发现出问题了

我们使用随波逐流脚本工具,对其进行一个一个的暴力猜测,最后发现使用Atbash解密,获得一串字符串

1
ZmF7MmI4MzhhLTk3YWQtZTlmNzQzbGdiYjA3LWNlNDctNmUwMjgwNGN9

然后我们用base64进行解密,得到:fa{2b838a-97ad-e9f743lgbb07-ce47-6e02804c}

发现已经出现了fa和括号的形式,所以我们用栅栏解密进行破解,栅栏栏数为2

得到最后的flag:flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}

OvO

首先我们观察题目,题目遮住了e的200个最低位,所以我们已知e的最高位,而我们题目中的kk是可以通过直接作除法得到的,我们利用n比p和q大得多的性质,直接近似计算出我们的

然后我们尝试去化简我们题目中给出的式子:

然后我们对两边做乘以p的操作,就可以对其进行化简了

这样我们就可以做近似处理了,我们发现整个式子,只有p是未知的,我们已知kk和n,然后e的高位,所以我们可以根据该方程求解出我们的p的高位,然后再使用p高位泄露破解我们的n就可以了

sage脚本如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n =  111922722351752356094117957341697336848130397712588425954225300832977768690114834703654895285440684751636198779555891692340301590396539921700125219784729325979197290342352480495970455903120265334661588516182848933843212275742914269686197484648288073599387074325226321407600351615258973610780463417788580083967
e = 37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226052064304547032760477638585302695605907950461140971727150383104
c = 14999622534973796113769052025256345914577762432817016713135991450161695032250733213228587506601968633155119211807176051329626895125610484405486794783282214597165875393081405999090879096563311452831794796859427268724737377560053552626220191435015101496941337770496898383092414492348672126813183368337602023823
k = e // n - 2
tmp = 65537 + (k+2)*n + (k+2)+1
R.<x> = PolynomialRing(RealField(1024))
f = e*x - (2*(k+1)*x^2 + (k+2)*n + tmp*x)
res = f.roots()

for root in res:
p_h = int(root[0])
PR.<x> = PolynomialRing(Zmod(n))
f1 = x + p_h
roots = f1.monic().small_roots(X=2^200,beta=0.4)
if roots:
p = int(roots[0]) + p_h
q = n // p
e = 65537 + k * p + (k+2) * ((p+1) * (q+1)) + 1
print(p)
print(q)
print(e)

通过在线sagemath求解出了我们的p,q和e

我们得到了:

1
2
3
p=9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091
q=11287710353955888973017088237331029225772085726230749705174733853385754367993775916873684714795084329569719147149432367637098107466393989095020167706071637
e=37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226053225696381145049303216018329937626866082580192534109310743249

然后就是简单的RSA解密

1
2
3
4
5
6
7
8
9
10
11
p=9915449532466780441980882114644132757469503045317741049786571327753160105973102603393585703801838713884852201325856459312958617061522496169870935934745091
q=11287710353955888973017088237331029225772085726230749705174733853385754367993775916873684714795084329569719147149432367637098107466393989095020167706071637
e=37059679294843322451875129178470872595128216054082068877693632035071251762179299783152435312052608685562859680569924924133175684413544051218945466380415013172416093939670064185752780945383069447693745538721548393982857225386614608359109463927663728739248286686902750649766277564516226053225696381145049303216018329937626866082580192534109310743249
c=14999622534973796113769052025256345914577762432817016713135991450161695032250733213228587506601968633155119211807176051329626895125610484405486794783282214597165875393081405999090879096563311452831794796859427268724737377560053552626220191435015101496941337770496898383092414492348672126813183368337602023823
from gmpy2 import *
from Crypto.Util.number import *
n=p*q
phi=(p-1)*(q-1)
d=invert(e,phi)
m=pow(c,d,n)
print(long_to_bytes(m))

最后我们得到了flag:flag{b5f771c6-18df-49a9-9d6d-ee7804f5416c}