Coppersmith 小根法(求解小界上複合模量的多項式方程式)
主要是處理理論上建立的Coppersmith方法適用方程式。如果您知道方程式的類型,我們建議使用單變數或線性(而不是啟發式)。
首先根據邊界選擇合適的參數
可選擇內部 LLL/BKZ 方法
可選擇求解整數方程式法
$ git clone https://github.com/kionactf/coppersmith --sync
如果您使用 fplll 或 flatter,則需要建立這些套件。如果您已經安裝了它們,則可以透過將這些安裝路徑設定為 lll.py 上的 fplll_path 或 flatter_path 來使用它。
或者您可以建立一個 docker 映像。它基於 sagemath/sagemath:latest image,也下載了知名的點陣庫。 (如果您知道其他好的庫,請告訴我們是否包含這些庫。)
$ 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小根法是求下列類型方程式的根:
封裝函數需要以下參數。
用於確定
例如,
Q:你能用包包求解多個模多元多項式系統嗎?
答:也許不會。創建通用模多元多項式求解器似乎很困難。它取決於單項式(例如 [ 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
對於重新分發,只需說它已更改並記下我們文件的連結即可。