#protocols #secret #privacy #analytics #secret-key #crypto

sta-rs

基于阈值聚合报告的分布式秘密共享

3个不稳定版本

0.3.0 2023年11月27日
0.2.2 2023年8月8日
0.2.1 2023年8月3日

#2003密码学类别中

每月下载量31
用于star-constellation

MPL-2.0许可证

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