Metode akar kecil Coppersmith (menyelesaikan persamaan polinomial pada modulus komposit pada batas kecil)
Terutama, berurusan dengan persamaan yang dapat diterapkan metode Coppersmith yang ditetapkan secara teoritis. Kami merekomendasikan penggunaan univariat atau linier (bukan heuristik) jika Anda mengetahui jenis persamaannya.
Pertama pilih parameter yang sesuai berdasarkan batas dan
metode LLL/BKZ internal yang dapat dipilih
metode penyelesaian persamaan bilangan bulat yang dapat dipilih
$ git clone https://github.com/kionactf/coppersmith --sync
Jika Anda menggunakan fplll atau flat, perlu membuat paket-paket ini. jika Anda sudah menginstalnya, Anda dapat menggunakannya dengan mengatur jalur instalasi ini ke fplll_path atau flat_path di lll.py.
Atau Anda dapat membuat gambar buruh pelabuhan. Ini didasarkan pada sagemath/sagemath: gambar terbaru dan juga mengunduh perpustakaan kisi terkenal. (Jika Anda mengetahui perpustakaan lain yang bagus, beri tahu kami untuk menyertakan perpustakaan ini.)
$ docker build -t coppersmith .
$ docker run --rm -it coppersmith /bin/bash
Panggil coppersmith_onevariable.coppersmith_onevariable atau coppersmith_linear.coppersmith_linear dengan Sagemath PolynomialRing melalui Zmod(N), batas, beta.
Lihat example.py
.
Selain itu, Anda hanya dapat menggunakan LLL
dengan memanggil lll.do_lattice_reduction dengan matriks Sagemath melalui ZZ dan beberapa parameter pengoptimalan. Dan lll.babai untuk pemecah CVP.
Untuk integer equations solver
, gunakan rootfind_ZZ.rootfind_ZZ dengan daftar polinomial Sagemath di atas ZZ dan batas.
(Fitur ini diperkenalkan pada 8/3/2024.)
Meskipun kami menyiapkan pengaturan default bawaan berdasarkan beberapa eksperimen kami, beberapa pengguna mengatakan pengaturan tersebut tidak sesuai dengan lingkungan mereka.
Jadi kami menyiapkan context
antarmuka konfigurasi untuk lll.py
dan rootfind_ZZ.py
.
Anda dapat menggunakannya dengan mengimpor context
seperti contoh berikut:
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 )
Anda dapat memeriksa daftar opsi dan nilai defaultnya di register_options_lll
dan register_options_rootfind_ZZ
di contextclass.py
.
Untuk menghitung LLL, kami menggunakan pari.matker untuk menghilangkan vektor bergantung linier untuk mendefinisikan kisi. Prosesnya perlu menggunakan lebih datar. Meskipun pari.matker cepat dan memberikan hasil yang benar dalam banyak kasus, terkadang ia memberikan hasil wrong
. (Anda dapat memeriksanya dengan menjalankan lll.test().) Anda dapat menonaktifkan penggunaan pari.matker dengan menyetel opsi use_pari_kernel=False
, yang memaksa penggunaan kernel Sagemath (yang menjalankan komputasi hermite normal form (HNF) secara internal.) Perhatikan bahwa HNF cenderung menghasilkan elemen yang besar, sehingga menyebabkan proses LLL menjadi super lambat.
Lihat Mengapa kami tidak dapat mengatasi chronophobia… Analisis untuk metode Coppersmith selengkapnya. (meskipun ini mungkin artikel lama.)
Metode akar kecil Coppersmith adalah mencari akar dari persamaan tipe berikut:
Fungsi paket memerlukan parameter berikut.
Untuk menentukan
Misalnya,
T: Bisakah Anda menyelesaikan banyak sistem polinomial multivariat modulus berdasarkan paketnya?
J: Mungkin tidak. Tampaknya sulit untuk membuat pemecah polinomial multivariat modulus umum. Itu tergantung pada monomial (seperti [ vs
[ vs
[ vs
[
Secara khusus, kami tidak menyarankan penggunaan metode heuristik tanpa memahami polinomial. Metode heuristik tidak memperkirakan kondisi terikat (tidak seperti kasus univariat atau kasus linier), sehingga Anda akan bingung karena pemecahnya tidak menghasilkan keluaran seperti yang Anda harapkan.
Alternatifnya, Anda dapat menggunakan strategi linearisasi dan/atau menerapkan rootfind_ZZ secara langsung. Misalnya saja jika Anda ingin menyelesaikannya
Perhatikan bahwa rootfind_ZZ tidak serta merta menemukan semua akar, tetapi hanya beberapa akar. Menemukan akar dari bilangan bulat tidaklah mudah, jadi Anda sebaiknya tidak menggunakan paket untuk sistem yang menyertakan banyak akar. Anda dapat merancang beberapa metode untuk menghindari banyak akar. Beberapa metode mungkin mempersempit rentang batas dengan mengonversi variabel. Beberapa fungsi internal rootfind_ZZ mengasumsikan bahwa akar ada di dekat batas.
Paketnya tidak boleh sempurna, kami ingin Anda meninjau dan memperbaikinya. Selamat datang untuk memposting masalah apa pun, permintaan tarik, dan garpu. Dan beri tahu kami test cases
dari KKP atau sumber lainnya. Kasus uji yang gagal mungkin membuat kami memperbaiki paketnya.
Beberapa kode kami didasarkan pada perpustakaan berikut.
metode tukang tembaga multivariat: coppersmith.sage
metode tukang tembaga multivariat: lbc_toolkit/problems/small_roots.sage
. Beberapa pemecah akar polinomial bilangan bulat ada di lbc_toolkit/common/systems_solvers.sage
.
berbagai metode tukang tembaga (termasuk Herrmann-May, Blomer-May, Boneh-Durfee, Jochemsz-May, dll.): shared/small_roots/*.py
. Beberapa pemecah akar polinomial bilangan bulat ada di shared/small_roots/__init__.py
.
jvdsn/crypto-serangan didistribusikan di bawah:
Lisensi MIT (https://github.com/jvdsn/crypto-actions/blob/master/LICENSE)
(c) Joachim Vandersmissen 2020.
Perpustakaan ini didistribusikan di bawah Lisensi Apache 2.0. Lihat LISENSI.
(C) 2023 kiona
https://github.com/kionactf/coppersmith
Untuk redistribusi cukup bilang saja sudah diubah dan catat link file kita.