#零知识证明 #加密 #同态 #帕里尔 #零知识 #加密解密

kzen-paillier

适用于Paillier部分同态加密方案的纯Rust库

4次发布

0.4.3 2022年12月26日
0.4.2 2021年10月19日
0.4.1 2021年10月5日
0.4.0 2021年6月15日

#1247 in 密码学

Download history 942/week @ 2024-04-22 703/week @ 2024-04-29 643/week @ 2024-05-06 804/week @ 2024-05-13 1336/week @ 2024-05-20 1215/week @ 2024-05-27 1161/week @ 2024-06-03 1336/week @ 2024-06-10 680/week @ 2024-06-17 1002/week @ 2024-06-24 1060/week @ 2024-07-01 1572/week @ 2024-07-08 1066/week @ 2024-07-15 1315/week @ 2024-07-22 844/week @ 2024-07-29 1411/week @ 2024-08-05

4,657 monthly downloads
用于 6 个crate(4 个直接)

MIT/Apache

71KB
1.5K SLoC

Paillier

Build Status Latest version Docs License: MIT/Apache2

适用于Paillier部分同态加密方案的纯Rust库,同时提供打包编码功能,以便一起加密多个值,以及与典型用例相关的多个零知识证明。支持多个底层任意精度库: GMPnum-bigint

一些公司已经投资资源开发了这个库,包括Snips,该公司实现了用于其隐私保护分析系统的原始版本,以及KZen networks,该公司贡献了许多零知识证明的实现。有关更多详细信息,请参阅下面的贡献

重要:虽然我们已经遵循了有关方案本身的建议,但这个库的某些部分尚未针对非加密攻击(如旁路攻击)进行强化。

extern crate paillier;
use paillier::*;

fn main() {

  // generate a fresh keypair and extract encryption and decryption keys
  let (ek, dk) = Paillier::keypair().keys();

  // encrypt four values
  let c1 = Paillier::encrypt(&ek, 10);
  let c2 = Paillier::encrypt(&ek, 20);
  let c3 = Paillier::encrypt(&ek, 30);
  let c4 = Paillier::encrypt(&ek, 40);

  // add all of them together
  let c = Paillier::add(&ek,
    &Paillier::add(&ek, &c1, &c2),
    &Paillier::add(&ek, &c3, &c4)
  );

  // multiply the sum by 2
  let d = Paillier::mul(&ek, &c, 2);

  // decrypt final result
  let m: u64 = Paillier::decrypt(&dk, &d);
  println!("decrypted total sum is {}", m);

}

安装

[dependencies.paillier]
package = "kzen-paillier"
version = "0.2"

底层算术

可以使用功能 curv/rust-gmp-kzen(默认)和 curv/num-bigint 来更改底层算术库的选择。GMP通常提供更好的性能,但需要在系统上安装GMP共享库。《nim-bigint》是纯Rust实现的大整数,不需要任何外部依赖。

选择算术实现之一只会影响性能。所有功能保持不变。

为了在 num-bigint 上构建,请将以下内容放入Cargo.toml

[dependencies.paillier]
package = "kzen-paillier"
version = "0.2"
default-features = false
features = ["curv/num-bigint"]

使用

密钥生成

默认包含密钥生成功能 keygen,但如果不需要,可以安全地排除以避免额外的依赖关系。

extern crate paillier;
use paillier::*;

fn main() {

  // generate a fresh keypair and extract encryption and decryption keys
  let (ek, dk) = Paillier::keypair().keys();

  ...

}

基准测试

包含几个基准测试,测试底层算术库以及方案的运算。所有测试都可以使用以下方式运行

cargo bench

包括几个算术库和密钥生成,如上所述。

许可证

基于 snipsco/rust-paillier 开发,增加了额外功能。许可协议为以下之一:

任选其一。

除非你明确说明,否则根据 Apache-2.0 许可证定义,任何有意提交以包含在你工作的贡献,应如上所述双重许可,不附加任何额外条款或条件。

贡献

有几个人对库的开发产生了重大影响(按字母顺序排列)

还有几家公司在资源投入方面

  • Snips 赞助了原始版本的实现
  • KZen networks 赞助了许多零知识证明的扩展

报告用途

依赖

~16MB
~250K SLoC