关联爆破
比赛也遇到不少形式了,知道要用剪枝操作,但是代码有时候总是操作不好,这里特记录一下,也算是一种脚本的总结
已知p*q和p^q
方法一
github有一个开源的工具,别人写好的sliedes/xor_factor: Given p xor q and n=p*q for two unknown primes p and q, factor n and output p and q. (github.com)
终端直接运行就行
方法二
逐位爆破,从低位开始爆破
1 | 假设p的第一个低位为1(可以通过给出的n和p^q的值判断) |
题目
1 | from Crypto.Util.number import * |
代码
1 | from Crypto.Util.number import * |
已知p*q和(p^q>>bits)
这个题目和上面不一样就是p^q的值进行了移位操作,那么我们就不知道低位的值,也就不能从低位爆破了
那么能不能从高位爆破,问题就在于如何提取高位,我们在上面通过取模得到低位,那么高位只能通过移位获取
这里有个问题就是我们没办法爆破得到所有的位数,因为移位后的数据被抹掉了
但是我们可以爆破到已知的位数,然后利用coppersmith定理求取未知的部分
总结就是第一个情况需要从低位开始爆破,第二个情况就是从高位开始
下面总结两个脚本方法,原理都是从高位开始
题目一
1 | from Crypto.Util.number import * |
代码
爆破思路:当p,q相同位相同时为0,不同时为1,爆破的时候只需要逐位判断两种情况,当为0时p,q都置0或者都置1,当为1时p,q分别置1
1 | N = 18706855965472342624057939763424482872214329403736588022670810823830284968210885370388661001166733799554843541458754316300002655734547865499832294251476719959685339472505232553318035696334043294583493018799085665100973395464171935497665253854897019585848130524402110067723380001729487763295805724049305195847415832438554371670757918022485495294646131894414072289025724167436635324722072486662116496042680216887523471775800611333173420803326625619428964822316053642973227668518358385684985208861639528026293678346064873875113765964212781464014313025439732581964381711834800618756897046018036356342152039250047100962433 |
求出p后就能解rsa了
1 | from Crypto.Util.number import * |
题目二
1 | from Crypto.Util.number import * |
代码
这里个上一题也有一些不一样,泄露的位数没有那么多,在用coppersmith时需要调小参数
代码来源:2023-鹏城杯-wp-crypto | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz)
这里还有一个比较不同的,就是上个我们是移位操作,这个就假设未爆破的位数为全0或者全1,原理其实都一样
1 | from Crypto.Util.number import * |
已知p*q和(p+q>>bits)
1 | 不同点 |
题目
1 | from Crypto.Util.number import * |
代码
1 | N = 22398699297762429492240463695149209598953191913914250274334959408936466626709767203795928260632633526529986584516612990634853439372145270966645004610843264907486995514891241264900062942677946045045102531217747973015030965015115984831603228162539840321760619025278925339356880648514285731088578156632342855265866008190857967855561352802052119373432686410402584018364224892529791407346844329490691835861851663985544831188244011267819905082223999055440614384023833104923725075939687869221677886604547462159479192421742664500289270937685723384566928149675802958103124877898785273157964165967194692892199269557387215118229 |
然后解rsa
1 | from Crypto.Util.number import * |
已知p*q和(p^_q)
_q就是把q的二进制逆序
1 | 爆破思路: |
题目
1 | from Crypto.Util.number import * |
代码
1 | from Crypto.Util.number import * |
学习参考
Crypto趣题-剪枝 | 糖醋小鸡块的blog (tangcuxiaojikuai.xyz)