参考大佬文章
CTF常见编码及加解密(超全) - ruoli-s - 博客园
1、密码学签到(倒序)
python代码倒序得到flag
msg = "}wohs.ftc{galf" print(msg[::-1])flag:flag{ctf.show}
2、crypto2(jsfuck编码)
F12 ->打开控制台->复制文本执行->flag{3e858ccd79287cfe8509f15a71b4c45d}
jsfuck属于JavaScript 编码,由6个字符[]()+!组成,jsfuck密文可以通过javaScript解析成明文
注意:控制台环境能解析JavaScript语句
flag:flag{3e858ccd79287cfe8509f15a71b4c45d}
3、crypto3(颜文字加密)
通过在线工具解析:aaEncode 加密解密 - 工具哇在线工具
flag:console.log("flag{js_da_fa_hao}");
4、crypto4(RSA加密算法)
d是e关于phi的乘法逆元
import gmpy2 p=447685307 q=2053 e=17 d = gmpy2.invert(e,(p-1)*(q-1)) print(d)flag:flag{594420748649}
5、crypto6(Rabbit加密)
明文是由大小写字母,数字和+组成的,所有考虑base64加密,Rabbit加密,AES加密,DES加密,MD5加密
本题是Rabbit加密,在线工具:https://www.sojson.com/encrypt_rabbit.html
flag:flag{a8db1d82db78ed452ba0882fb9554fc9}
6、crypto7(brainfuck编码的变种—ook编码)
BrainFuck 语言只有八种符号,所有的操作都由这八种符号(> < + - . , [ ])的组合来完成。
而brainfuck编码的变种—ook编码如下:
在线加密网站:Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org]
flag:flag{b615c4b79a1aede83b9ae67104ff4eb5}
7、crypto8(brainfuck编码)
BrainFuck 语言只有八种符号,所有的操作都由这八种符号(> < + - . , [ ])的组合来完成。
在线加密工具:Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org]
选择Brainfuck to text ,拿到flag
flag:flag{99754106633f94d350db34d548d6091a}
8、crypto9(surpent-ECB加密)
爆破压缩包密码:4132
在线工具打不开,我让AI生成的python脚本
import os from pyserpent import Serpent def decrypt_serpent_ecb_file(input_path, output_path, key): """ 使用 pyserpent 库解密 Serpent ECB 模式加密的文件 """ try: # 1. 读取密文 with open("odt-IV-00000000000000000000000000000000.dat", 'rb') as f: ciphertext = f.read() # 2. 创建 Serpent 解密器 # pyserpent 库要求密钥为字节串,长度需是16、24或32字节。 # 这里的密钥是字符串 "4132",我们将它编码为字节并补足到16字节。 key_bytes = key.encode('utf-8') if len(key_bytes) not in (16, 24, 32): # 补零到16字节 (AES/Serpent-128 的标准密钥长度) key_bytes = key_bytes.ljust(16, b'\x00') cipher = Serpent(key_bytes) # 3. 解密数据 # 库中 ECB 模式的 encrypt/decrypt 方法处理的是单个数据块 (16字节) # 我们需要自己处理多块和填充 block_size = 16 plaintext = bytearray() # 按块解密 for i in range(0, len(ciphertext), block_size): block = ciphertext[i:i+block_size] # 如果最后一块不足16字节,则不是合法的 Serpent 密文,跳过或报错 if len(block) < block_size: # 如果文件大小不是16的倍数,可能需要补全或处理,此处直接保留剩余部分(不推荐) print(f"警告:最后一块不足 {block_size} 字节,可能不是标准密文,将直接保留。") plaintext.extend(block) break decrypted_block = cipher.decrypt(block) plaintext.extend(decrypted_block) # 4. 去除 PKCS#7 填充 # pyserpent 库使用 PKCS#7 填充,需要手动去除 pad_len = plaintext[-1] if plaintext else 0 if 0 < pad_len <= block_size: # 验证填充是否有效 if all(p == pad_len for p in plaintext[-pad_len:]): plaintext = plaintext[:-pad_len] else: print("警告:无效的 PKCS#7 填充,将保留全部解密数据。") # 5. 写入明文文件 with open(output_path, 'wb') as f: f.write(plaintext) print(f"✅ 解密成功!结果已写入 {output_path}") # 6. 尝试打印明文(如果它是文本) try: flag_text = plaintext.decode('utf-8') print(f"Flag: {flag_text}") except UnicodeDecodeError: print("解密结果是二进制数据,请查看输出文件。") except FileNotFoundError: print(f"❌ 错误:找不到文件 '{input_path}',请检查路径。") except Exception as e: print(f"❌ 解密失败: {e}") # --- 脚本执行入口 --- if __name__ == "__main__": # 请根据实际情况修改文件路径 input_filename = "Serpent.dat" # 从压缩包解压出的文件 output_filename = "flag.txt" # 压缩包密码即为密钥 key = "4132" decrypt_serpent_ecb_file(input_filename, output_filename, key)9、crypto10(Quoted-printable编码)
Quoted-printable编码的标识是=加上十六进制
在线解密网站:Quoted-printable编码|Quoted-printable解码|Quoted-printable编码原理介绍--查错网f
unicode编码 flag:flag{用你那火热的嘴唇让我在午夜里无尽的销魂}
10、crypto11(MD5加密)
MD5加密算法:由数字和小写字母组成
在线解密网站:MD5免费在线解密破解_MD5在线加密-SOMD5
flag{ctf}
11、crypto0(凯撒密码)
每一位往前移动一位即是flag
flag:flag{hello_ctf}
12、crypto12(埃特巴什码)
埃特巴什码:使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母,以此类推
flag:flag{Atbase_code_from_ctfshow}
13、crypto13(base32和base64混合解密)
flag:flag{b4Se_Fami1y_Is_FUn}
14、crypto14(进制转换+base64偏移30位)
二进制转十六进制,十六进制转ascii然后转字符串=>3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG
flag(base64)=>ZmxhZw==
通过前四位对比,字符串每一位是base64往后偏移30位组成
即,字符串每一位往前30位偏移即使flag的base64编码
大佬脚本:
m ='00110011 00110011 00100000 00110100 00110101 00100000 00110101 00110000 00100000 00110010 01100110 00100000 00110011 00110011 00100000 00110101 00110110 00100000 00110100 01100101 00100000 00110100 00110110 00100000 00110100 00110110 00100000 00110110 01100100 00100000 00110100 01100101 00100000 00110100 00110101 00100000 00110100 00110001 00100000 00110110 01100101 00100000 00110110 01100011 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110100 00100000 00110100 00110011 00100000 00110100 01100100 00100000 00110110 01100100 00100000 00110101 00110110 00100000 00110100 00111000 00100000 00110100 00110100 00100000 00110011 00110101 00100000 00110110 00110001 00100000 00110110 00110100 00100000 00110011 00111001 00100000 00110111 00110101 00100000 00110100 00110111 00100000 00110000 01100001' m = m.split(' ') m1 =[] for item in m: m1.append(hex(int(item,2))) m2 ='' for item in m1: m2+=chr(int(item,16)) m2 = m2.split(" ") m3 ='' for item in m2: m3+=chr(int(item,16)) #s= '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG' print(m3) #注意这里最后有个回车键 s = m3[:-1] s =str(s) t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' l="" for i in s: l += t[(t.index(i)-30)%64] ##如果不是4的倍数补上等号 if len(l)%4!=0: l=l+"="*(4-(len(l)%4)) print(l) import base64 flag = base64.b64decode(l).decode('utf-8') print(flag)15、萌新_密码5(当铺密码)
当铺密码的的规则是用汉字的出头笔画数来代表数字
思路:三个为一组,通过规则转换为十六进制,接着转换为字符串拼接起来
大佬脚本
s = '田由中人工大王夫井羊' code = input("请输入当铺密码:") code = code.split(" ") w = '' for i in code: k = "" for j in i: k += str(s.index(j)) w += chr(int(k)) print(w)flag:flag{ctfshow}
16、EZ_avbv(easy)
大佬文章:ctfshow--Crypto(萌新_密码5-easyrsa)解题步骤_ctfshow题目代码-CSDN博客
靶场没开,学习了下思路
xor=177451812 (异或密钥)
add=8728348608 (加法密钥)
可以猜逆向出算法,如
假设加密过程是:密文 = (明文 + add) xor xor。
那么解密过程就是:明文 = (密文 xor xor) - add。
17、贝斯多少呢(分组加密+base62解密)
密文:8nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL
提示说分组base62解密,经过尝试,11个字符为一组,用CyberChef工具分别base62解密后拼接起来即是flag
分组解密:
8nCDq36gzGn 8hf4M2HJUsn 4aYcYRBSJwj 4aE0hbgpzHb 4aHcH1zzC9C 3IL
flag:flag{6a5eb2_i5_u5ua11y_u5ed_f0r_5h0rt_ur1}
18、find the table
F12查看审查元素这里,得到数据:9 57 64 8 39 8 92 3 19 99 102 74、
对应元素周期表拿到flag
flag:flag{doyoulikesnow}