引言
hello!欢迎来到咪猫魔法世界~ 🐾✨
在 CTF 的 Crypto/Misc 里,哈希像“给数据按下的指纹印章”:你拿着印章(算法)一盖,谁来都能复现同一个指纹;而文件隐写更像“把小纸条塞进字节夹层里”——文件表面看着正常,里面却藏着另一份故事。 这两类题的共同点是:不靠玄学,靠流程。你只要会“看懂它是什么、再决定怎么下手”,分数就会自己跑过来(O.o)✨
一、关于哈希 / 加密 / 编码
很多新手🐱栽的第一个坑,就是把这三者混成一锅粥(比如我曾经就在做ER图的时候写了这样一个词:“加密后的密文”,当时我们项目指导老师笑的嘴角就没压下来过555)。那么我们现在一起来理理这三者之间的关系,相信看完之后你会对三者之间的区别有一个更加清新的认识。
| 对比维度 | 哈希(Hash) | 加密(Encryption) | 编码(Encoding) |
|---|---|---|---|
| 能不能还原 | 理论上不可逆(只能撞/爆破/查表) | 可逆(有密钥就能解) | 可逆(公开规则就能解) |
| 主要目的 | 完整性校验、唯一标识、指纹对比 | 保密通信、保护内容 | 适配传输/存储(显示、协议、字符集) |
| 常见例子 | MD5、SHA-1、SHA-256、CRC32 | AES、RSA | Base64、URL Encode、UTF-8 |
咪猫口诀:哈希“变不回去”,加密“有钥匙回去”,编码“大家都能回去”。 🐾
这里要补一层更“比赛友好”的理解: CTF 里说“破解哈希”,大多数时候其实不是从哈希值反推出原文(那是做梦),而是——你猜一堆可能的原文,把它们都盖一遍指纹,看看谁对上了。
二、哈希到底强在哪里(也脆在哪里)
哈希函数的理想目标是:输入再长再乱,我都能稳定给你一个固定长度的“指纹”。而且这个指纹要尽量满足三件事(CTF 和现实都爱考):
-
固定长度:不管你喂它 1 个字符还是 1G 文件,输出长度都固定。
-
雪崩效应:输入哪怕只改一个字节,输出也会像翻桌一样完全不一样。
-
抗碰撞/抗预像(理想状态):
- 碰撞:找两个不同输入,输出却相同(
A != B但H(A)=H(B))。 - 预像:给你一个哈希值,让你找到一个输入能产生它(给“指纹”找“手指”)。
- 碰撞:找两个不同输入,输出却相同(
现实是:算法有“年纪”和“命运”。MD5、SHA-1 都已经不再适合作为安全用途(尤其是防碰撞),但它们在 CTF 里依然很常见——因为题目想考的是你的识别与流程,不是真让你写论文。
(SHA 系列的标准可以看 NIST 的 Secure Hash Standard:FIPS 180-4。 (NIST出版物);MD5 的规范可以看 RFC 1321。 (RFC 编辑器))
三、CTF 高频哈希算法
在 CTF 题目里最常见的还是这几位“老演员”:
| 算法 | 输出长度 | 你在 CTF 里需要记住的气质 |
|---|---|---|
| MD5 | 128 bit(32 位十六进制) | 老牌常见、速度快、已不抗碰撞,所以题里经常用来爆破/查表 |
| SHA-1 | 160 bit(40 位十六进制) | 也偏老了,偶尔出现,题目常让你“识别 + 爆破” |
| SHA-256 | 256 bit(64 位十六进制) | 现在的主流强者,CTF 里常见于进阶题或文件校验 |
| CRC32 | 32 bit(8 位十六进制) | 这是“校验和”路线,不是密码学安全哈希,但文件题里很爱用 |
咪猫小观察: 很多时候你甚至不用工具,光看长度就能猜个七七八八:32/40/64/8 这四个长度,简直像题目在对你眨眼bulingbuling~👀
四、哈希题怎么做才稳:一条主线走到底
哈希题如果你总感觉“我会工具但不会做题”,那大概率是因为你少了这一条主线:
先确定算法 → 再确定输入到底是什么(文本?字节?文件?)→ 再决定用匹配/查表/爆破 → 最后做对比验证
这里的关键是第二步:“输入到底是什么”。 很多题目不是难在算法,是难在它偷偷换了你的“喂法”:
- 文本是 UTF-8 还是 GBK?
- 有没有多一个换行符
\n? - 是字符串
"123456",还是文件内容的字节流? - 十六进制字符串
313233你是当“文本”喂进去,还是先转成字节0x31 0x32 0x33再喂?
这些细节会让哈希值完全不同——雪崩效应说翻脸就翻脸。
一个练手的小例子
- 明文
123456的 MD5:e10adc3949ba59abbe56e057f20f883e - 明文
123456的 SHA-256:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
(MD5 输出 128 bit 的定义见 RFC 1321。 (RFC 编辑器);SHA-256 属于 FIPS 180-4 的 SHA-2 系列。 (NIST出版物))
五、三种常见题型:其实都在“匹配”
我尽量不把这里写成分叉树(其实是因为懒bushi),所以我把它们统一成了一句话:
题目给你一个“目标哈希”,你要做的是生产出“同款哈希”。
差别只在于“你要生产多少次”。
1)送分型:直接计算对比
题目给明文、给文件、给一段数据,让你算 MD5/SHA-256 ——那就是“盖章”。
CyberChef 里直接搜 MD5、SHA2(选择 SHA-256)、或者 Checksum(常含 CRC32 之类),把数据丢进去就行。
2)高频型:爆破/字典匹配⭐
题目只给哈希值,但暗示原文很“人类”——比如 4 位数字、生日、弱密码、常见单词。 这时候的正确姿势不是硬刚宇宙字符集,而是缩小范围,像咪猫一样“抓住尾巴就不放”:
- 如果提示“4 位数字”,那就锁定
0000到9999 - 如果提示“生日”,那就锁定日期格式(
YYYYMMDD、YYMMDD) - 如果提示“弱口令”,那就直接上字典(rockyou 这类)
CyberChef 也能做这种匹配思路:你可以用生成候选(例如范围、组合、拼接)→ 计算哈希 → 用查找/过滤去定位目标。工具怎么摆不重要,重要的是:候选空间要小、验证要快、结果要复核。
3)结合隐写:文件校验不一致
题目给你“文件 + 期望哈希”,让你验证是否一致。一旦不一致,我们就要立刻警觉了:
要么文件被改过(最常见),要么你算哈希的方式不对(例如算了文本而不是算文件字节),要么题目让你找“被附加/被拼接/被嵌套”的内容。
六、文件隐写:”解密“之前先听文件说话
几乎大部分的 misc 隐写题里,最值钱的技能其实都只有一句:
先识别文件的真实身份,再谈怎么提取秘密。
文件是会“伪装”的:后缀名写着 .jpg,但它骨子里可能是 PNG;你以为它是图片,结果它肚子里塞了一个 ZIP;你以为到结尾就结束,结果 EOF 后面还有一段悄悄话。
1)“魔法识别”:看 Magic Bytes(文件签名)
下面是几个最常见的需要我们熟悉的“开场白”:
- PNG 的文件署名是固定 8 字节:
89 50 4E 47 0D 0A 1A 0A(W3C 的 PNG 规范里写得很清楚。 (W3C)) - ZIP 常见的局部文件头开头是
50 4B 03 04(“PK”) - GZIP 常见魔数是
1F 8B(写在 RFC 1952 里。 (IETF Datatracker))
所以当你在 Hex 里看到这些“签名”,就像看到角色露出了尾巴:哦,你其实是你。
2)“魔法切片”:从数据流里挖出嵌套文件
隐写最爱干的事之一,就是把一个文件“塞进另一个文件”。 在 CyberChef 里,和这条思路最搭的组合通常是:
View Hex/Strings:先找线索(比如flag{、PK、IHDR、IEND)Extract Files:从数据里扫描并尝试提取嵌入文件(这个操作本身就是为“扫描/提取嵌套文件”设计的。 (DeepWiki))Magic:如果你面对的是一团奇怪的编码/压缩混合物,让它先帮你猜可能的解法路线(CyberChef Wiki 对 Magic 的定位有说明。 (GitHub))
在这里需要提醒大家一句:
“提取失败”不代表没有东西,可能只是——嵌入文件不完整、被截断、或者被简单加扰了一下(比如异或、反转、移位)。这时候你要回到 Hex 里,再观察一次“结构有没有断”。
3)“结构感”:图片类隐写为什么容易藏东西
以 PNG 为例,它不是“从头到尾一坨像素”,它是由一个个 chunk 拼起来的(IHDR、IDAT、IEND 等)。这种结构化格式,天然适合塞额外数据: 你可能在 IEND 后面发现多余字节,也可能在某些 chunk 里发现异常内容。PNG 的整体结构在规范里有详细描述(W3C PNG Spec)。 (W3C)
七、咪猫的三大避坑点
坑 1:哈希“大小写”到底怎么回事?
哈希结果本质是“字节序列”,我们常看到的 e10adc... 只是把字节用十六进制打印出来。
十六进制显示可以是大写也可以是小写,但它们表示同一串字节——所以对比时通常把十六进制字符串统一成同一种大小写即可。
(注意:这说的是“十六进制展示形式”,不是说“输入不区分大小写”。输入当然区分!)
坑 2:文件后缀名不可信,Hex 才是身份证
看到 .jpg 别着急跳坑,先看文件签名。PNG 的签名固定到离谱(见上面的 8 字节)。 (W3C)
坑 3:爆破不是蛮力,是范围管理
应该知道,题目给我们的任何提示(位数、格式、字符集、主题),都应该立刻变成我们的“候选空间剪刀”。 先剪小再跑,才是比赛里最省时间的魔法。
八、总结:
哈希题:认算法 → 认输入(文本/字节/文件)→ 造候选 → 计算 → 匹配 → 复核。
隐写题:看签名/结构 → 看 Hex/Strings 找线索 → 提取嵌套文件 → 必要时再做还原。
如果你愿意把这套流程练熟,哈希和隐写就会从“看起来神秘”变成“走起来顺手”啦~🐾✨
over
