1个不稳定版本

0.1.0-beta.82024年2月3日
0.1.0-beta.7 2023年10月12日
0.1.0-beta.5 2023年9月5日
0.1.0-beta.4 2022年10月13日
0.1.0-beta.3 2022年9月11日

#1275 in 密码学

自定义许可证

540KB
12K SLoC

fhe fhe crate version

基于环-LWE的完全同态加密方案的纯Rust实现。

该库实现了完全同态加密方案,即加密方案在明文值上执行隐式加法和乘法,同时仅操作加密数据。

该库提供了以下实现:

  • BFV,Brakerski-Fan-Vercauteren(BFV)同态加密方案。更确切地说,该库实现了方案HPS(Halevi--Polyakov--Shoup)RNS变体的级联版本。

示例

以下是一个使用BFV的同态乘法的简单示例。使用密钥使用密文加密值 20,使用公钥使用密文加密值 -7。然后将密文相乘,并在解密后,程序检查解密值在第一个系数中是否等于 20 * (-7) = -140

use fhe::bfv::{BfvParametersBuilder, Ciphertext, Encoding, Plaintext, PublicKey, SecretKey};
use fhe_traits::*;
use rand::{rngs::OsRng, thread_rng};
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    let parameters = BfvParametersBuilder::new()
            .set_degree(2048)
            .set_moduli(&[0x3fffffff000001])
            .set_plaintext_modulus(1 << 10)
            .build_arc()?;
    let mut rng = thread_rng();

    let secret_key = SecretKey::random(&parameters, &mut OsRng);
    let public_key = PublicKey::new(&secret_key, &mut rng);

    let plaintext_1 = Plaintext::try_encode(&[20_u64], Encoding::poly(), &parameters)?;
    let plaintext_2 = Plaintext::try_encode(&[-7_i64], Encoding::poly(), &parameters)?;

    let ciphertext_1: Ciphertext = secret_key.try_encrypt(&plaintext_1, &mut rng)?;
    let ciphertext_2: Ciphertext = public_key.try_encrypt(&plaintext_2, &mut rng)?;

    let result = &ciphertext_1 * &ciphertext_2;

    let decrypted_plaintext = secret_key.try_decrypt(&result)?;
    let decrypted_vector = Vec::<i64>::try_decode(&decrypted_plaintext, Encoding::poly())?;

    assert_eq!(decrypted_vector[0], -140);

    Ok(())
}

请注意,操作实际上是在模 plaintext_modulus 下进行的,这里设置为 1024 (= 1 << 10);例如,我们可能会得到 805-7 的同态乘积是 509 = (805 * (-7)) mod 1024。此外,poly() 编码意味着被编码的向量对应于多项式的系数,在 (ZZ / (1024))[x] / (2048+1)(同态乘法在该环中发生);在这里,由于只提供了一个系数,该值被放置在常数系数中。该库还包含一个 simd() 编码,它允许对向量值进行分量的操作,前提是技术限制是明文模数与多项式次数的两倍同余于 1

示例

在仓库 examples/ 中提供了更多示例,这些示例练习了 API 的多个功能。例如,该库实现了 SealPIRMulPIR,可以按以下方式运行

cargo run --release --example sealpir

cargo run --release --example mulpir

性能

可以通过运行 cargo bench 获得微基准测试结果。此 crate 使用 criterion.rs 进行基准测试。

单元测试

使用 cargo test 运行测试。

⚠️ 安全性 / 稳定性

该 crate 中的实现从未经过独立的安全审计。此外,直到版本 1.0.0 的 crate,都不会对 API 和 ABI 稳定性作出承诺。

自行承担风险。

依赖项

~5–8MB
~144K SLoC