3个不稳定版本
0.2.0 | 2023年5月13日 |
---|---|
0.1.1 | 2023年5月12日 |
0.1.0 | 2020年11月19日 |
#1809 在 加密学
每月52次 下载
用于 agree
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