#secret-sharing #fss #crypto #set-bit #dcf #dpf

fss-rs

包括分布式比较与点函数的函数秘密共享

7 个版本

0.6.0 2024 年 7 月 30 日
0.5.0 2024 年 6 月 28 日
0.4.4 2024 年 6 月 19 日
0.4.3 2024 年 4 月 10 日
0.4.1 2024 年 1 月 28 日

加密学 中排名第 256

Download history 3/week @ 2024-05-17 1/week @ 2024-05-24 111/week @ 2024-06-14 21/week @ 2024-06-21 124/week @ 2024-06-28 3/week @ 2024-07-05 130/week @ 2024-07-26 18/week @ 2024-08-02

每月下载量 148

Apache-2.0 许可

63KB
1K SLoC

fss

Crates.io docs.rs

包括分布式比较与点函数的函数秘密共享

开始使用

首先将包作为依赖项添加

# Run in your project directory
cargo add fss-rs

默认情况下,包括 PRG 实现和多线程。您可以选择禁用默认功能来自定义选择。 如果您在 ARM 机器上,请参阅 性能 部分,了解硬件加速。

然后构造一个实现相应 Prg 特质的 PRG,并构造一个 DcfImplDpfImpl 来使用 PRG。请参阅文档注释以了解泛型参数的含义。如果您想设置 (输入域,而不是输出域的值域)的 长度,请检查 new_with_filter 方法。

use rand::prelude::*;

// Matyas-Meyer-Oseas (via AES128) provides 128-bit security and should be enough.
// Hirose (via AES256) still only provides 128-bit security because the output is not chained.
// But Hirose can be helpful is you are forced to choose AES256.
use fss_rs::prg::Aes128MatyasMeyerOseasPrg;
use fss_rs::dcf::{Dcf, DcfImpl};

let keys: [[u8; 16]; 4] = thread_rng().gen();
let prg = Aes128MatyasMeyerOseasPrg::<16, 2, 4>::new(std::array::from_fn(|i| &keys[i]));
// DCF for example
let dcf = DcfImpl::<16, 16, _>::new(prg);

最后,对于密钥生成,构造要共享的函数以及两个初始化密钥,并调用 gen

use fss_rs::dcf::{BoundState, CmpFn};
use fss_rs::group::byte::ByteGroup;
use fss_rs::group::Group;

let s0s: [[u8; 16]; 2] = thread_rng().gen();
let f = CmpFn {
  alpha: thread_rng().gen(),
  // `ByteGroup` for example
  beta: ByteGroup(thread_rng().gen()),
  bound: BoundState::LtBeta,
};
let keys = dcf.gen(&f, [&s0s[0], &s0s[1]]);

有关如何将其拆分为两个份额,请参阅返回的 Share 的文档注释。由于它们共享许多字段,因此这两个份额是这样组合的。

对于评估,构造评估点,反转输出缓冲区,并调用 eval

let x: [u8; 16] = thread_rng().gen();
let mut y = ByteGroup::zero();
// The 2 parties use `true` / `false` to evaluate independently
dcf.eval(false, &k, &[&x], &mut [&mut y]);

对于全域评估,请使用 full_eval。虽然与 eval 类似,但 full_eval 不接受 x 的向量,而是期望一个长度为 2 ** IN_BLEN * 8y 向量来存储所有评估的 y

更多示例作为基准测试在 benches 目录 中提供

参考文献

性能

项目的热点路径是PRG和XOR操作。我们使用RustCrypto的aes crate进行PRG。对于XOR操作,我们使用nightly Rust的Rust std SIMD,或者稳定Rust的wide crate,该crate总下载量达到9M。

对于PRG,启用架构特定的CPU内嵌函数可以大幅提高性能。aes crate默认会执行CPU内嵌函数的运行时检测,并在可用时使用它们。

对于x86/x86_64(目标中的i686/x86_64),如果可用,则使用AES-NI,它开箱即用。

对于ARMv8(目标中的aarch64),尽管ARMv8密码学扩展受到支持,但为了使用它,除了上述之外,您还需要设置一些标志来启用它。有关详细信息,请参阅aes crate的文档。我们在此处也引用了该部分

https://docs.rs/aes/0.8.3/aes/#armv8-intrinsics-rust-161

ARMv8内嵌函数(Rust 1.61+)

在包括aarch64(如aarch64-apple-darwin(Apple M1))和Linux目标(如aarch64-unknown-linux-gnuaarch64-unknown-linux-musl)在内的aarch64目标上,当使用Rust 1.61或更高版本时,支持使用ARMv8密码学扩展提供的AES内嵌函数,并且可以使用aes_armv8配置标志来启用。

在Linux和macOS上,当启用aes_armv8标志时,AES内嵌函数的支持将在运行时自动检测。在其他平台上,必须通过RUSTFLAGS启用aes目标功能。

基准测试

我们使用Criterion.rs进行基准测试。Criterion.rs报告了包含criterion.tar.zst的发布版本。

我们使用(我的)笔记本电脑作为基准测试机器。基准测试时,它连接到电源充电。其CPU是AMD Ryzen 7 5800H,8核心16线程。我们使用rayon作为数据并行库,在多线程基准测试时建立16个线程。我们确保其内存足够用于基准测试。请注意,我们关闭了尽可能多的其他程序以减少调度,尽管除了VSCode之外的所有GUI应用程序都已关闭,并且我们避免同时进行其他任何事情。

变更日志

正确性修复

  • 在v0.6.0中修复了fss_rs::group::int_prime实现。
  • 在fss-rs crate的v0.4.3、dcf crate的v0.5.2和v0.6.3以及dpf-fss crate的v0.5.2中修复了fss_rs::dcf::prg::Aes256HirosePrg实现。

有关完整变更日志,请参阅CHANGELOG.md

许可证

版权(C)2023 Yulong Ming(myl7)

SPDX-License-Identifier: Apache-2.0

依赖项

~0.9–1.5MB
~36K SLoC