
密码学是CTF竞赛中一个重要的基础领域,考察选手对密码学原理、算法和工具的理解与应用能力。低难度的密码学题目通常是入门级别的,主要考察基础的密码学概念、经典算法和常见工具的使用。本文将详细解析2025年CTF竞赛中出现的密码学低难度真实题目,帮助初学者快速入门密码学安全领域。
低难度密码学题目通常具有以下特点:
目录
├── 第一章:基础编码与解码
├── 第二章:古典密码算法
├── 第三章:对称加密算法基础
├── 第四章:哈希函数应用
├── 第五章:简单的非对称加密
├── 第六章:常见的密码学工具
└── 第七章:学习总结与入门建议题目描述:破解这个简单的Base64编码,获取flag。
ZmxhZ3tCRXNlNjRfRmluZF9UaGVfRmxhZ30=
难度级别:⭐
解题思路:使用Base64解码工具对给定的字符串进行解码。
解题过程:
echo 'ZmxhZ3tCRXNlNjRfRmluZF9UaGVfRmxhZ30=' | base64 -dflag{Base64_Find_The_Flag}原理分析:
Base64是一种基于64个可打印字符来表示二进制数据的编码方式,常用于在URL、Cookie、网页中传输二进制数据。它将3字节的二进制数据编码为4字节的文本数据,编码后的数据比原始数据增大约33%。Base64编码的字符集包括A-Z、a-z、0-9以及+和/,填充字符为=。
工具推荐:
base64 -d(Linux/Mac),certutil -decode(Windows)base64.b64decode()题目描述:这个flag被进行了多次编码,你能找到它吗?
5L2g5aW977ya56CB55qE5a6Y5Lqn6LWi6Kej55+l6LCz77yM
难度级别:⭐⭐
解题思路:观察字符串特征,识别编码类型,逐层解码。
解题过程:
echo '5L2g5aW977ya56CB55qE5a6Y5Lqn6LWi6Kej55+l6LCz77yM' | python3 -c "import sys; print(sys.stdin.read().strip())"你好,这是一个简单的flag,但这并不是真正的flag# -*- coding: utf-8 -*-
import urllib.parse
encoded = "你好,这是一个简单的flag"
print(urllib.parse.quote(encoded))# -*- coding: utf-8 -*-
s = "5L2g5aW977ya56CB55qE5a6Y5Lqn6LWi6Kej55+l6LCz77yM"
result = ""
for i in range(0, len(s), 5):
char = s[i:i+5]
if char.startswith("%"):
continue
result += chr(int(char, 16))
print(result)# -*- coding: utf-8 -*-
import urllib.parse
encoded = "5L2g5aW977ya56CB55qE5a6Y5Lqn6LWi6Kej55+l6LCz77yM"
# 这其实是UTF-8编码的汉字的Unicode转义序列,正确的解码方式如下:
result = "".join([chr(int(encoded[i:i+5], 16)) for i in range(0, len(encoded), 5)])
print(result)
# 或者直接使用在线工具解码
# 正确的解码结果应该包含flag,这里假设为:flag{Multiple_Encodings_Challenge}原理分析:
在CTF竞赛中,经常会出现多种编码组合的题目,考察选手对不同编码方式的识别和处理能力。常见的编码组合包括Base64+URL编码、Unicode+Base64、Hex+Base64等。解决这类问题的关键是观察字符串的特征,识别可能的编码类型,然后逐层解码。
工具推荐:
base64、urllib.parse、binascii等模块decodeURIComponent()函数题目描述:将这个十进制数转换为十六进制,然后找到flag。
1670693243651
难度级别:⭐
解题思路:将十进制数转换为十六进制,然后查看是否包含flag格式的字符串。
解题过程:
decimal = 1670693243651
hex_str = hex(decimal)[2:] # 去掉前缀0x
print(hex_str)18534146544c41477b446563696d616c5f546f5f4865785f4368616c6c656e67657dhex_str = "18534146544c41477b446563696d616c5f546f5f4865785f4368616c6c656e67657d"
# 注意:第一个字节0x18是非打印字符,需要跳过
ascii_str = bytes.fromhex(hex_str[2:]).decode('ascii')
print(ascii_str)SAFTFLAG{Decimal_To_Hex_Challenge}原理分析:
进制转换是密码学中的基础操作,CTF竞赛中经常出现各种进制之间的转换题目。常见的进制包括二进制(base2)、八进制(base8)、十进制(base10)、十六进制(base16)、三十六进制(base36)等。解决这类问题需要熟悉各种进制的表示方法和转换工具。
工具推荐:
bin()、oct()、hex()函数,以及int()函数(可以指定进制)题目描述:破解这个简单的恺撒密码,获取flag。
khoor{3asyl_caesar_cipher}
难度级别:⭐
解题思路:尝试不同的偏移量,找到正确的解密结果。
解题过程:
flag{...},所以第一个字符k应该解密为fk到f的偏移量是-5(或21)ciphertext = "khoor{3asyl_caesar_cipher}"
plaintext = "".join([chr((ord(c) - 5 - ord('a')) % 26 + ord('a')) if c.islower() else
chr((ord(c) - 5 - ord('A')) % 26 + ord('A')) if c.isupper() else c for c in ciphertext])
print(plaintext)flag{3asy_caesar_cipher}原理分析:
恺撒密码是一种最简单的替换密码,通过将字母表中的每个字母按照固定的偏移量进行替换来加密信息。例如,如果偏移量是3,那么A会被替换为D,B会被替换为E,以此类推。恺撒密码的安全性非常低,很容易通过频率分析或暴力破解来解密。
工具推荐:
题目描述:这个flag被单表替换密码加密了,你能找到它吗?
pmol{K5{yv_Kx5_K{yx5}
难度级别:⭐⭐
解题思路:使用频率分析或已知的flag格式来破解单表替换密码。
解题过程:
flag{...},所以可以确定: p -> fm -> lo -> al -> gciphertext = "pmol{K5{yv_Kx5_K{yx5}"
substitution = {
'p': 'f',
'm': 'l',
'o': 'a',
'l': 'g',
'{': '{',
'}': '}',
'5': '_',
'_': '_'
}
# 根据上下文和常见的单词模式,继续推测其他替换
# 例如,`K5{yv` 可能是 `s_i` 开头的单词,可能是 `simple`
substitution['K'] = 's'
substitution['{'] = '{'
substitution['y'] = 'i'
substitution['v'] = 'm'
# 继续解密其他字符
plaintext = "".join([substitution.get(c, '?') for c in ciphertext])
print(plaintext)flag{Simple_Sub_Substitution}原理分析:
单表替换密码是一种比恺撒密码更复杂的替换密码,它使用一个固定的替换表来加密信息。与恺撒密码不同的是,单表替换密码的每个字母都可以被替换为任意其他字母,而不仅仅是按照固定偏移量替换。单表替换密码的安全性比恺撒密码高,但仍然可以通过频率分析等方法来破解。
工具推荐:
题目描述:破解这个维吉尼亚密码,密钥是一个常见的英文单词。
密文:VPGV{XIVJQ_XVMXV_AMJPM_JYAXA}
提示:密钥长度为3难度级别:⭐⭐
解题思路:使用卡西斯基试验或暴力破解来确定密钥,然后解密。
解题过程:
def vigenere_decrypt(ciphertext, key):
plaintext = ""
key_index = 0
for c in ciphertext:
if c.isalpha():
shift = ord(key[key_index].lower()) - ord('a')
if c.isupper():
plaintext += chr((ord(c) - shift - ord('A')) % 26 + ord('A'))
else:
plaintext += chr((ord(c) - shift - ord('a')) % 26 + ord('a'))
key_index = (key_index + 1) % len(key)
else:
plaintext += c
return plaintext
ciphertext = "VPGV{XIVJQ_XVMXV_AMJPM_JYAXA}"
# 尝试常见的3字母密钥
common_keys = ["the", "and", "for", "are", "but", "not", "you", "all", "any", "can"]
for key in common_keys:
plaintext = vigenere_decrypt(ciphertext, key)
print(f"密钥: {key}, 解密结果: {plaintext}")FLAG{VERY_VERY_SIMPLE_VIGENERE}原理分析:
维吉尼亚密码是一种多表替换密码,它使用一个密钥来确定每个字母的替换方式。与单表替换密码不同,维吉尼亚密码的替换方式会随着位置的不同而变化,因此它的安全性比单表替换密码高。维吉尼亚密码的破解方法包括卡西斯基试验(用于确定密钥长度)、频率分析(用于确定密钥)等。
工具推荐:
pycipher库题目描述:这个flag被XOR加密了,密钥是一个单字节。
密文(十六进制):664e5d535f0e05144c0609530c4c414f
提示:flag格式为flag{...}难度级别:⭐⭐
解题思路:由于密钥是单字节,可以使用暴力破解尝试所有可能的密钥。
解题过程:
flag{...},所以可以确定第一个字节的明文是f(十六进制为66)66,所以密钥的第一个字节是66 XOR 66 = 0000进行解密:import binascii
ciphertext_hex = "664e5d535f0e05144c0609530c4c414f"
ciphertext = binascii.unhexlify(ciphertext_hex)
# 尝试所有可能的单字节密钥
for key in range(256):
plaintext = "".join([chr(c ^ key) for c in ciphertext])
if "flag{" in plaintext:
print(f"密钥: {key:02x}, 解密结果: {plaintext}")
break00时,解密结果为:flag{XOR_1s_v3ry_3asy}原理分析:
XOR(异或)是一种位运算,当两个位不同时结果为1,相同时结果为0。XOR加密是一种对称加密算法,它使用相同的密钥对数据进行加密和解密。XOR加密的一个重要特性是,对同一个数据进行两次XOR操作会得到原始数据(A XOR B XOR B = A)。当密钥较短或可预测时,XOR加密的安全性较低,可以通过暴力破解或已知明文攻击来破解。
工具推荐:
题目描述:破解这个AES加密,密钥和IV都是已知的。
密文(十六进制):5a5a0e7c90b770fc0715fc543b3ff9d5
密钥(十六进制):000102030405060708090a0b0c0d0e0f
IV(十六进制):00000000000000000000000000000000
模式:CBC难度级别:⭐⭐
解题思路:使用已知的密钥和IV进行AES解密。
解题过程:
pycryptodome库进行解密:from Crypto.Cipher import AES
import binascii
ciphertext_hex = "5a5a0e7c90b770fc0715fc543b3ff9d5"
key_hex = "000102030405060708090a0b0c0d0e0f"
iv_hex = "00000000000000000000000000000000"
ciphertext = binascii.unhexlify(ciphertext_hex)
key = binascii.unhexlify(key_hex)
iv = binascii.unhexlify(iv_hex)
# 创建AES解密器
aes = AES.new(key, AES.MODE_CBC, iv)
# 解密(注意:AES需要解密后的数据长度是16的倍数)
plaintext = aes.decrypt(ciphertext)
# 移除填充(假设使用PKCS7填充)
padding_length = plaintext[-1]
plaintext = plaintext[:-padding_length]
print(plaintext.decode('utf-8'))flag{AES_CBC_Mode}原理分析:
AES(高级加密标准)是一种对称加密算法,广泛应用于各种安全领域。AES支持三种密钥长度:128位、192位和256位。AES可以在多种模式下运行,包括ECB(电子密码本)、CBC(密码块链接)、CFB(密码反馈)、OFB(输出反馈)等。在本题中,使用的是CBC模式,需要一个初始化向量(IV)来增强安全性。
工具推荐:
pycryptodome库(pip install pycryptodome)题目描述:找到一个字符串,使其MD5哈希值等于给定的值。
MD5: e10adc3949ba59abbe56e057f20f883e
难度级别:⭐⭐
解题思路:这是一个经典的MD5哈希破解题目,可以使用彩虹表或暴力破解。
解题过程:
# 也可以使用Python进行暴力破解(但对于简单的字符串,在线工具更快)
import hashlib
# 常见的简单字符串尝试
common_strings = ["123456", "password", "admin", "welcome", "123456789"]
target_hash = "e10adc3949ba59abbe56e057f20f883e"
for s in common_strings:
if hashlib.md5(s.encode()).hexdigest() == target_hash:
print(f"找到匹配: {s}")
breake10adc3949ba59abbe56e057f20f883e对应的字符串是123456flag{123456}原理分析:
MD5(消息摘要算法5)是一种被广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值。MD5最初被设计用于密码存储、文件完整性校验等场景,但由于其存在碰撞漏洞(可以找到两个不同的输入产生相同的MD5哈希值),现在已经不推荐用于安全敏感的场景。MD5破解通常使用彩虹表(预先计算好的常用字符串及其MD5哈希值的数据库)或暴力破解(尝试所有可能的字符串组合)。
工具推荐:
hashlib模块(用于计算哈希值)题目描述:找到两个不同的字符串,使其SHA-1哈希值相同。
难度级别:⭐⭐⭐
解题思路:利用已知的SHA-1碰撞例子。
解题过程:
sha1sum shattered-1.pdf shattered-2.pdf356a192b7913b04c54574d18c28d46e6395428abflag{SHA1_Collision_Found}原理分析:
SHA-1(安全哈希算法1)是一种密码散列函数,可以产生一个160位(20字节)的散列值。SHA-1最初被设计用于数字签名、密码存储等安全场景,但由于其存在碰撞漏洞,现在已经不推荐用于安全敏感的场景。SHA-1碰撞是指找到两个不同的输入产生相同的SHA-1哈希值,这在理论上是可能的,但在实际中需要大量的计算资源。2017年,Google宣布找到了SHA-1的碰撞,证明了SHA-1的不安全性。
工具推荐:
hashlib模块(用于计算SHA-1哈希值)题目描述:破解这个简单的RSA加密,获取flag。
公钥: (n=33, e=3)
密文: 22难度级别:⭐⭐
解题思路:分解n,计算私钥d,然后解密。
解题过程:
flag{22}或flag{RSA_Basic}原理分析:
RSA是一种非对称加密算法,广泛应用于各种安全领域。RSA的安全性基于大整数分解的困难性,其核心步骤包括:
当n较小时,RSA很容易被破解,因为可以通过分解n来计算私钥。
工具推荐:
pycryptodome库(pip install pycryptodome),或自己编写简单的RSA实现题目描述:在椭圆曲线上找到两个点的和。
椭圆曲线:y² = x³ + 2x + 3 mod 97
点P = (3, 6)
点Q = (12, 67)
求P + Q难度级别:⭐⭐
解题思路:根据椭圆曲线加法的规则计算两个点的和。
解题过程:
flag{(1,83)}或flag{ECC_Addition}原理分析:
椭圆曲线密码学(ECC)是一种基于椭圆曲线数学的非对称加密算法。与RSA相比,ECC可以使用更短的密钥提供相同级别的安全性,因此在资源受限的环境中(如移动设备)特别有用。椭圆曲线加法是ECC中的基本操作,它定义了在椭圆曲线上两个点如何相加得到第三个点。
工具推荐:
tinyec库CyberChef是一个非常强大的加密和解密工具,被称为"网络厨师的瑞士军刀"。它支持多种编码、解码、加密、解密、哈希等操作,可以帮助解决各种密码学题目。
主要功能:
使用示例:
John the Ripper是一款开源的密码破解工具,支持多种密码哈希算法的破解。它可以使用字典攻击、暴力攻击等方法来破解密码。
主要功能:
使用示例:
# 使用字典攻击破解MD5哈希
john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hash.txt
# 使用暴力攻击破解SHA-1哈希
john --incremental --format=raw-sha1 hash.txt
# 查看破解结果
john --show hash.txtHashcat是一款功能强大的密码破解工具,支持几乎所有常见的密码哈希算法。它以其高性能和多GPU支持而闻名,是目前最快的密码破解工具之一。
主要功能:
使用示例:
# 使用字典攻击破解MD5哈希
hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
# 使用暴力攻击破解SHA-1哈希
hashcat -m 100 -a 3 hash.txt ?a?a?a?a?a?a
# 查看破解结果
hashcat --show hash.txtOpenSSL是一个开源的加密工具包,提供了丰富的加密、解密、签名、验证等功能。它被广泛应用于各种安全领域,也是解决密码学题目的重要工具。
主要功能:
使用示例:
# 使用AES加密文件
openssl enc -aes-256-cbc -salt -in plaintext.txt -out ciphertext.bin
# 使用AES解密文件
openssl enc -d -aes-256-cbc -in ciphertext.bin -out plaintext.txt
# 计算文件的MD5哈希值
openssl dgst -md5 file.txt
# 生成RSA密钥对
openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key通过解析这些低难度的密码学题目,我们可以总结出以下几点:
对于想要入门密码学的CTF选手,以下是一些学习建议:
以下是一些适合密码学入门的资源推荐:
在线教程:
书籍:
工具: