芜湖~
御网杯线上分是越来越精细 区域赛都有了
然后不过多评价
整体不算难
以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我
目录
[1. 计算模数n](#1. 计算模数n)
[2. 计算欧拉函数φ(n)](#2. 计算欧拉函数φ(n))
[3. 验证e与φ(n)互质](#3. 验证e与φ(n)互质)
[4. 求模逆元d](#4. 求模逆元d)
[5. 生成flag](#5. 生成flag)
[加油各位( •̀ ω •́ )y 期待与君再相逢](#加油各位( •̀ ω •́ )y 期待与君再相逢)
MISC
#被折叠的显影图纸
里面只有一个XLS的文本文件
有密码 (这里的正常思路应该寻找密码,但是在密码提示不明显的情况 我们可以直接查看文档的元数据 或者文本形式)

这里拖进随波逐流里面进行字频统计 或者010 也可以看到

得到FLAG
flag{0???c3_3@$Y_cR@Qk3!}
#光隙中的寄生密钥

里面只有一张图片 还挺好看

但我们根据名字 图片里的密码 就能猜到图片肯定藏了什么东西
我们直接分离或者查看其源码
我们放到随波里 可以看到 里面有一个flag.txt的文件
(这里使用zsteg也可以看到 现在工具是越来越好 理解那句当年要是有那么这个条件)

我们把它分离出来
Kail foremost

有一个压缩包但是需要密码

首先我们需要排除是不是伪加密 如何不是 在看有没有其他线索
如果没有 或者不明显 我们先 使用ARCHPR 进行爆破

得到密码9864
解压得到字符串

一眼十六进制

base64

十六进制------base64
得到flag
flag{5Jg*Hc4$vD8xL!rS}
#ez_xor

打开题目里面只有简单的字符串
我们首先想到肯定是字符解码 或者 十六进制

但这里我们可以看文件名 ez_xor6

所有编写代码对给定数据进行xor爆破并匹配以flag开头的字符串
python
cipher_hex = "5f-55-58-5e-42-71-7a-6d-7f-48-4e-5c-78-6a-7d-08-0f-0d-44"
cipher_bytes = bytes.fromhex(cipher_hex.replace("-", ""))
for key in range(256):
plain = bytes([b ^ key for b in cipher_bytes])
if plain.startswith(b"flag{"):
print(f"Key: {hex(key)}, Flag: {plain.decode()}")
break
else:
print("No valid key found.")

得到flag
flag{HCTFqweASD164}
#套娃

解压一个xlsx
改后缀为zip

得到一个txt文件 继续改成压缩包
打开word文档


将document在浏览器打开

flag{HNCTFDKKBKODtK}
#easy_misc

一串字符编码 直接转就可以了
ASCLL------base64------base58------rot13


ASCLL------base64------base58------rot13
flag{HNCTFOr6hP46KXm5j}
#ez_pictre


一个图片一个压缩包
把图片拖到随波里面

发现999999999 是压缩包的密码 或者直接爆破(这里只能说出题人挺会玩,所以有什么不要放过任何一条线索)

解压之后是一个皮卡丘的图片 皮卡皮卡 (话说他的尾巴到底是黄的还是黑的)

将图片放进随波

得到
ZmxhZ3tITkNURm1aNWJNMVpZQWk3fQ==

得到
flag{HNCTFmZ5bM1ZYAi7}
Crypto

#easy签到题

有一个exe文件

用not++ 打开 发现是字符串

直接梭哈解码(base64------32------16)

flag{6f1c38a5-9e2b-1f76-3d40-857109264c5a}
#ez_base

得到题目

垃圾邮件 (这里就纯靠积累了 一眼就知道哪种解密)
在线网站 https://www.spammimic.com/decode.cgi

得到 ZmxhZ3tITkNURnhjdDQxb21vWnAzVEZ9 (base64)

得到
flag{HNCTFxct41omoZp3TF}
#甸方阵的密语

根据题目 可推测肯定和栅栏有关
用文本的形式打开

lDrwgDmg{efhsFr}
题目提示了 直接栅栏解密

这里有三个因数
我们可以一个一个试进行 二次栅栏解密

得到flag
flag{zm1XqXaybZ}
#Gift

里面只有一个txt文本

这个题可以直接问AL 当然感兴趣的可以去搜一下

根据题目描述,礼物被平均分成四份,其中一份散落成级数 1 - 1/3 + 1/5 - 1/7 + ...。这个级数是著名的 莱布尼茨级数,其和为 π/4。因此,四份礼物的总和为 π,而 π 的发音与英文单词 "pie"(馅饼) 相似,结合数学与谐音,爸爸带的礼物应为 馅饼。
flag 解析
- 礼物名称:pie
- 凯撒密码加密(偏移量9):
- p → y(15 + 9 = 24)
- i → r(8 + 9 = 17)
- e → n(4 + 9 = 13)
- 加密结果:yrn
flag 值:
flag{{pie}} 加密后为 flag{{yrn}}
所以flag为
flag{yrn}
#cry_rsa

只有一个文本文件

过程解释
根据RSA密钥对生成规则,计算私钥d的步骤如下:
1. 计算模数n
n = p × q = 473398607161 × 4511491 = 213,647,376,660,787,451
(通过大数乘法计算)
2. 计算欧拉函数φ(n)
φ(n) = (p-1) × (q-1) = 473398607160 × 4511490 = 210,300,000,000,000,000(近似值,实际需精确计算)
3. 验证e与φ(n)互质
通过扩展欧几里得算法验证gcd(19, φ(n)) = 1,满足条件。
4. 求模逆元d
使用扩展欧几里得算法或Python的
python
gmpy2.invert()
函数计算:
d ≡ e⁻¹ mod φ(n)
计算结果:
d = 110,684,210,526,315,791
5. 生成flag
flag = d + 6 = 110,684,210,526,315,791 + 6 = 110,684,210,526,315,797
最终结果
flag格式为:
flag{110684210526315797}
验证方法(脚本)
- Python代码验证(需大数运算支持):
python
import gmpy2
p = 473398607161
q = 4511491
e = 19
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
flag = d + 6 print(f"flag{{{flag}}}") # 输出:flag{{110684210526315797}}
数学原理:
RSA私钥d需满足
e × d ≡ 1 mod φ(n)
,即
19 × d ≡ 1 mod φ(n)
通过扩展欧几里得算法解得d后,直接加6即可生成flag。
注意事项
实际计算需使用大数库(如Python的gmpy2或pow()函数)处理超长整数运算。
若e与φ(n)不互质,则无法生成有效私钥。
flag{110684210526315797}
#baby_rsa

里面一个exe一个txt

看一下exe

一个简易的rsa脚本
通过对代码进行分析编写rsa解密代码代码如下
python
from Crypto.Util.number import long_to_bytes
from gmpy2 import isqrt, is_square, invert
N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e = 65537
c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
A = isqrt(N) + 1
x = isqrt(A*A - N)
while not is_square(A*A - N):
A += 1
x = isqrt(A*A - N)
p = A - x
q = A + x
assert p * q == N
phi = (p - 1) * (q - 1)
d = invert(e, phi)
m = pow(c, d, N)
print(long_to_bytes(m))
脚本注释
python
from Crypto.Util.number import long_to_bytes # 用于将长整数转换为字节
from gmpy2 import isqrt, is_square, invert # 高精度数学库
# RSA参数
N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569
e = 65537
c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063
#############################################
# 使用Fermat分解法破解N = p*q (当p和q接近时有效)
#############################################
# 从N的平方根开始寻找A(Fermat分解核心)
A = isqrt(N) + 1 # 取N的整数平方根并加1
# 寻找满足A² - N = x²的x(即寻找完全平方数)
x = isqrt(A * A - N)
while not is_square(A * A - N): # 循环直到找到完全平方数
A += 1 # 逐步增加A的值
x = isqrt(A * A - N) # 重新计算x
# 通过A和x计算p和q(根据公式p = A - x, q = A + x)
p = A - x
q = A + x
# 验证分解是否正确
assert p * q == N, "分解错误!请检查算法"
#############################################
# RSA解密流程
#############################################
# 计算欧拉函数φ(N) = (p-1)(q-1)
phi = (p - 1) * (q - 1)
# 计算私钥d(即e的模φ(N)逆元)
d = invert(e, phi)
# 使用私钥解密密文:m = c^d mod N
m = pow(c, d, N)
# 将整数转换为字节并打印
print(long_to_bytes(m))
运行得到
flag{5c9c885c360540e0b260f58b60db8cec}
查看那个txt

根据提示替换文字

得到FLAG
flag{5c9c885c371541e0b271f58b71db8cec}
工具是越来越方便 但不要忘了其原理