Метод малых корней Копперсмита (решение полиномиального уравнения по составному модулю на малых границах)
В основном речь идет о теоретически установленном применимом уравнении метода Копперсмита. Мы рекомендуем использовать одномерное или линейное уравнение (вместо эвристического), если вы знаете тип уравнения.
Сначала выберите подходящие параметры на основе границ и
выбираемый внутренний метод LLL/BKZ
выбираемый метод решения целочисленного уравнения
$ git clone https://github.com/kionactf/coppersmith --sync
Если вы используете fplll или Flatter, вам необходимо собрать эти пакеты. если вы их уже установили, вы можете использовать это, установив для этих путей установки значение fplll_path или Flatter_path в lll.py.
Или вы можете создать образ докера. Он основан на образе sagemath/sagemath:latest, а также загружает известные библиотеки решеток. (Если вы знаете другие хорошие библиотеки, сообщите нам, чтобы мы включили их.)
$ docker build -t coppersmith .
$ docker run --rm -it coppersmith /bin/bash
Вызовите Coppersmith_onevariable.coppersmith_onevariable или Coppersmith_linear.coppersmith_linear с помощью Sagemath PolynomialRing по Zmod(N), границам, бета.
См. example.py
.
Кроме того, вы можете использовать только LLL
, вызвав lll.do_lattice_reduction с матрицей Sagemath поверх ZZ и некоторыми параметрами оптимизации. И lll.babai для решателя CVP.
Для integer equations solver
используйте rootfind_ZZ.rootfind_ZZ со списком полиномов Sagemath по ZZ и границам.
(Эта функция была представлена 8 марта 2024 г.)
Хотя мы установили встроенные настройки по умолчанию на основе некоторых наших экспериментов, некоторые пользователи говорят, что эти настройки не подходят для их сред.
Итак, мы подготавливаем context
интерфейса конфигурации для lll.py
и rootfind_ZZ.py
.
Вы можете использовать его, импортировав 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 )
Вы можете проверить список параметров и их значения по умолчанию в register_options_lll
и register_options_rootfind_ZZ
в contextclass.py
.
Для вычисления LLL мы используем pari.matker для исключения линейно зависимых векторов для определения решетки. Процесс необходимо использовать более плоский. Хотя pari.matker работает быстро и во многих случаях выдает правильные результаты, иногда он выдает wrong
результаты. (Вы можете проверить это, запустив lll.test().) Вы можете отключить использование pari.matker, установив параметр use_pari_kernel=False
, где он принудительно использует ядро Sagemath (которое внутренне выполняет вычисления нормальной формы отшельника (HNF).) Обратите внимание, что HNF имеет тенденцию создавать большие элементы, поэтому процесс LLL становится очень медленным.
См. «Почему мы не смогли решить проблему хронофобии… Анализ по методу Копперсмита» подробнее. (хотя это может быть старая статья.)
Метод малых корней Копперсмита заключается в нахождении корня уравнения следующего типа:
Функция пакета требует следующих параметров.
Для определения
Например,
Вопрос: Можете ли вы решить множество многомерных полиномиальных систем по модулю с помощью пакета?
А: Может быть, нет. Кажется, сложно создать многомерный полиномиальный решатель общего модуля. Это зависит от мономов (таких как [ vs
[ vs
[ vs
[
В частности, мы не рекомендуем использовать эвристический метод без понимания многочлена. Эвристический метод не оценивает связанное условие (в отличие от одномерного или линейного случая), поэтому вас может смутить то, что решатель не выдал ожидаемого результата.
Альтернативно вы можете использовать стратегию линеаризации и/или напрямую применить rootfind_ZZ. Например, если вы хотите решить
Обратите внимание, что rootfind_ZZ не обязательно находит все корни, а только несколько. Найти корни по целым числам непросто, поэтому не следует использовать пакет для системы с несколькими корнями. Вы можете разработать некоторые методы, позволяющие избежать множественных корней. Некоторые методы могут сужать диапазон границ путем преобразования переменных. Некоторые внутренние функции rootfind_ZZ предполагают, что корень существует вблизи границ.
Пакет не должен быть идеальным, мы хотим, чтобы вы его рассмотрели и улучшили. Добро пожаловать, чтобы публиковать любые проблемы, запросы на включение и форки. И дайте нам знать test cases
из любого CTF или других ресурсов. Неудачные тестовые случаи могут заставить нас улучшить пакет.
Некоторые из наших кодов основаны на следующих библиотеках.
многовариантный метод медника: 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 распространяется под:
Лицензия MIT (https://github.com/jvdsn/crypto-attacks/blob/master/LICENSE)
(с) 2020 Иоахим Вандерсмиссен.
Эта библиотека распространяется по лицензии Apache 2.0. См. ЛИЦЕНЗИЯ.
(С) 2023 киона
https://github.com/kionactf/coppersmith
Для перераздачи просто скажите, что он был изменен и обратите внимание на ссылку на наши файлы.