9 个版本
0.1.0 | 2023 年 4 月 20 日 |
---|---|
0.1.0-alpha | 2023 年 4 月 19 日 |
0.0.20-alpha-4 | 2022 年 9 月 2 日 |
0.0.20-alpha-3 | 2022 年 8 月 26 日 |
0.0.2 | 2021 年 7 月 31 日 |
#324 in 加密
每月 28 次下载
600KB
3.5K SLoC
帕尔马桑
在加密数据上的并行算术
帕尔马桑实现了对 TFHE 密文的多位数算术的选定并行算法。具体包括
- 加法/减法,
- 标量乘法(即乘以一个已知整数),
- 乘法,
- 平方,
- 符号函数,
- 两个数的最大值,
- 舍入,以及
- 简单神经网络的评估。
免责声明:帕尔马桑目前是一个实验性库,用作加密数据上可并行化算术的证明概念。因此,既不能保证其正确功能,也不能保证任何级别的代码质量。
简短的故事
在标准的整数表示中,由于进位可能从最低有效位(LSB)传播到最高有效位(MSB),因此并行加法是不可能的。然而,使用,例如,基-2 整数表示的字母表 {-1,0,1}
,存在一个并行加法算法。其他操作(如标量乘法和平方)也受益于快速的加法。
长篇大论
请参阅我们的 完整论文 和我们之前的 研究(也请参阅 eprint)。
使用 parmesan
将依赖项添加到你的 Rust 项目的 Cargo.toml
文件中。
[dependencies]
parmesan = { version = "^0.0.20-alpha", features = ["measure"] }
colored = "^2.0.0"
为了获得最佳性能,请使用以下命令编译
$ RUSTFLAGS="-C target-cpu=native" cargo build --release
示例
use std::error::Error;
use colored::Colorize;
use parmesan::params;
use parmesan::userovo::*;
use parmesan::ParmesanUserovo;
use parmesan::ParmesanCloudovo;
use parmesan::arithmetics::ParmArithmetics;
pub fn main() -> Result<(), Box<dyn Error>> {
// =================================
// Initialization
// ---------------------------------
// Global Scope
let par = ¶ms::PAR_TFHE_V0_2__M4_C0;
// ---------------------------------
// Userovo Scope
let pu = ParmesanUserovo::new(par)?;
let pub_k = pu.export_pub_keys();
// ---------------------------------
// Cloudovo Scope
let pc = ParmesanCloudovo::new(par, &pub_k);
// =================================
// U: Encryption
let a: Vec<i32> = vec![1,0,1,-1,-1,0,-1,1,1,-1,1,1,1,-1,-1,0,0,1,1,0,0,0,0,-1,0,0,0,0,0,-1,0,0,];
let b: Vec<i32> = vec![-1,0,0,-1,1,1,-1,1,-1,0,0,1,0,1,1,0,0,0,-1,0,0,1,0,0,-1,0,-1,-1,-1,1,1,0,];
let ca = pu.encrypt_vec(&a)?;
let cb = pu.encrypt_vec(&b)?;
// convert to actual numbers
let a_val = encryption::convert_from_vec(&a)?;
let b_val = encryption::convert_from_vec(&b)?;
// print plain inputs
println!("\nInputs:\n");
println!("a = {:12}", a_val);
println!("b = {:12}", b_val);
// =================================
// C: Evaluation
let c_add_a_b = ParmArithmetics::add(&pc, &ca, &cb);
// =================================
// U: Decryption
let add_a_b = pu.decrypt(&c_add_a_b)?;
let mut summary_text = format!("\nResults:\n");
summary_text = format!("{}\nAddition:", summary_text);
summary_text = format!("{}\na + b = {:12} :: {} (exp. {})", summary_text,
add_a_b,
if add_a_b == a_val + b_val {String::from("PASS").bold().green()} else {String::from("FAIL").bold().red()},
a_val + b_val
);
println!("{}", summary_text);
println!("\nDemo END\n");
Ok(())
}
基准测试
对于基准测试,我们实现了一个实验性工具 bench-parmesan,它还比较了 Parmesan 和 Concrete v0.2
。结果可以在 白皮书 中找到。
处理器负载
特别是,我们测量了处理器负载;在下图中,你可以找到我们在具有 AMD EPYC 7543 的机器上测量的 32 位最大值的结果。
可以在这里找到展示32位乘法期间处理器负载的额外图表。
版本日志
v0.1.0-alpha
:使用tfhe v0.2
重写,而不是使用concrete_core
。v0.0.20-alpha-4
:白皮书中的算法。
许可
Parmesan遵循AGPLv3许可。
致谢
本工作得到了MESRI-BMBF法国-德国联合项目UPCARE(ANR-20-CYAL-0003-01)的支持,该项目授予EURECOM。
计算资源由项目e-Infrastruktura CZ(e-INFRA CZ LM2018140)提供,该项目由捷克共和国教育部、青年和体育部支持。
依赖
~15–26MB
~374K SLoC