The general idea behind secret sharing is that you might
want to require multiple parties to cooperate in order to decrypt a
certain cipher text. It is not enough for one person to have her
key, she needs some help accessing the plain text. It turns out that
you can design schemes of arbitrary complexity that specify exactly
who has to cooperate to decrypt a particular message. For example,
you could specify a "Chinese menu" approach, where you need two from
column A, three from column B, and one from column C, to decrypt a
message. Even more complex dependencies are possible as well. For example, if
Alice uses her key, she needs Bob's help; if Carol uses her key,
she needs Dave's help (only one combination will work).
The simplest case of secret sharing is secret splitting.
This protocol requires the cooperation of all parties (two or
more) to decrypt a message. The protocol is quite simple:
Given a secret M, of length n.
Given N persons who will share the secret (named P1, P2, ..., PN).
Generate random bit strings R{1}, R{2}, ..., R{N-1}, or length n.
Calculate S = M XOR R{1} XOR R{2} ... XOR R{N-1}.
Destroy or hide M.
Give S to P1
Give R{1} to P2
[...]
Give R{N-1} to PN
The secret splitters need not even know which one receives S, and
which ones receive the Rs. Either way, M can only be constructed by
XOR-ing back together the information given to every person. This
works just like a one-time pad, and has the same
degree of absolute security (it is subject to bad random numbers
and human weaknesses, but those contravene the explicit protocol).