#threshold #pre #encryption-decryption #secret-sharing #private-key #proxy-re-encryption

bin+lib umbral-rs

Umbral-rs 是 Umbral 阈值代理重加密方案的纯 Rust 实现

4 个版本

0.0.4 2023年12月1日
0.0.3 2023年10月2日
0.0.2 2022年2月25日
0.0.1 2020年9月24日

#3 in #pre

GPL-3.0-only

260KB
3K SLoC

Umbral-rs

umbral-rs 是 Umbral 阈值代理重加密方案的实施,使用 Rust 构建,以 Umbral 作者创建的 Python 版本为参考。

Umbral 包含一个代理重加密方案,其中数据持有者可以将解密权限委派给数据消费者,以任何为其加密的文本。这是通过一系列半可信代理执行的重新加密过程来实现的。当这些代理中的阈值参与重新加密并创建一些份额时,消费者可以结合这些独立的重新加密份额,并使用其私钥解密原始消息。

加密/解密示例

use umbral_rs::pre::*;

let params = new_standard_params();
let alice = KeyPair::new(&params);
let signer = Signer::new(&params);
let bob = KeyPair::new(&params);

let plaintext = b"Hello, umbral!".to_vec();
let (ciphertext, mut capsule) = encrypt(&alice.public_key(), &plaintext).unwrap();

capsule.set_correctness_keys(&alice.public_key(), &bob.public_key(), &signer.public_key());

let threshold = 2;
let nodes_number = 5;

let kfrags = generate_kfrags(
  &alice,
  &bob.public_key(),
  threshold,
  nodes_number,
  &signer,
  KFragMode::DelegatingAndReceiving,
).unwrap();

for kfrag in kfrags {
  let cfrag = reencrypt(&kfrag, &capsule, true, None, true).unwrap();
  capsule.attach_cfrag(&cfrag).unwrap();
}

let plaintext_bob = decrypt(ciphertext, &capsule, &bob, true).unwrap();
assert_eq!(plaintext, plaintext_bob);
println!("{:?}", String::from_utf8(plaintext_bob.to_owned()).unwrap());

文件文档

源代码位于 src 文件夹中,文档位于 docs 文件夹中。简要来说,在 src/internal 文件夹中有以下文件

  • keys.rs 包含 KeyPair 结构体,用于生成公钥和私钥。
  • capsule.rs 包含 Capsule 结构体,用于封装密文。
  • kfrag.rs 包含 KFrag 结构体,用于委派重新加密权限。
  • curve.rs 包含 Curve 结构体,用于生成曲线参数。
  • errors.rs 包含 UmbralError 枚举,用于返回错误。
  • scheme.rs 包含方案中使用的哈希函数。
  • utils.rs 包含工具函数,如 poly_eval,用于在点上评估多项式。

src 文件夹中,有以下的文件

  • pre.rs 包含使用库的主要函数,例如 encryptdecryptreencryptgenerate_kfrags 等。
  • lib.rs 包含了 prelude 模块,该模块用于导入库的主要函数。
  • main.rs 包含了 main 函数,该函数用于运行测试。

依赖项

~5.5MB
~92K SLoC