从伪加密ZIP到RSA解密:手把手带你复现BUUCTF那道ACTF新生赛Crypto题
从伪加密ZIP到RSA解密手把手带你复现BUUCTF那道ACTF新生赛Crypto题当你第一次接触CTF密码学题目时面对一个看似普通的ZIP压缩包和一堆加密参数很容易感到无从下手。本文将带你完整复现BUUCTF平台上那道经典的ACTF新生赛Crypto题目从ZIP伪加密破解到RSA解密一步步揭开谜题的面纱。1. 破解伪加密ZIP文件大多数CTF选手第一次遇到伪加密的ZIP文件时都会感到困惑——为什么密码明明不对却能解压这是因为ZIP文件格式中有一个鲜为人知的特性加密标志位可以被手动修改而不影响实际加密状态。1.1 识别伪加密特征使用WinHex或010 Editor打开题目提供的ZIP文件你会看到类似如下的十六进制数据50 4B 03 04 14 00 09 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00关键点在于第7-8字节示例中的09 00这组值决定了文件的加密状态。在标准的ZIP文件格式中无加密00 00真加密01 00伪加密09 00或08 001.2 修改加密标志位使用十六进制编辑器执行以下操作搜索50 4B 03 04定位到ZIP文件头将第7-8字节从09 00改为00 00保存文件后尝试解压注意某些ZIP工具会自动检测伪加密并拒绝解压推荐使用7-Zip或命令行unzip工具。2. 分析解压出的RSA脚本成功解压后通常会得到一个Python脚本和一个output文件。让我们先看脚本内容from Crypto.Util.number import * import gmpy2 p getPrime(512) q getPrime(512) n p * q e 65537 phi (p-1)*(q-1) d gmpy2.invert(e, phi) flag bACTF{...} m bytes_to_long(flag) c pow(m, e, n) print(fp {hex(p)}) print(fq {hex(q)}) print(fc {hex(c)})这是一个标准的RSA加密实现关键参数包括p, q两个大质数512位n模数p*qe公钥指数通常为65537d私钥指数c密文3. 理解output文件内容output文件通常包含加密过程中生成的参数格式如下p 0xabcdef123456... q 0x987654321abc... c 0x102030405060...这些十六进制字符串可以直接在Python中转换为整数p int(abcdef123456..., 16) q int(987654321abc..., 16) c int(102030405060..., 16)4. 编写RSA解密脚本现在我们已经有了所有必要的参数可以编写解密脚本了。以下是完整的解密流程from Crypto.Util.number import long_to_bytes import gmpy2 # 从output文件复制过来的参数 p 0xabcdef123456... # 替换为实际的p值 q 0x987654321abc... # 替换为实际的q值 c 0x102030405060... # 替换为实际的c值 # 计算必要的参数 n p * q e 65537 phi (p-1)*(q-1) d gmpy2.invert(e, phi) # 解密 m pow(c, d, n) flag long_to_bytes(m) print(flag)4.1 常见问题排查如果运行脚本时遇到错误检查以下几点gmpy2安装问题pip install gmpy2如果安装失败可以尝试pip install gmpy22.0.8 # 指定较旧版本大整数处理确保所有大整数都以正确的格式输入特别是在复制十六进制值时不要遗漏任何字符。字节转换最后的long_to_bytes步骤至关重要直接打印整数m会得到错误的flag。5. 进阶技巧与优化对于更复杂的RSA题目你可能需要以下技巧5.1 多素数RSA当n由多个素数组成时n pqr*...欧拉函数计算方式变为phi (p-1)*(q-1)*(r-1)*...5.2 中国剩余定理加速对于大数解密可以使用CRT加速dp d % (p-1) dq d % (q-1) qinv gmpy2.invert(q, p) m1 pow(c, dp, p) m2 pow(c, dq, q) h (qinv * (m1 - m2)) % p m m2 h * q5.3 小指数攻击当e很小时如e3可能直接开方就能得到明文m gmpy2.iroot(c, e)[0]在实际的CTF比赛中RSA题目往往不会这么直接。你可能需要结合多种攻击方式如模数分解当n较小时共模攻击当多个密文使用相同的nWiener攻击当d较小时Franklin-Reiter相关消息攻击记住每道CTF题目都是独特的关键在于理解基本原理并灵活应用。通过这道ACTF新生赛题目的完整复现你应该已经掌握了从伪加密ZIP处理到基础RSA解密的完整流程。下次遇到类似题目时不妨先冷静分析文件结构再逐步破解各个加密环节。