Decentralised key recovery via threshold secret sharing
In Greek mythology, the Pleiades were the seven daughters of the titan Atlas and the sea-nymph Pleione — Alcyone, Maia, Electra, Taygeta, Merope, Celaeno, and Asterope. Condemned to hold up the sky, Atlas could no longer protect them. Zeus transformed the sisters into stars, scattering them across the heavens.
No single star tells the full story. One sister, Merope, hides in shame — the "lost Pleiad" — just as a single share of a secret reveals nothing alone. Only when enough sisters reunite does the constellation take shape.
Input Output Group's Pleiades mirrors this myth: a secret is split into shares distributed among guardians. Only when enough shares converge can the constellation be redrawn and the secret recovered.
Three complementary schemes, one library. Choose the level of trust you need.
Any t+1 shares reconstruct the secret. Fewer than t+1 reveal nothing — information-theoretic security.
Feldman VSS publishes elliptic curve group commitments so every participant can verify their share without trusting the dealer.
BUSS guardians derive their share on-demand from their own secret key — no extra storage, no pre-coordination.
Polynomial evaluation via FFT over elliptic curve multiplicative subgroup — O(n log n) for large share counts.
Core schemes are generic over any PrimeField and Group — not locked to one curve.
Idiomatic Result-based error handling and a clean API designed for embedding in larger protocols.
Add Pleiades to your project and split a secret in a few lines.
[dependencies]
arc-pleiades = "0.1"
use arc_pleiades::ShamirSecretSharing;
use midnight_curves::Fr as Scalar;
use rand::thread_rng;
fn main() -> Result<(), arc_pleiades::Error> {
// 3-of-5: split into 4 shares, reconstruct from any 3
let sss = ShamirSecretSharing::new(2, 5)?;
let secret = Scalar::from(0xdeadbeef_u64);
let shares = sss.split(secret, &mut thread_rng())?;
println!("Distributed {} shares", shares.len()); // 4
let recovered = sss.reconstruct(&shares[..3])?;
assert_eq!(secret, recovered);
println!("Secret recovered ✓");
Ok(())
}