Método de raízes pequenas de Coppersmith (resolvendo equações polinomiais sobre módulo composto em limites pequenos)
Principalmente, lidando com a equação aplicável do método Coppersmith teoricamente estabelecida. Recomendamos usar univariada ou linear (em vez de heurística) se você conhece o tipo de equação.
Em primeiro lugar, escolha parâmetros adequados com base em limites e
método LLL/BKZ interno selecionável
método de equação inteira de resolução selecionável
$ git clone https://github.com/kionactf/coppersmith --sync
Se você usa fplll ou flatter, precisa compilar esses pacotes. se você já os instalou, poderá usar isso definindo esses caminhos de instalação como fplll_path ou flatter_path em lll.py.
Ou você pode criar uma imagem docker. É baseado na imagem sagemath/sagemath:latest e também baixa bibliotecas de treliça bem conhecidas. (Se você conhece outras bibliotecas boas, informe-nos para incluí-las.)
$ docker build -t coppersmith .
$ docker run --rm -it coppersmith /bin/bash
Chame coppersmith_onevariable.coppersmith_onevariable ou coppersmith_linear.coppersmith_linear com Sagemath PolynomialRing sobre Zmod(N), limites, beta.
Veja example.py
.
Além disso, você pode usar apenas LLL
chamando lll.do_lattice_reduction com matriz Sagemath sobre ZZ e alguns parâmetros de otimização. E lll.babai para solucionador de CVP.
Para integer equations solver
, use rootfind_ZZ.rootfind_ZZ com uma lista de polinômios Sagemath sobre ZZ e limites.
(O recurso foi introduzido em 8/03/2024.)
Embora tenhamos definido configurações padrão integradas com base em alguns experimentos, alguns usuários dizem que a configuração não se ajusta aos seus ambientes.
Portanto, preparamos um context
de interface de configuração para lll.py
e rootfind_ZZ.py
.
Você pode usá-lo importando context
assim como no exemplo a seguir:
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 )
Você pode verificar a lista de opções e seus valores padrão em register_options_lll
e register_options_rootfind_ZZ
em contextclass.py
.
Para calcular LLL, usamos pari.matker para eliminar vetores linearmente dependentes para definir a rede. O processo precisa ser mais plano. Embora pari.matker seja rápido e produza resultados corretos em muitos casos, às vezes produz resultados wrong
. (Você pode verificar isso executando lll.test().) Você pode desabilitar o uso de pari.matker definindo a opção use_pari_kernel=False
, onde força o uso do kernel Sagemath (que executa internamente a computação da forma normal hermite (HNF).) Observe que o HNF tende a produzir elementos grandes, por isso faz com que o processo LLL fique super lento.
Veja Por que não conseguimos resolver a cronofobia… Análise para o método Coppersmith mais. (pode ser um artigo antigo, no entanto.)
O método da raiz pequena de Coppersmith consiste em encontrar uma raiz do seguinte tipo de equação:
A função de pacote requer os seguintes parâmetros.
Para determinar
Por exemplo,
P: Você pode resolver muitos sistemas polinomiais multivariados de módulo pelo pacote?
R: Talvez não. Parece ser difícil criar um solucionador polinomial multivariado de módulo geral. Depende de monômios (como [ vs
[ vs
[ vs
[
Especialmente, não recomendamos o uso do método heurístico sem compreender o polinômio. O método heurístico não estima a condição vinculada (ao contrário do caso univariado ou do caso linear), portanto, você ficaria confuso se o solucionador não produzisse o resultado esperado.
Alternativamente, você pode usar a estratégia de linearização e/ou aplicar rootfind_ZZ diretamente. Por exemplo, se você quiser resolver
Observe que rootfind_ZZ não encontra necessariamente todas as raízes, mas apenas algumas raízes. Encontrar raízes sobre números inteiros não é fácil, então você não deve usar o pacote para sistema incluído com múltiplas raízes. Você pode desenvolver alguns métodos para evitar raízes múltiplas. Algum método pode estar estreitando o intervalo dos limites convertendo variáveis. Algumas funções internas rootfind_ZZ assumem que existe uma raiz próxima aos limites.
O pacote não deve ser perfeito, queremos que você o revise e melhore. Bem-vindo a postar quaisquer problemas, pull requests e forks. E conte-nos test cases
de qualquer CTF ou outros recursos. Casos de teste com falha podem nos levar a melhorar o pacote.
Alguns de nossos códigos são baseados nas seguintes bibliotecas.
método multivariado de caldeireiro: coppersmith.sage
método multivariado de latoeiro: lbc_toolkit/problems/small_roots.sage
. Alguns solucionadores para raízes polinomiais inteiras estão em lbc_toolkit/common/systems_solvers.sage
.
vários métodos de latoeiro (incluindo Herrmann-May, Blomer-May, Boneh-Durfee, Jochemsz-May, etc.): shared/small_roots/*.py
. Alguns solucionadores para raízes polinomiais inteiras estão em shared/small_roots/__init__.py
.
jvdsn/crypto-attacks é distribuído em:
Licença MIT (https://github.com/jvdsn/crypto-attacks/blob/master/LICENSE)
(c) 2020 Joachim Vandersmissen.
Esta biblioteca é distribuída sob licença Apache 2.0. Consulte LICENÇA.
(C) 2023 kiona
https://github.com/kionactf/coppersmith
Para redistribuição, basta dizer que foi alterado e anotar o link para nossos arquivos.