ctf中crypto题目做法
CTF里的中做法crypto题,本质就是题目一场猜谜游戏。出题人把数学公式包装成密文,中做法选手得在几小时内还原出背后的题目逻辑。我见过太多人卡死在第一步——看到RSA就套脚本,中做法看到AES就硬跑字典,题目结果连题目给的中做法提示都没看全。
先分清题型再动手。题目最常见的中做法几类:RSA体系、对称加密、题目哈希长度扩展、中做法还有那些故意留后门的题目“魔改”协议。RSA占六成以上,中做法但别急着背Wiener攻击脚本。题目先看参数,中做法n是不是两个相邻素数相乘?e是不是65537但phi(n)算错了?有些题故意把p和q的差设成2,你直接开平方根就能分解,根本不用费劲去跑yafu。
有一次我遇上一道题,给了n、e、c,还有一行注释:“p和q很接近哦”。我下意识就试了费马分解,结果跑了十分钟没反应。后来发现p和q的差是10的幂次——那就该用Pollard p-1算法,因为其中一个因子减1是光滑数。这种细节,题目里那个“很接近”其实是个陷阱,真正的线索藏在n的二进制长度里。
对称加密的题目反而更考验脑洞。AES-CTR如果nonce复用,直接拿两组密文异或就能得到明文异或,再猜一个明文就能恢复另一个。但有些题不这么直白,比如CBC的padding oracle,需要你逐字节爆破。这活儿枯燥,但有个技巧:先算清block size,再找IV和第一块密文的关系,因为oracle只会告诉你padding对不对,你得自己构造中间值。
哈希长度扩展攻击是个经典坑。很多人知道要拼padding,但忘了长度要精确到bit。MD5和SHA1的填充规则不同,SHA1是64字节长度编码,MD5是56字节。有一次我亲手栽在这——题目用`flag + secret`做了SHA1,给出部分消息让我扩展,我按MD5的规则填了长度,结果校验永远失败。后来翻了代码才发现secret长度是17,得把总长度算成56的倍数再加8字节长度,错一步全盘皆输。
再说说那些看起来像现代密码的题。椭圆曲线如果阶是光滑数,直接Pohlig-Hellman分解离散对数;如果是奇异曲线,可能有异常曲线攻击。但最烦人的是那些故意用弱随机数生成器的——比如LCG,给出连续的输出让你预测下一个。这时候别去逆模数,先看看模数是不是素数,如果是,直接用矩阵求逆就能恢复状态。
有些题根本不需要你会密码学。比如某次比赛,一个AES加密的压缩包,密码提示是“7位数字,生日范围”。我直接先试1900到2020的年份加月份日期,结果第三轮就撞上了。还有一次,密文是Base64套了两层,解出来是明文,但题目标签写着“crypto”——那纯粹是出题人凑数,别被标签唬住。
工具得顺手。我习惯用Python的`Crypto.Util.number`和`sympy`,但遇到大数分解还是得靠yafu和sage。sage能直接处理椭圆曲线群、有限域多项式,比手写快十倍。不过别依赖`factorint`——有些数故意选成`p*q`且p和q都是强素数,这时候得试试`ecm`,用椭圆曲线法碰运气。
最后说个心态问题。crypto题往往卡在某个数学细节上,比如求逆元时忘了模数是合数,或者把指数运算当成模幂。真卡住时,回去看代码里的运算符号——`pow(e, -1, phi)`在Python3.8后支持,但老版本会报错。还有,别忽略题目给的附件名,上次有个文件叫“task.py.bak”,里面藏着原始代码,直接泄露了随机种子。
做crypto题,拼的就是谁更快看穿出题人的小心思。多积累些“非主流”攻击路径,比死磕标准算法有用得多。
先分清题型再动手。题目最常见的中做法几类:RSA体系、对称加密、题目哈希长度扩展、中做法还有那些故意留后门的题目“魔改”协议。RSA占六成以上,中做法但别急着背Wiener攻击脚本。题目先看参数,中做法n是不是两个相邻素数相乘?e是不是65537但phi(n)算错了?有些题故意把p和q的差设成2,你直接开平方根就能分解,根本不用费劲去跑yafu。
有一次我遇上一道题,给了n、e、c,还有一行注释:“p和q很接近哦”。我下意识就试了费马分解,结果跑了十分钟没反应。后来发现p和q的差是10的幂次——那就该用Pollard p-1算法,因为其中一个因子减1是光滑数。这种细节,题目里那个“很接近”其实是个陷阱,真正的线索藏在n的二进制长度里。
对称加密的题目反而更考验脑洞。AES-CTR如果nonce复用,直接拿两组密文异或就能得到明文异或,再猜一个明文就能恢复另一个。但有些题不这么直白,比如CBC的padding oracle,需要你逐字节爆破。这活儿枯燥,但有个技巧:先算清block size,再找IV和第一块密文的关系,因为oracle只会告诉你padding对不对,你得自己构造中间值。
哈希长度扩展攻击是个经典坑。很多人知道要拼padding,但忘了长度要精确到bit。MD5和SHA1的填充规则不同,SHA1是64字节长度编码,MD5是56字节。有一次我亲手栽在这——题目用`flag + secret`做了SHA1,给出部分消息让我扩展,我按MD5的规则填了长度,结果校验永远失败。后来翻了代码才发现secret长度是17,得把总长度算成56的倍数再加8字节长度,错一步全盘皆输。
再说说那些看起来像现代密码的题。椭圆曲线如果阶是光滑数,直接Pohlig-Hellman分解离散对数;如果是奇异曲线,可能有异常曲线攻击。但最烦人的是那些故意用弱随机数生成器的——比如LCG,给出连续的输出让你预测下一个。这时候别去逆模数,先看看模数是不是素数,如果是,直接用矩阵求逆就能恢复状态。
有些题根本不需要你会密码学。比如某次比赛,一个AES加密的压缩包,密码提示是“7位数字,生日范围”。我直接先试1900到2020的年份加月份日期,结果第三轮就撞上了。还有一次,密文是Base64套了两层,解出来是明文,但题目标签写着“crypto”——那纯粹是出题人凑数,别被标签唬住。
工具得顺手。我习惯用Python的`Crypto.Util.number`和`sympy`,但遇到大数分解还是得靠yafu和sage。sage能直接处理椭圆曲线群、有限域多项式,比手写快十倍。不过别依赖`factorint`——有些数故意选成`p*q`且p和q都是强素数,这时候得试试`ecm`,用椭圆曲线法碰运气。
最后说个心态问题。crypto题往往卡在某个数学细节上,比如求逆元时忘了模数是合数,或者把指数运算当成模幂。真卡住时,回去看代码里的运算符号——`pow(e, -1, phi)`在Python3.8后支持,但老版本会报错。还有,别忽略题目给的附件名,上次有个文件叫“task.py.bak”,里面藏着原始代码,直接泄露了随机种子。
做crypto题,拼的就是谁更快看穿出题人的小心思。多积累些“非主流”攻击路径,比死磕标准算法有用得多。
本文地址:http://www.79wt.cn/news/1642b1299823.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。