43 lines
1.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use rug::Integer;
use crate::matrix::Matrix;
use lll_rs::lll::biglll;
mod lll;
mod matrix;
fn main() {
// 1. Build lattice matrix basis
let ciphertexts = vec![
Integer::from(37459),
Integer::from(8227),
Integer::from(44119),
Integer::from(22575),
Integer::from(9249),
Integer::from(38483),
Integer::from(26181),
];
let noise_bits = 2;
let basis_matrix = Matrix::new_lattice(noise_bits, ciphertexts.clone()).unwrap();
println!("matrix: {:?}", basis_matrix);
// 2. reduce with LLL
let mut lll_matrix = basis_matrix.to_lll_matrix();
biglll::lattice_reduce(&mut lll_matrix);
// 3. Extract shortest vector
let shortest_vector = &lll_matrix[0];
println!("Shortest vector: {:?}", shortest_vector);
// 4. q0 candidate
let q0 = &shortest_vector[0] / (Integer::from(1) << (noise_bits + 1));
// 5. Find p
// compute r0 = x0 (mod q0)
// and p = (x0 r0)/q0.
let x0 = &ciphertexts[0];
let r0 = x0 % q0.clone();
let p_guess = (x0 - r0) / q0;
println!("Recovered p: {}", p_guess);
}