3个不稳定版本
0.3.0 | 2023年11月27日 |
---|---|
0.2.2 | 2023年8月8日 |
0.2.1 | 2023年8月3日 |
#2003在密码学类别中
每月下载量31次
用于star-constellation
70KB
1.5K SLoC
sta-rs crate
Rust实现的STAR协议。包括生成STAR消息的客户API函数和服务器聚合函数。
免责声明
警告:本工作区中的库尚未经过审计,使用风险自负!此代码正在积极开发中,未来版本可能会发生重大变化。
快速入门
构建和测试
cargo build
cargo test
基准测试
cargo bench
打开本地文档副本
cargo doc --open --no-deps
lib.rs
:
此模块提供了STAR(分布式秘密共享用于数据阈值聚合)协议的实现。STAR协议允许客户向服务器报告秘密测量结果,同时保持类似k匿名性的保证。
本质上,只有当达到一个阈值
数量的客户都发送相同的消息时,这样的测量才会被揭示。客户还被允许发送相关、任意的关联数据,这些数据也可以被揭示。
在STAR中,客户从实现PPOPRF(可 puncturable 部分不可见伪随机函数)协议的单独服务器中获取随机数。在STARLite中,客户从本地获取用于隐藏其测量值的随机数。PPOPRF协议接受客户测量值、服务器密钥和当前纪元元数据标签作为输入,并输出一个随机(确定性)值。
在STARLite的情况下,设计比STAR简单,但只有在客户测量值来自高熵域的情况下,安全性才能得到保证。在STAR的情况下,只要在纪元元数据标签从随机数服务器的密钥中 punctured 之后才揭示随机数,即使对于低熵输入,客户安全保证也能保持。
有关更多详细信息,请参阅完整论文。
示例(客户端)
以下示例演示了如何生成一个(ciphertext, share, tag)
消息三元组。然后将此消息发送到聚合服务器。
let measurement = SingleMeasurement::new("hello world".as_bytes());
let mg = MessageGenerator::new(measurement, threshold, epoch.as_bytes());
let mut rnd = [0u8; 32];
// NOTE: this is for STARLite. Randomness must be sampled from a
// randomness server in order to implement the full STAR protocol.
mg.sample_local_randomness(&mut rnd);
let Message {
ciphertext,
share,
tag,
} = Message::generate(&mg, &mut rnd, None)
.expect("Could not generate message triplet");
示例(WASM客户端)
以下示例展示了如何在STARLite协议中为每个客户端生成一个三元组(key, share, tag)
,该协议用于现有的WASM集成。STAR协议尚不支持。
在WASM集成中,必须使用key
来加密测量和关联数据,形成一个更高级别应用程序中的ciphertext
。然后将消息三元组(ciphertext, share, tag)
发送到服务器。
let measurement = SingleMeasurement::new("hello world".as_bytes());
let mg = MessageGenerator::new(measurement, threshold, epoch.as_bytes());
let mut rnd = [0u8; 32];
// NOTE: this is for STARLite. Randomness must be sampled from a
// randomness server in order to implement the full STAR protocol.
mg.sample_local_randomness(&mut rnd);
let WASMSharingMaterial {
key,
share,
tag,
} = mg.share_with_local_randomness().unwrap();
示例(服务器)
一旦从客户端恢复出超过threshold
的份额,就有可能恢复每个份额中编码的随机数。
let value = share_recover(&shares).unwrap().get_message();
// derive key for decrypting payload data in client message
let mut enc_key = vec![0u8; 16];
derive_ske_key(&value, epoch.as_bytes(), &mut enc_key);
依赖项
~6.5MB
~139K SLoC