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
每月下载量 148
63KB
1K SLoC
fss
包括分布式比较与点函数的函数秘密共享
开始使用
首先将包作为依赖项添加
# Run in your project directory
cargo add fss-rs
默认情况下,包括 PRG 实现和多线程。您可以选择禁用默认功能来自定义选择。 如果您在 ARM 机器上,请参阅 性能 部分,了解硬件加速。
然后构造一个实现相应 Prg
特质的 PRG,并构造一个 DcfImpl
或 DpfImpl
来使用 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 * 8
的 y
向量来存储所有评估的 y
。
更多示例作为基准测试在 benches 目录 中提供
参考文献
- DCF:Elette Boyle, Nishanth Chandran, Niv Gilboa, Divya Gupta, Yuval Ishai, Nishant Kumar, 和 Mayank Rathee. "用于混合模式和定点安全计算的函数秘密共享." 在 EUROCRYPT. 2021。
- DPF:Elette Boyle, Niv Gilboa, 和 Yuval Ishai. "函数秘密共享:改进和扩展." 在 CCS. 2016。
- 快速 PRG:Leo de Castro 和 Anitgoni Polychroniadou. "轻量级、恶意安全可验证函数秘密共享." 在 EUROCRYPT. 2022。
- 快速PRG: Frank Wang, Catherine Yun, Shafi Goldwasser, Vinod Vaikuntanathan 和 Matei Zaharia. "Splinter: 在公共数据上执行实用私有查询。" 在 NDSI。2017。
性能
项目的热点路径是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-gnu和
aarch64-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