วิธีรากเล็กของคอปเปอร์สมิธ (การแก้สมการพหุนามเหนือโมดูลัสประกอบบนขอบเขตเล็ก)
ส่วนใหญ่จะเกี่ยวข้องกับสมการที่ใช้วิธี Coppersmith ที่กำหนดขึ้นตามทฤษฎี เราขอแนะนำให้ใช้ตัวแปรเดียวหรือเชิงเส้น (แทนการศึกษาสำนึก) หากคุณทราบประเภทของสมการ
ขั้นแรก เลือกพารามิเตอร์ที่เหมาะสมตามขอบเขตและ
วิธี LLL/BKZ ภายในที่เลือกได้
วิธีการแก้สมการจำนวนเต็มแบบเลือกได้
$ git clone https://github.com/kionactf/coppersmith --sync
หากคุณใช้ fplll หรือประจบประแจง จำเป็นต้องสร้างแพ็คเกจเหล่านี้ หากคุณติดตั้งไว้แล้ว คุณสามารถใช้สิ่งนี้ได้โดยตั้งค่าพาธการติดตั้งเหล่านี้เป็น fplll_path หรือ flatter_path บน lll.py
หรือคุณสามารถสร้างอิมเมจนักเทียบท่าได้ มันขึ้นอยู่กับ sagemath/sagemath: รูปภาพล่าสุด และยังดาวน์โหลดไลบรารี lattice ที่รู้จักกันดีอีกด้วย (หากคุณรู้จักห้องสมุดอื่นๆ ที่ดี โปรดแจ้งให้เราทราบเพื่อรวมสิ่งเหล่านี้ไว้ด้วย)
$ 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/3/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 (ซึ่งรันการคำนวณในรูปแบบปกติของ Hermite (HNF) ภายใน) โปรดทราบว่า HNF มีแนวโน้มที่จะสร้างองค์ประกอบขนาดใหญ่ ดังนั้นจึงทำให้กระบวนการ LLL ช้ามาก
ดูว่าทำไมเราไม่สามารถแก้ปัญหาโครโนโฟเบียได้… การวิเคราะห์วิธี Coppersmith เพิ่มเติม (อาจเป็นบทความเก่าก็ได้)
วิธีรูตเล็กของ Coppersmith คือการค้นหารากของสมการประเภทต่อไปนี้:
ฟังก์ชันแพ็คเกจต้องการพารามิเตอร์ต่อไปนี้
สำหรับการกำหนด
ตัวอย่างเช่น,
ถาม: คุณสามารถแก้ระบบพหุนามหลายตัวแปรโมดูลัสหลายตัวแปรด้วยแพ็คเกจได้หรือไม่
ตอบ: อาจจะไม่ ดูเหมือนว่าจะเป็นเรื่องยากที่จะสร้างตัวแก้ปัญหาพหุนามโมดูลัสหลายตัวแปรทั่วไป ขึ้นอยู่กับ monomial (เช่น [ vs
[ vs
[ vs
[
โดยเฉพาะอย่างยิ่ง เราไม่แนะนำให้ใช้วิธีศึกษาสำนึกโดยไม่เข้าใจพหุนาม วิธีการศึกษาสำนึกไม่ได้ประมาณเงื่อนไขที่ถูกผูกไว้ (ต่างจากกรณีที่ไม่แปรผันหรือกรณีเชิงเส้น) ดังนั้นคุณจะสับสนว่าโปรแกรมแก้ปัญหาไม่ได้ส่งออกตามที่คุณต้องการ
หรือคุณสามารถใช้กลยุทธ์การทำให้เป็นเส้นตรงและ/หรือใช้ rootfind_ZZ โดยตรง เช่น หากคุณต้องการแก้
โปรดทราบว่า rootfind_ZZ ไม่จำเป็นต้องค้นหารากทั้งหมด แต่พบเพียงไม่กี่รากเท่านั้น การค้นหารูทเหนือจำนวนเต็มไม่ใช่เรื่องง่าย ดังนั้นคุณไม่ควรใช้แพ็คเกจสำหรับระบบที่มีหลายรูท คุณสามารถคิดค้นวิธีการบางอย่างในการหลีกเลี่ยงหลาย ๆ รากได้ วิธีการบางอย่างอาจจำกัดขอบเขตขอบเขตให้แคบลงโดยการแปลงตัวแปร ฟังก์ชันภายใน rootfind_ZZ บางอย่างถือว่ารากนั้นอยู่ใกล้ขอบเขต
แพ็คเกจต้องไม่สมบูรณ์แบบ เราต้องการให้คุณตรวจสอบและปรับปรุงสิ่งนี้ ยินดีต้อนรับสู่การโพสต์ปัญหาใด ๆ ดึงคำขอและส้อม และแจ้งให้เราทราบ test cases
จาก CTF หรือแหล่งข้อมูลอื่น ๆ กรณีทดสอบที่ล้มเหลวอาจทำให้เราต้องปรับปรุงแพ็คเกจ
รหัสบางส่วนของเราอิงจากไลบรารีต่อไปนี้
วิธี coppersmith หลายตัวแปร: coppersmith.sage
วิธี coppersmith หลายตัวแปร: lbc_toolkit/problems/small_roots.sage
ตัวแก้ปัญหาบางตัวสำหรับรากพหุนามจำนวนเต็มอยู่ที่ lbc_toolkit/common/systems_solvers.sage
วิธี coppersmith ต่างๆ (รวมถึง 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)
(c) 2020 โยอาคิม แวนเดอร์สมิสเซ่น
ไลบรารีนี้เผยแพร่ภายใต้ Apache 2.0 License ดูใบอนุญาต
(C) 2023 กีโอนา
https://github.com/kionactf/coppersmith
สำหรับการแจกจ่ายซ้ำ เพียงแจ้งว่ามีการเปลี่ยนแปลงและจดลิงก์สำหรับไฟล์ของเราไว้