
1. RSA加密算法基础解析RSA作为目前最广泛使用的非对称加密算法其安全性基于大整数分解的数学难题。算法核心包含三个关键参数公钥(n,e)用于加密数据私钥(n,d)用于解密数据模数n两个大素数p和q的乘积典型加密过程为c ≡ m^e mod n其中m是明文c是密文。解密则是m ≡ c^d mod n。在CTF竞赛中常见的RSA攻击场景包括模数n过小导致暴力分解公钥指数e选取不当如e3共模攻击选择密文攻击2. 题目场景深度分析根据题目描述我们面对的是典型的选择密文攻击场景。已知条件包括两条被同一RSA公钥加密的日志密文c1、c2日志格式存在固定前缀(prefix)和后缀(suffix)公钥参数n和e5这种场景下攻击者可以利用格式固定的特性构造数学关系进行攻击。由于e5较小容易受到低加密指数攻击。3. 攻击原理与数学推导3.1 消息结构建模假设真实变化的flag部分为f则两条日志消息可表示为 m1 prefix || f1 || suffix m2 prefix || f2 || suffix由于使用相同公钥加密得到 c1 ≡ m1^5 mod n c2 ≡ m2^5 mod n3.2 多项式构造考虑两个密文之间的关系可以建立多项式 f(x) (a x)^5 - c1 g(x) (a x)^5 - c2其中aprefix||suffix的数值表示。通过求解这两个多项式的公共根可以恢复出f1和f2。4. 具体攻击步骤实现4.1 参数预处理将prefix和suffix从十六进制转换为整数计算a (prefix k) suffixk是suffix的bit长度验证a^5 n确保未发生模运算4.2 多项式求解使用SageMath实现n ... # 题目给出的模数 e 5 c1 ... # 第一条密文 c2 ... # 第二条密文 prefix 0x757365723d suffix 0x26726f6c653d6775657374 R.x PolynomialRing(Zmod(n)) f (prefix*2^(len(bin(suffix))-2) x*2^(len(bin(suffix))-2) suffix)^e - c1 g (prefix*2^(len(bin(suffix))-2) x*2^(len(bin(suffix))-2) suffix)^e - c2 def gcd(a, b): while b: a, b b, a % b return a.monic() flag -gcd(f, g).coefficients()[0] print(bytes.fromhex(hex(flag)[2:]))4.3 结果验证检查输出的flag是否符合预期格式尝试用flag构造明文并验证加密结果确认flag的唯一性和正确性5. 防御措施与安全建议针对此类攻击实际系统应使用足够大的密钥长度至少2048位避免使用过小的公钥指数推荐e65537对消息进行随机填充如OAEP避免在加密协议中使用固定格式定期更换密钥对6. 扩展思考该题目展示了格式固定带来的安全隐患。在实际密码学应用中还需要考虑时间侧信道攻击错误注入攻击随机数生成质量协议层面的安全性通过CTF竞赛中的这类题目可以深入理解RSA的实际安全边界避免在真实场景中出现类似漏洞。