一些关于p^q问题剪枝算法
此篇文章针对 RSA 中 p^q 相关问题及变种做一个总结。之前做过很多 p^q 相关的问题,但是思路大差不差,周末打了鹏城杯,复现时发现要结合 copper 和 dfs 来剪枝。
参考文章
https://tangcuxiaojikuai.xyz/post/342113ee.html
https://mp.weixin.qq.com/s/Bi0iQOXwM5UlntrtdRL1oA
p^q
搜索方式
- 从低位搜索,在已知 p^q 和 p*q
的情况下,由于异或是按位进行的,对于每一位异或的结果来说,p、q
该位的组合情况有 4 种
[1,0][0,1][1,1][0,0]
剪枝条件
- 利用
p*q==n
这一条件来进行筛选,由于是从低位开始爆破,因此满足\(p_{low}*q_{low}==n_{low}\)
1 |
|
p^q_rev
1 |
|
搜索方式
- 从两端爆破
- 每一次搜索,需利用当前 gift 两端的 bit 位。这是因为,gift 的当前最高位对应 p 的最高位及 q 的最低位,gift 的当前最低位对应 p 的最低位及 q 的最高位
剪枝条件
- 将 p、q 未搜索到的位全填 0,乘积应小于 n
- 将 p、q 未搜索到的位全填 1,乘积应大于 n
- p、q 低 k 位乘积再取低 k 位,应与 n 的低 k 位相同
1 |
|
p^(q>>nbits)
1 |
|
思路
这个其实并不算剪枝了,因为 gift 的高 16 位就是 P 的高 16 位。用 N 除以 P 后得到的就是 Q 的高位,再次利用 Q 的高位和 gift,可以求出 P 的 16 ~ 32 位,以此类推来恢复 P、Q。
1 |
|
(p^q)>>nbits
1 |
|
搜索方式
- 从高位搜索
- p 的高位乘 q 的高位的前半部分等于 n 的高位
剪枝条件
- 低位全补 0,相乘结果 < n
- 低位全补 1,相乘结果 > n
1 |
|
coppersmith
上述剪枝只能求出高 262 位了,有多种组合,但仍缺少低 250 位,因此需要用到 coppersmith 来求解。
在具体应用情景中应当适当调整beta
和epsilon
。
1 |
|
一些关于p^q问题剪枝算法
https://sch01ar.github.io/2023/11/07/剪枝/