BUUCTF实战笔记——Crypto密码学入门精解

BUUCTF实战笔记——Crypto密码学入门精解

1. 从零开始认识CTF密码学

第一次接触CTF比赛时,看到Crypto题目完全不知道从何下手。后来在BUUCTF平台刷题过程中,发现密码学就像侦探破译密文,需要掌握各种加密特征和破解工具。举个例子,遇到U2FsdGVkX1开头的字符串,大概率是Rabbit加密;看到=结尾的编码可能是Base64或Quoted-printable。

密码学题目主要分为三大类:

  • 古典密码:凯撒、栅栏等手工加密方式
  • 现代密码:RSA、AES等基于数学难题的加密
  • 编码转换:Base64、URL编码等非加密类转换

2. 古典密码实战:变异凯撒

2.1 题目特征分析

遇到密文afZ_r9VYfScOeO_UL^RWUc,题目提示"变异凯撒"。普通凯撒是固定位移,而变异凯撒的位移量会变化。通过观察密文中的特殊符号_^,可以联想到ASCII码偏移。

2.2 破解步骤详解

  1. 对比明密文开头:

    • 明文flag的ASCII码:f(102) l(108) a(97) g(103)
    • 密文开头afZ_的ASCII码:a(97) f(102) Z(90) _(95)
  2. 计算偏移量:

    # 第一组偏移 102 - 97 = 5 # f -> a 108 - 102 = 6 # l -> f 97 - 90 = 7 # a -> Z 103 - 95 = 8 # g -> _
  3. 编写解密脚本:

    cipher = "afZ_r9VYfScOeO_UL^RWUc" offset = 5 for char in cipher: print(chr(ord(char) + offset), end='') offset += 1 # 输出:flag{Caesar_variation}

3. 现代密码实战:RSA基础

3.1 RSA核心公式

  • 密钥生成
    n = p × q φ(n) = (p-1)(q-1) d ≡ e⁻¹ mod φ(n)
  • 加解密
    加密:c ≡ m^e mod n 解密:m ≡ c^d mod n

3.2 典型题目解法

给定参数:

p = 473398607161 q = 4511491 e = 17

求d的值:

import gmpy2 p = 473398607161 q = 4511491 e = 17 phi = (p-1)*(q-1) d = gmpy2.invert(e, phi) print(d) # 输出:125631357777427553

4. 哈希破解:丢失的MD5

4.1 题目场景

给出一段Python代码片段,要求通过暴力破解找到符合特定MD5特征的字符串。关键特征包括:

  • 包含子串'e9032'
  • 包含子串'da'
  • 包含子串'911513'

4.2 破解脚本优化

原始代码需要三重循环爆破,这里用更高效的实现:

import hashlib from itertools import product chars = [chr(i) for i in range(32, 127)] prefix = 'TASC' middle = 'O3RJMV' suffix = 'WDJKXZM' for combo in product(chars, repeat=3): s = prefix + combo[0] + middle + combo[1] + suffix[:5] + combo[2] + suffix[5:] md5 = hashlib.md5(s.encode()).hexdigest() if 'e9032' in md5 and 'da' in md5 and '911513' in md5: print(f"Found: {s} -> {md5}") break

5. 编码识别技巧总结

5.1 常见编码特征表

编码类型识别特征工具推荐
Base64结尾常带=,字符集A-Za-z0-9+/CyberChef
URL编码大量%开头浏览器地址栏自动解码
Quoted-printable=XX形式(XX为十六进制)Notepad++插件
摩斯电码.-组成Morse Code Translator

5.2 实战案例:Quoted-printable

密文示例:

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

解码步骤:

  1. 使用在线解码工具直接转换
  2. 得到UTF-8编码的中文:"那你也很棒哦"
  3. 最终flag格式:flag{那你也很棒哦}

6. 密码学工具链推荐

6.1 必备工具清单

  1. Python库

    • pycryptodome:支持主流加密算法
    • gmpy2:大数运算
    • hashlib:哈希计算
  2. 在线工具

    • CyberChef :瑞士军刀式编解码
    • factordb :大数分解
  3. 专用工具

    • RSATool2:RSA密钥生成
    • John the Ripper:密码爆破

7. 解题思维训练

遇到新题型时的思考路径:

  1. 观察特征:查看密文结构、特殊符号
  2. 尝试分类:判断属于古典/现代密码或编码
  3. 工具验证:用相应工具测试常见加密方式
  4. 逆向分析:研究题目给的源代码或提示
  5. 暴力破解:作为最后手段(需控制范围)

以Rabbit加密为例:

  • 特征:密文以U2FsdGVkX1开头
  • 工具:使用在线Rabbit解密工具
  • 技巧:若无密码提示,可尝试空密码解密

8. 常见踩坑记录

  1. 编码问题

    • Python2/3的字符串处理差异
    • 中文字符需要encode('utf-8')
  2. 工具误用

    • 把Base64当作加密算法处理
    • 混淆MD5和SHA1的特征值长度
  3. 数学错误

    • RSA计算时漏掉φ(n)
    • 大数运算时忘记转换数据类型

一个真实案例:在解RSA题目时,我曾因为直接用pow(c,d,n)而卡住,后来发现需要先用long_to_bytes转换结果。这提醒我们不仅要懂数学原理,还要注意编程实现的细节。