3个不稳定版本

0.2.0 2023年5月13日
0.1.1 2023年5月12日
0.1.0 2020年11月19日

#1809加密学

Download history 80/week @ 2024-04-02 3/week @ 2024-04-09 9/week @ 2024-04-16 27/week @ 2024-04-23 36/week @ 2024-04-30 27/week @ 2024-05-07 15/week @ 2024-05-14 1/week @ 2024-05-21 4/week @ 2024-05-28 2/week @ 2024-06-04 51/week @ 2024-06-11 30/week @ 2024-06-18 10/week @ 2024-06-25 25/week @ 2024-07-02 1/week @ 2024-07-09 14/week @ 2024-07-16

每月52次 下载
用于 agree

MIT/Apache

43KB
808 代码行

ssss

Rust中Shamir的秘密共享方案的实现

引用上面链接的维基百科文章

Shamir的秘密共享用于以分布式方式保护秘密,通常用于保护其他加密密钥。秘密被分成多个部分,称为份额。这些份额用于重建原始秘密。

要通过Shamir的秘密共享解锁秘密,您需要一定数量的份额。这被称为阈值,用于表示解锁秘密所需的最小份额数。让我们通过一个例子来了解

问题:公司XYZ需要保护他们的保险库密码。他们可以使用标准的加密方式,如AES,但如果有密钥持有者不可用或去世呢?如果密钥被恶意黑客攻击或密钥持有者变节,利用他们对保险库的控制来谋取私利怎么办?

这就是ssss发挥作用的地方。它可以用来加密保险库的密码并生成一定数量的份额,其中可以分配给公司XYZ中的每位高管。现在,只有当他们汇集他们的份额时,他们才能解锁保险库。阈值可以适当设置以符合高管的数量,这样保险库总是能够被授权的个人访问。如果某个份额落入错误的手中,除非其他高管合作,否则他们无法打开密码。

示例

let secret = "correct horse battery staple".as_bytes();
let config = SsssConfig::default();

// Generate 5 shares to be distributed, requiring a minimum of 3 later
// to unlock the secret
let mut shares = gen_shares(&config, &secret)?;

// Check that all 5 shares can unlock the secret
assert_eq!(shares.len(), 5);
assert_eq!(unlock(&shares)?, secret);

// Remove a random share from `shares` and check that 4 shares can unlock
// the secret
let mut rng = thread_rng();
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 4);
assert_eq!(unlock(&shares)?, secret);

// Remove another random share from `shares` and check that 3 shares can unlock
// the secret
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 3);
assert_eq!(unlock(&shares)?, secret);

// Remove another random share from `shares` and check that 2 shares *CANNOT*
// unlock the secret
remove_random_entry(&mut rng, &mut shares);
assert_eq!(shares.len(), 2);
assert_ne!(unlock(&shares)?, secret);

依赖项

~1.2-2MB
~41K SLoC