Coppersmith 小根法(求解小界上复合模量的多项式方程)
主要是处理理论上建立的Coppersmith方法适用方程。如果您知道方程的类型,我们建议使用单变量或线性(而不是启发式)。
首先根据边界选择合适的参数
可选择内部 LLL/BKZ 方法
可选择求解整数方程法
$ git clone https://github.com/kionactf/coppersmith --sync
如果您使用 fplll 或 flatter,则需要构建这些包。如果您已经安装了它们,则可以通过将这些安装路径设置为 lll.py 上的 fplll_path 或 flatter_path 来使用它。
或者您可以创建一个 docker 镜像。它基于 sagemath/sagemath: 最新镜像,还下载了知名的点阵库。 (如果您知道其他好的库,请告诉我们包括这些库。)
$ docker build -t coppersmith .
$ docker run --rm -it coppersmith /bin/bash
在 Zmod(N)、bounds、beta 上使用 Sagemath PolynomialRing 调用 Coppersmith_onevariable.coppersmith_onevariable 或 Coppersmith_linear.coppersmith_linear。
请参阅example.py
。
此外,您可以通过使用 ZZ 上的 Sagemath 矩阵和一些优化参数调用 lll.do_lattice_reduction 来仅使用LLL
。以及用于 CVP 求解器的 lll.babai。
对于integer equations solver
,请使用 rootfind_ZZ.rootfind_ZZ 以及 ZZ 和边界上的 Sagemath 多项式列表。
(该功能于2024年3月8日推出。)
尽管我们根据一些实验设置了内置默认设置,但一些用户表示该设置不适合他们的环境。
因此,我们为lll.py
和rootfind_ZZ.py
准备一个配置接口context
。
您可以通过导入context
来使用它,如下例所示:
from coppersmith_linear import * # including context
from lll import FLATTER
from rootfind_ZZ import JACOBIAN , TRIANGULATE
# use flatter
context . lllopt = { 'algorithm' : FLATTER , 'use_pari_kernel' : True }
# use jacobian method and triangulate in order,
# and for jacobian method set the number of iteration(loop) as 32 (much less comparing the default value 1024)
context . rootfindZZopt = { 'algorithm' :( JACOBIAN , TRIANGULATE ), 'maxiternum' : 32 }
# debug output enable
logger . setLevel ( DEBUG )
P = PolynomialRing (...)
f = ...
beta = ...
bounds = [...]
coppersmith_linear ( f , bounds , beta )
您可以在contextclass.py
的register_options_lll
和register_options_rootfind_ZZ
中检查选项列表及其默认值。
为了计算 LLL,我们使用 pari.matker 来消除定义晶格的线性相关向量。该过程需要使用扁平化。尽管 pari.matker 速度很快并且在许多情况下输出正确的结果,但有时会输出wrong
结果。 (您可以通过运行 lll.test() 来检查这一点。)您可以通过设置选项use_pari_kernel=False
来禁用 pari.matker ,它强制使用 Sagemath 内核(在内部运行计算 Hermite 范式 (HNF)。)请注意,HNF 往往会产生较大的元素,因此它会导致 LLL 过程变得非常慢。
请参阅为什么我们无法解决时间恐惧症……更多关于 Coppersmith 方法的分析。 (不过,这可能是一篇旧文章。)
Coppersmith小根法是求下列类型方程的根:
封装函数需要以下参数。
用于确定
例如,
问:你能用包求解多个模多元多项式系统吗?
答:也许不会。创建通用模多元多项式求解器似乎很困难。它取决于单项式(例如 [ vs
[ vs
[ vs
[
特别是,我们不建议在不了解多项式的情况下使用启发式方法。启发式方法不会估计边界条件(与单变量情况或线性情况不同),因此您可能会感到困惑,因为求解器没有按照您的预期输出。
或者,您可以使用线性化策略和/或直接应用 rootfind_ZZ。例如,如果你想解决
请注意,rootfind_ZZ 不一定找到所有根,而只能找到少数根。在整数上查找根并不容易,因此您不应该将该包用于包含多个根的系统。您可以设计一些方法来避免多重根。某些方法可能通过转换变量来缩小边界范围。一些 rootfind_ZZ 内部函数假设根存在于边界附近。
该软件包一定不是完美的,我们希望您对此进行审查和改进。欢迎发布任何问题、拉取请求和分叉。并让我们了解来自任何 CTF 或其他资源的test cases
。失败的测试用例可能会让我们改进包。
我们的一些代码基于以下库。
多元铜匠方法: coppersmith.sage
多元铜匠方法: lbc_toolkit/problems/small_roots.sage
。整数多项式根的一些求解器位于lbc_toolkit/common/systems_solvers.sage
。
各种铜匠方法(包括 Herrmann-May、Blomer-May、Boneh-Durfee、Jochemsz-May 等): shared/small_roots/*.py
。整数多项式根的一些求解器位于shared/small_roots/__init__.py
。
jvdsn/crypto-attacks 分布在:
麻省理工学院许可证 (https://github.com/jvdsn/crypto-attacks/blob/master/LICENSE)
(c) 2020 约阿希姆·范德斯米森。
该库根据 Apache 2.0 许可证分发。请参阅许可证。
(C) 2023 基奥纳
https://github.com/kionactf/coppersmith
对于重新分发,只需说它已更改并记下我们文件的链接即可。