Shamir’s Secret Sharing Scheme
ericrafaloff.com
ericrafaloff.com
Then the part where using integers leaks information, and how to attack that, gets a bit hairier but is still a moderately accessible way to show cryptanalysis in practice. The fix using finite fields is then probably a step too far for most laypeople, and can be used as a lesson in how the fundamentals can be simple, but the devil is in the details.
Here's the problem setup: So we want to share a secret byte (178) among Alice, Bob, and Carol, so that we need all 3 of them to contribute to it. Three points defines a parabola so we choose two more random bytes: [38, 68], our polynomial is y = 178 + 38x + 68x². We then give Alice the point (1, 284), Bob the point (2, 526), and Carol the point (3, 904).
Now supposing that we have compromised both Bob and Carol's points we know that we have the two equations,
9a + 3b + c = 904
4a + 2b + c = 526
We can then eliminate b to get: 6a - c = 230
which we can rearrange as c = 6a - 230.
Since `a` cannot be a fraction, we must be able to cut down the number of possibilities for c to just 42 possibilities, {4, 10, 16, 22, 28, ...}, since they must be separated by sixes. I'm not 100% sure but I think this factor grows like n!/(n-k)! for "I have compromised k of n secrets, by what factor have I reduced the search space?"Here's how modular arithmetic solves this: It turns out that modulo a prime, all fractions are also whole numbers. That is, if I am working modulo the prime 13, I will find that I can divide 7/5 to find 4. Remember what division means, it inverts multiplication: I can find that 5 × 4 = 20 and then that 20 = 13 + 7, so they are at the same place "on the clock". In fact it suffices to just find 1/5 and multiply by 7, so you can find that 1/5 is 8 in the mod-13 ring, 8 × 5 = 40 = 39 + 1. You can also find that 1/6 is 11, so 6 × 11 = 66 = 65 + 1.
The proof that this must be the case is that if you take
[1, 2, ..., p-1].map(x => (x * n) % p)
this list cannot repeat itself: if it did, the resulting `x1 - x2` would divide `p`, by the distributive law of multiplication. It also is confined to only contain the numbers 1 through p-1, and so it must contain all of them exactly once: so if it doesn't repeat itself, it has to have a 1 in there somewhere.That's kind of a brute force argument so you may want to also mention that there are two efficient ways to find these, one is called the "Extended Euclidean algorithm" (do a GCD computation to find that the GCD=1, but you can take the dividends that you discarded and cleverly assemble them to recover the constants from Bezout's identity, which in this case gives you the modular inverse) and the other is called "Fermat's little theorem" (since a^(p-1) % p == 1 for prime p, raise something to the p-2 power. Using exponentiation by squaring you only need ~log p multiplications that each take no more than ~log p time.
For the part on leaking information, you can do the special case of two shares being required to recover the secret. You can then fairly straightforwardly show that if someone obtains just one share it does not help by showing that no matter what the secret, it is possible for that share to be a share for that secret. It's conceptually similar to how you show that xor with a true random key is unbreakable.
It's not the general case, but it can demonstrate how using modular arithmetic can fix an information leak.
Haskell: https://github.com/codahale/hs-shamir Go: https://github.com/codahale/sss Rust: https://github.com/codahale/sss.rs Java: https://github.com/codahale/shamir
Collusion between operators is a real problem of Shamir-based key systems. If you have a crypto system that depends on Shamir keys and a few of your operators leave the organization or become untrustworthy for some reason, then you need to revoke / resplit the origin key data material.
Additionally, the output of the ssss command itself is not secure, so you should consider having that data going through GPG to give each operator a GPG / keybase'd output which has never been seen in cleartext by anyone but themselves.
Long story short, key management continues to be really hard and needs to be thought through from begin to end with operational procedures in place to handle the real life situations that occur (employee collusion, employee join/depart, breach).
When I first learned about SSSS, I asked my professor after class why it wasn't invented earlier. He replied that even thinking of trying something like SSSS first requires the insight that you can encode arbitrary data in numeric form, which only became obvious after the invention and proliferation of computers. Which, I suppose, is a good, concrete example of the notion that "a change in perspective is worth 80 IQ points" (Alan Kay).
While that's as good an explanation as any, I still suspect some clever 19th century mathematician could have come up with it as a way to protect e.g. the combination to a safe. Perhaps it was independently invented, but just never shared with the outside world. The whole notion that cryptography is a field of mathematics where results can and should be published to the world is, in itself, a bit recent, given the intense secrecy around the field as late as the Second World War.
His Incompleteness results show that you can essentially write "This statement is false" as a number and blow up the grand project of formalising all of mathematics as a single (edit: typos) infallible, provable monolith.
If that's the key insight you could do SSSS before any actual digital computers were built (those happen very slightly after Kurt Gödel does this work and Turing et al build on it)
The time window between Gödel's incompleteness theorems and the first digital computers seems to be roughly 1931 to 1946 (if you count ENIAC as the first). That very, very closely overlaps with the Second World War--and even the years before the war were treated by many governments as exactly that, years to prepare for war. I suspect that would put a damper on publishing any interesting results in cryptographic techniques, though to be fair, there is also no evidence that anyone secretly, independently invented SSSS during that period or during the 24 years afterward.
Specifically, that's something like the first two thirds of his incompleteness proof spent establishing that as a fairly novel result, followed by rigorous mathematics to the effect of "Given a formula P(x,y) that asserts "We can't prove x(y,y).", can we prove P(P,P)?".
If you know of other insecurities, I'd be interested in hearing them.
Edit: apart from that, nanomonkey is right, if you post something publicly, it will be public. That's to be expected though. And assuming the use of libsodium is done correctly, there shouldn't be much of a problem with the primitives.
Now, the logic implemented on top of the protocol is a whole different story, sort of like most ethereum cautionary tales are not about ethereum being buggy, but people running buggy code on ethereum.
Would someone be able to suggest a self-learning resource (book, app, ...) that goes into cryptography and the required maths but doesn't demand too much pre-knowledge?
Thanks in advance!
Admittedly simplicity is a feature in and of itself, and the read-only unsealing requires more complex asymmetric cryptography, but the excellent nacl[0] makes this a lot easier than it used to be.
Meaning, this makes Vault more of a "let's really dedicate time to think of every possible scenario" type implementation rather than "let's just keep adding a couple of secrets a week".
What has other people's experiences been?
That said, for most organizations, I've never been all that convinced that the multi-key-holder model provides much benefit.