
1. 从pyc文件到源码逆向工程第一步拿到CTF题目时经常会遇到.pyc这样的Python编译文件。这种文件就像被压缩过的快递包裹我们需要先拆开包装才能看到里面的内容。我常用的方法是使用在线Python反编译工具比如知名的uncompyle6引擎网站。把rsa.pyc文件上传后不到5秒就能还原出原始代码这比本地搭建反编译环境方便多了。反编译得到的源码通常会保留完整的变量名和逻辑结构。以这个题目为例我们能看到清晰的RSA加密流程先定义质数p和q计算模数np*q然后使用标准公钥指数e65537对flag进行加密。这里有个细节值得注意——源码中使用了b2a_hex将字符串转为16进制整数这说明后续解密时需要进行反向操作。2. 解密参数全解析认识RSA的五个关键面对反编译得到的代码我们需要像侦探一样找出所有线索。RSA解密需要五个关键参数p和q两个大质数题目直接给出p 0xED7FCFABD3C81C78E212323329DC1EE2BEB6945AB29AB51B9E3A2F9D8B0A22101E467 q 0xAD85852F9964DA87880E48ADA5C4487480AA4023A4DE2C0321C170AD801C9n模数等于p*qe公钥指数通常是65537c密文即加密后的flag这里有个新手容易踩的坑十六进制字符串需要先转换成整数才能运算。我见过有人直接对字符串做数学运算结果当然会报错。正确的做法是用int(0x...,16)进行转换或者直接使用Python的十六进制字面量。3. 私钥计算实战用gmpy2破解d值计算私钥d是整个解密过程的核心步骤。根据RSA原理d是e关于φ(n)的模反元素其中φ(n)(p-1)*(q-1)。用数学表达式就是d ≡ e⁻¹ mod φ(n)实际操作中我们使用gmpy2库的invert函数phi (p-1)*(q-1) d gmpy2.invert(e, phi)这里有个性能优化技巧当p和q都是大数时直接计算(p-1)*(q-1)可能会很慢。我测试过对于2048位的RSA用gmpy2库比Python原生运算快10倍以上。这也是为什么CTF中经常看到gmpy2的身影——它专门为高精度数学运算优化过。4. 明文还原从数字到flag的蜕变拿到私钥d后最后的解密就是模幂运算m pow(c, d, n)但这时候得到的m还是个长整数需要转换成可读字符串。这里涉及两个关键转换用long_to_bytes将整数转为字节串题目中还用了base64编码所以需要额外解码flag long_to_bytes(m) print(base64.b64decode(flag))曾经有个有趣的案例某次比赛我解出来的flag显示乱码后来发现是忘了题目说明里提到的base64编码。这个小教训让我现在养成了习惯——解密后总要看看输出是不是可打印字符如果不是就尝试常见的编码转换。5. 完整脚本与调试技巧把上述步骤整合起来完整的解密脚本如下from Crypto.Util.number import * import gmpy2 import base64 p 0xED7FCFABD3C81C78E212323329DC1EE2BEB6945AB29AB51B9E3A2F9D8B0A22101E467 q 0xAD85852F9964DA87880E48ADA5C4487480AA4023A4DE2C0321C170AD801C9 e 65537 n p * q c 0x75AB3202DE3E103B03C680F2BEBBD1EA689C8BF260963FE347B3533B99FB391F0A358FFAE5160D6DCB9FCD75CD3E46B2FE3CFFE9FA2E9508702FD6E4CE43486631 phi (p-1)*(q-1) d gmpy2.invert(e, phi) m pow(c, d, n) flag long_to_bytes(m) print(base64.b64decode(flag))调试时常见的问题有三个一是环境缺少Crypto或gmpy2库可以用pip install pycryptodome gmpy2安装二是大数运算超时这时可以检查是否误用了普通int而非gmpy2的mpz类型三是编码转换错误建议在每一步都打印中间结果检查数据类型。6. RSA入门者的必备工具包根据我的实战经验处理RSA题目需要准备以下工具Python环境建议3.6版本必备库pycryptodome提供Crypto.Util.numbergmpy2高性能大数运算sympy可选用于复杂数学运算在线工具Python反编译网站大数分解工具当p/q未知时编码转换工具有个小技巧分享在VSCode里可以配置代码片段把RSA解密的模板代码保存起来遇到新题目时只需替换参数值就行。我自己的模板包含十六进制转换、模逆计算等常用操作至少能节省50%的编码时间。7. 从解题到理解RSA原理深入浅出通过这个题目我们其实已经触摸到了RSA的核心机制。用日常场景比喻p和q像是两把独特的钥匙它们的乘积n就像打造了一个坚固的保险箱。公钥e是保险箱上的数字锁而私钥d就是开锁的密码。加密过程相当于把物品放进保险箱并转动数字锁只有知道d的人才能重新打开它。在CTF比赛中RSA题目通常会在这几个环节设置挑战隐藏p或q需要分解n使用非常规的e值添加额外的编码或加密层结合其他密码学算法理解了这个基础版本后再去挑战更复杂的变种就会轻松很多。比如下次看到n很大但e很小的情况就能联想到低加密指数攻击当发现p和q很接近时可以尝试费马分解法。