Crypto 攻防世界合集
古典密码
1※ base64
1※ Railfence
-
考点:栅栏密码
-
得到一串编码后的字符串,观察到存在明文
{
和}
,但是位置不对,考虑栅栏密码: -
题目中提示了喂 5只小鸡,考虑分栏为 5 的栅栏密码:
-
放进 随波逐流 工具中栅栏解密,在 w型栅栏密码 分为 5 栏时,找到 flag:
1※ Caesar
-
考点:凯撒密码
-
得到一个字符串,观察到存在明文
{
,}
,_
,并且这些明文的位置没有改变,考虑是否为凯撒加密: -
由于 flag 的开头必定为 cyberpeace,可以推算出位移位数为 12,放进随波逐流用 凯撒解密 在偏移 12 的时候得到 flag:
1※ Morse
-
考点:摩斯密码
-
得到一串 01 串,中间已经用空格隔开,考虑是摩斯密码:
-
手动将 1 转为
-
,将 0 转为.
: -
放进 Cyberchef 中使用莫斯解码,得到 flag:
-
由于题目要求全部转为小写,并且用 cyberpeace 包裹,得到最后的 flag:
1※ 不仅仅是Morse
-
考点:培根密码
-
得到一串用
/
隔开的摩斯密码: -
丢进 Cyberchef,用莫斯密码解密,记得将分隔符改为左斜线:
-
解出来的明文后面带有一串只有 A 和 B 的字符串,考虑这里是培根密码,将后面的 AB 串放进 随波逐流 用培根解码:
-
将得到的字符串全改小写,用 cyberpeace{} 包裹得到 flag:
1※ 幂数加密
-
考点:云影加密(幂数加密)
-
题目提示需要 8个大写字母,观察到数据间有多个 0 隔开,且所有数字均为 2的次幂,且每一位不超过 8:
-
那么考虑 云影加密,我们丢进 随波逐流 用云影解密,得到要求的 8个大写字母:
-
最后用 cyberpeace{} 包裹起来,得到 flag:
1※ 转轮机加密
-
考点:转轮机加密
-
打开附件,发现已经把转轮机加密的 密码本,密钥,以及密文 全部给出了:
-
那么只需要根据转轮机密码的加密过程,写出 python 脚本进行解密,并将每一列的字符串转为小写输出:
a = ["ZWAXJGDLUBVIQHKYPNTCRMOSFE", "KPBELNACZDTRXMJQOYHGVSFUWI", "BDMAIZVRNSJUWFHTEQGYXPLOCK", "RPLNDVHGFCUKTEBSXQYIZMJWAO", "IHFRLABEUOTSGJVDKCPMNZQWXY", "AMKGHIWPNYCJBFZDRUSLOQXVET", "GWTHSPYBXIZULVKMRAFDCEONJQ", "NOZUTWDCVRJLXKISEFAPMYGHBQ", "XPLTDSRFHENYVUBMCQWAOIKZGJ", "UDNAJFBOWTGVRSCZQKELMXYIHP", "MNBVCXZQWERTPOIUYALSKDJFHG", "LVNCMXZPQOWEIURYTASBKJDFHG", "JZQAWSXCDERFVBGTYHNUMKILOP"] key = [2,3,7,5,13,12,9,1,8,10,4,11,6] c = [x for x in "NFQKSEVOQOFNP"] enc = [ a[x-1] for x in key ] for i in range(len(enc)): pos = enc[i].find(c[i]) enc[i] = enc[i][pos:]+enc[i][:pos] for j in range(len(enc[0])): for i in range(len(enc)): print(chr(ord(enc[i][j])-ord('A')+ord('a')),end='') print('')
-
运行脚本,观察每一行字符串,结合题目提示中的二战背景,找到唯一一行有意义的英文句子:
fire in the hole
,小心手雷: -
最后根据题目描述,直接提交这个字符串即可,不需要包裹:
1※ 告诉你个秘密
-
考点:键盘包围密码
-
打开文件,看到两行只有
数字,字母 A~F
的字符串,16进制转字符串: -
得到的字符串看起来像 base64 编码,大小写字母和数字都有,用 base64 解码:
-
得到的字符串,用空格隔开,每组 3到4 个字符,且符合键盘包围编码的特征,将中间连在一起的 8个字符中间加个空格,用键盘包围密码解密:
-
得到的字符串就是 flag,不需要包裹直接提交:
RSA
2※ easy_RSA
-
考点:RSA 加密过程
-
下载附件,给了 RSA 加密的 p,q,e,求解密的指数 d:
-
那么直接求 e 模
(p-1)*(q-1)
下的逆元即可,写出 python 脚本:from gmpy2 import * p = 473398607161 q = 4511491 e = 17 l = (p-1)*(q-1) d = invert(e,l) print(d)
-
运行得到 d:
-
这串数字包裹后得到 flag:
2※ [简单] 初识RSA
-
考点:[RSA 加密过程]
-
打开 newcomer.py 文件,发现给了 pq 和 qp 分别为
p*(q-1)
和q*(p-1)
: -
那么我们将 pq 与 qp 相加,得到
p*q - p + p*q - q = 2*p*q - p - q
。
由于我们需要求l = (p-1)*(q-1) = p*q - p - q + 1
,且n = p*q
,那么我们可以得到l = pq + qp - n + 1
。 -
那么便可以写出 python 脚本正常 RSA 解密了:
from Crypto.Util.number import long_to_bytes from gmpy2 import * e = 65537 n = ...... c = ...... pq= ...... qp= ...... l = pq + qp - n + 1 d = invert(e,l) m = pow(c,d,n) print(long_to_bytes(m))
-
最后运行得到 flag:
3※ Normal_RSA
-
考点:RSA - n可分解
-
下载附件后,得到了两个文件:flag.enc 是经过 RSA 加密后的密文, pubkey.pem 是 RSA 的公钥文件:
-
将 .pem 用 txt 打开,将里面的内容放到 rsa解密网站 上分析,得到 n 和 e:
-
由于 n 很小,我们放到 素数分解网站 上分解,得到 p 和 q:
-
最后密文以二进制串写在 .enc 文件中,我们在 python 脚本里用 open 的rb 模式读取,然后转为数字即可:
with open("./flag.enc","rb") as f: c = bytes_to_long(f.read())
-
那么我们就可以写出 python 脚本 RSA 解密了:
from Crypto.Util.number import bytes_to_long, long_to_bytes from gmpy2 import * with open("./flag.enc","rb") as f: c = bytes_to_long(f.read()) p = 275127860351348928173285174381581152299 q = 319576316814478949870590164193048041239 n = p * q e = 65537 l = (p-1)*(q-1) d = invert(e,l) m = pow(c,d,n) print(long_to_bytes(m))
-
运行程序得到一串字节串,flag 就在其中:
Python
1※ Broadcast
-
考点:查看 python 文件(?)
-
下载附件,解压后看到有一个 task.py 的 python 文件:
-
打开直接得到 flag:
2※ easychallenge
-
考点:反编译 .pyc 文件
-
下载附件,是一个
.pyc
的文件,可以使用 python 的 uncompyle 软件包来反编译为 .py 文件,在 附件所在的文件夹 的地址栏输入 cmd,打开命令提示符: -
利用 uncompyle 软件包反编译:
-
打开 py 文件,发现里面给出了 最后的密文 和 加密的流程:
-
先 encode1 与 encode2 异或加密,最后 base32 加密。那么我们只需要先 base32 解密,再倒着 decode2 与 decode1 异或解密。
-
那么我们将加密代码改为解密代码,然后倒序解密,写出 python 脚本:
import base64 def decode1(ans): s = '' for i in ans: x = ord(i) - 25 x = x ^ 36 s += chr(x) return s def decode2(ans): s = '' for i in ans: x = i ^ 36 x = x - 36 s += chr(x) return s def decode3(ans): return base64.b32decode(ans) final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' flag = decode1(decode2(decode3(final))) print(flag)
-
最后运行输出 flag:
Others
2※ flag_in_your_hand
-
考点:逆向基础(?)
-
下载附件,得到一个网页 和 一个 js源码:
-
打开网页发现输入什么都显示 Wrong,下面的字符串拿去 base64 解密也都是乱码:
-
那么我们 F12 查看网页源代码,找到两个关键函数,getFlag 和 showFlag:
-
发现得到的是否为正确的 flag 关键看变量 ic 的值是否为 0,往上看代码可以得知由另一个附件 .js 来管理这些变量:
-
那么我们打开 script-min.js 文件(我使用 pycharm 打开的),在 ck 函数中看到了对 ic 变量值的维护:
-
发现当输入的字符串 s 的 每个字符的 ASCII 值,分别为 a[] 里面的数值减 3 时,变量 ic 才会为 true:
-
那么我们写出 python 脚本进行解密:
a = [118, 104, 102, 120, 117, 108, 119, 124, 48,123,101,120] for x in [chr(x-3) for x in a]: print(x,end='')
-
运行得到我们需要输入的 Token:
-
在网站中输入这个字符串,得到 flag,不需要包裹直接提交:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理