1个不稳定版本
0.1.0-beta.8 | 2024年2月3日 |
---|---|
0.1.0-beta.7 |
|
0.1.0-beta.5 |
|
0.1.0-beta.4 |
|
0.1.0-beta.3 |
|
#1275 in 密码学
540KB
12K SLoC
fhe
基于环-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(¶meters, &mut OsRng);
let public_key = PublicKey::new(&secret_key, &mut rng);
let plaintext_1 = Plaintext::try_encode(&[20_u64], Encoding::poly(), ¶meters)?;
let plaintext_2 = Plaintext::try_encode(&[-7_i64], Encoding::poly(), ¶meters)?;
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 的多个功能。例如,该库实现了 SealPIR 和 MulPIR,可以按以下方式运行
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