从蓝桥杯省赛题看实战:手把手教你用Python复现RSA、AES和XXTEA加密破解

张开发
2026/4/7 5:35:44 15 分钟阅读

分享文章

从蓝桥杯省赛题看实战:手把手教你用Python复现RSA、AES和XXTEA加密破解
从蓝桥杯省赛题看实战手把手教你用Python复现RSA、AES和XXTEA加密破解在网络安全竞赛和实际渗透测试中密码学算法是绕不开的核心技能点。本文将以蓝桥杯省赛题目为切入点带你从零开始用Python实现RSA、AES和XXTEA三种典型加密算法的破解过程。不同于简单的解题步骤罗列我们将深入每种算法的数学原理和实现细节让你真正掌握知其然更知其所以然的实战能力。1. RSA加密破解实战RSA作为非对称加密的经典算法其安全性基于大整数分解难题。我们先来看蓝桥杯省赛中的这道题目from Crypto.Util.number import * from gmpy2 import * flag bxxx m bytes_to_long(flag) p getPrime(512) q next_prime(p) # 关键提示p和q是相邻素数 e 65537 n p * q phi (p - 1) * (q - 1) d inverse(e, phi) d1 d % q d2 d % p c pow(m, e, n) print(n) # 输出模数 print(d1) # 输出d mod q print(d2) # 输出d mod p print(c) # 输出密文1.1 破解思路分析这道题的关键在于q next_prime(p)这个条件。当两个素数相邻时我们可以利用以下数学性质计算sqrt(n)得到介于p和q之间的整数x寻找x的下一个素数即为q通过p n // q得到p实际操作步骤import gmpy2 import sympy from Crypto.Util.number import long_to_bytes n 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791 c 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829 # 计算平方根并寻找相邻素数 x gmpy2.isqrt(n) q sympy.nextprime(x) p n // q # 验证素数 assert p * q n # 计算私钥 phi (p-1)*(q-1) e 65537 d gmpy2.invert(e, phi) # 解密 m pow(c, d, n) print(long_to_bytes(m))1.2 关键点解析gmpy2库的使用处理大整数运算比Python原生整数类型效率更高素数检测sympy.nextprime能可靠找到下一个素数模逆运算gmpy2.invert计算模反元素解密公式m ≡ c^d mod n提示在实际CTF比赛中当n较小时(如1024位)也可以直接使用yafu工具进行因数分解。2. AES-CBC模式破解实战AES是当前最常用的对称加密算法蓝桥杯题目给出了CBC模式下的完整参数key: gamelabgamelab IV: gamelabgamelab 密文: 4da72144967f1c25e6273950bf29342aae635e2396ae17c80b1bff68d90f16679bb45c15852e0ce88d4864d93e9e3be22.1 Python实现解密from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import binascii key bgamelabgamelab iv bgamelabgamelab ciphertext binascii.unhexlify(4da72144967f1c25e6273950bf29342aae635e2396ae17c80b1bff68d90f16679bb45c15852e0ce88d4864d93e9e3be2) cipher AES.new(key, AES.MODE_CBC, iv) plaintext unpad(cipher.decrypt(ciphertext), AES.block_size) print(plaintext.decode())2.2 CBC模式特点特性说明初始化向量(IV)必须与加密时使用的相同块链式处理每个明文块先与前一个密文块异或填充要求必须使用PKCS7等标准填充方式错误传播单个块错误会影响后续两个块常见攻击场景当IV可预测时可能遭受选择明文攻击填充Oracle攻击(Padding Oracle Attack)注意在实际开发中key和IV不应该使用相同值且IV应该是随机的。3. XXTEA算法逆向分析XXTEA是TEA加密算法的改进版常用于CTF逆向题目。蓝桥杯题目给出了加密后的数据和密钥unsigned int v[11] { 0x480AC20C, 0xCE9037F2, 0x8C212018, 0xE92A18D, 0xA4035274, 0x2473AAB1, 0xA9EFDB58, 0xA52CC5C8, 0xE432CB51, 0xD04E9223, 0x6FD07093 }; unsigned int key[4] { 0x79696755, 0x67346F6C, 0x69231231, 0x5F674231 };3.1 Python实现解密import ctypes def decrypt(v, key): delta 0x61C88647 n len(v) rounds 6 52 // n sum (ctypes.c_uint32(rounds * delta)).value y ctypes.c_uint32(v[0]) for _ in range(rounds): e (sum 2) 3 for p in range(n-1, 0, -1): z ctypes.c_uint32(v[p-1]) v[p] ctypes.c_uint32( (v[p] - ((z.value5 ^ y.value2) (y.value3 ^ z.value4) ^ (sum ^ y.value) (key[(p3)^e] ^ z.value))).value ).value y.value v[p] z ctypes.c_uint32(v[n-1]) v[0] ctypes.c_uint32( (v[0] - ((z.value5 ^ y.value2) (y.value3 ^ z.value4) ^ (sum ^ y.value) (key[(03)^e] ^ z.value))).value ).value y.value v[0] sum ctypes.c_uint32(sum - delta).value return v v [ 0x480AC20C, 0xCE9037F2, 0x8C212018, 0xE92A18D, 0xA4035274, 0x2473AAB1, 0xA9EFDB58, 0xA52CC5C8, 0xE432CB51, 0xD04E9223, 0x6FD07093 ] key [0x79696755, 0x67346F6C, 0x69231231, 0x5F674231] decrypted decrypt(v, key) flag b.join(int.to_bytes(x, 4, little) for x in decrypted) print(flag.decode())3.2 XXTEA算法特点Feistel结构通过多轮迭代实现混淆和扩散可变轮数通常为6 52/n轮大整数运算使用32位无符号整数和模运算密钥调度通过(p3)^e实现密钥的动态选择识别特征魔数0x61C88647(即黄金分割点相关值)MX宏定义的位运算组合典型的加密/解密循环结构4. 综合技巧与调试方法在实际解题过程中除了算法实现外还需要掌握以下实用技巧4.1 常用Python库库名称用途安装命令pycryptodome加密算法实现pip install pycryptodomegmpy2大整数运算pip install gmpy2sympy符号计算pip install sympypwntoolsCTF工具集pip install pwntools4.2 调试技巧RSA相关# 检查素数相邻性 def is_consecutive(p, q): return next_prime(p) q # 小指数攻击检查 if e 3 and m n^(1/3): print(bytes.fromhex(hex(m)[2:]))AES相关# 检查填充是否正确 try: unpad(plaintext, AES.block_size) except ValueError: print(Padding error!)逆向工程# 使用xxd查看二进制文件 xxd -g 1 target_file | less # 使用strings查找可打印字符 strings -n 8 target_file4.3 性能优化对于大数运算使用gmpy2可以显著提升速度# 对比普通Python与gmpy2的速度 import time from gmpy2 import mpz n 1234567890123456789012345678901234567890 start time.time() pow(n, 65537, n1) print(Native:, time.time()-start) n_mpz mpz(n) start time.time() pow(n_mpz, 65537, n_mpz1) print(gmpy2:, time.time()-start)掌握这些密码学实战技能不仅能帮助你在CTF比赛中取得好成绩更能深入理解现代加密系统的实现原理和潜在弱点。建议读者可以尝试复现本文中的代码示例并自行寻找类似的题目进行练习。

更多文章