Méthode des petites racines de Coppersmith (résolution d'équations polynomiales sur le module composite sur de petites limites)
Principalement, il s'agit de l'équation applicable de la méthode Coppersmith théoriquement établie. Nous vous recommandons d'utiliser une équation univariée ou linéaire (au lieu d'une heuristique) si vous connaissez le type d'équation.
Choisissez d’abord les paramètres appropriés en fonction des limites et
méthode LLL/BKZ interne sélectionnable
méthode de résolution d'équations entières sélectionnable
$ git clone https://github.com/kionactf/coppersmith --sync
Si vous utilisez fplll ou plus plat, vous devez créer ces packages. si vous les avez déjà installés, vous pouvez l'utiliser en définissant ces chemins d'installation sur fplll_path ou flatter_path sur lll.py.
Ou vous pouvez créer une image Docker. Il est basé sur sagemath/sagemath:latest image et télécharge également des bibliothèques de treillis bien connues. (Si vous connaissez d'autres bibliothèques, faites-le-nous savoir pour les inclure.)
$ docker build -t coppersmith .
$ docker run --rm -it coppersmith /bin/bash
Appelez coppersmith_onevariable.coppersmith_onevariable ou coppersmith_linear.coppersmith_linear avec Sagemath PolynomialRing sur Zmod(N), limites, bêta.
Voir example.py
.
De plus, vous pouvez utiliser uniquement LLL
en appelant lll.do_lattice_reduction avec la matrice Sagemath sur ZZ et certains paramètres d'optimisation. Et lll.babai pour le solveur CVP.
Pour integer equations solver
, utilisez rootfind_ZZ.rootfind_ZZ avec une liste de polynômes Sagemath sur ZZ et ses limites.
(La fonctionnalité a été introduite le 2024/3/8.)
Bien que nous ayons configuré des paramètres par défaut intégrés sur la base de nos expériences, certains utilisateurs affirment que ces paramètres ne conviennent pas à leur environnement.
Nous préparons donc un context
d'interface de configuration pour lll.py
et rootfind_ZZ.py
.
Vous pouvez l'utiliser en important context
comme dans l'exemple suivant :
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 )
Vous pouvez consulter la liste des options et leurs valeurs par défaut sur register_options_lll
et register_options_rootfind_ZZ
sur contextclass.py
.
Pour le calcul de LLL, nous utilisons pari.matker pour éliminer les vecteurs linéairement dépendants afin de définir le réseau. Le processus doit utiliser plus plat. Bien que pari.matker soit rapide et génère des résultats corrects dans de nombreux cas, il génère parfois des résultats wrong
. (Vous pouvez vérifier cela en exécutant lll.test().) Vous pouvez désactiver l'utilisation de pari.matker en définissant l'option use_pari_kernel=False
, où elle force l'utilisation du noyau Sagemath (qui exécute en interne la forme normale Hermite informatique (HNF).) Notez que HNF a tendance à produire de gros éléments, ce qui rend le processus LLL très lent.
Voir Pourquoi nous n'avons pas pu résoudre la chronophobie… Analyse pour la méthode Coppersmith plus. (cela pourrait être un vieil article, cependant.)
La méthode des petites racines de Coppersmith consiste à trouver une racine de l'équation de type suivante :
La fonction package nécessite les paramètres suivants.
Pour déterminer
Par exemple,
Q : Pouvez-vous résoudre de nombreux systèmes polynomiaux multivariés de module à l’aide du package ?
R : Peut-être que non. Il semble difficile de créer un solveur polynomial multivarié de module général. Cela dépend des monômes (tels que [ vs
[ vs
[ vs
[
En particulier, nous déconseillons d’utiliser la méthode heuristique sans comprendre le polynôme. La méthode heuristique n'estime pas la condition liée (contrairement au cas univarié ou au cas linéaire), vous seriez donc confus si le solveur n'a pas produit le résultat attendu.
Alternativement, vous pouvez utiliser une stratégie de linéarisation et/ou appliquer directement rootfind_ZZ. Par exemple, si vous souhaitez résoudre
Notez que rootfind_ZZ ne trouve pas nécessairement toutes les racines, mais seulement quelques racines. Trouver des racines sur un nombre entier n'est pas facile, vous ne devez donc pas utiliser le package pour le système inclus avec plusieurs racines. Vous pouvez concevoir des méthodes pour éviter plusieurs racines. Une méthode peut consister à réduire la plage des limites en convertissant des variables. Certaines fonctions internes de rootfind_ZZ supposent qu'une racine existe à proximité des limites.
Le package ne doit pas être parfait, nous souhaitons que vous le revoyiez et l’amélioriez. Bienvenue pour publier tous les problèmes, demandes d'extraction et forks. Et faites-nous part test cases
de n'importe quel CTF ou d'autres ressources. Les cas de test échoués peuvent nous amener à améliorer le package.
Certains de nos codes sont basés sur les bibliothèques suivantes.
méthode de chaudronnerie multivariée : coppersmith.sage
méthode Coppersmith multivariée : lbc_toolkit/problems/small_roots.sage
. Certains solveurs pour les racines polynomiales entières se trouvent sur lbc_toolkit/common/systems_solvers.sage
.
diverses méthodes de chaudronnerie (dont Herrmann-May, Blomer-May, Boneh-Durfee, Jochemsz-May, etc.) : shared/small_roots/*.py
. Certains solveurs pour les racines polynomiales entières se trouvent sur shared/small_roots/__init__.py
.
jvdsn/crypto-attacks est distribué sous :
Licence MIT (https://github.com/jvdsn/crypto-attacks/blob/master/LICENSE)
(c) Joachim Vandersmissen 2020.
Cette bibliothèque est distribuée sous licence Apache 2.0. Voir LICENCE.
(C) Kiona 2023
https://github.com/kionactf/coppersmith
Pour la redistribution, dites simplement qu'il a été modifié et notez le lien vers nos fichiers.