Notes on a threshold encryption scheme: Simple and Efficient Threshold Cryptosystem from the Gap Diffie-Hellman Group from Baek and Zheng.
Lagrange interpolation
A polynomial of degree can be recovered with a set of of its evaluations at distinct points with the following linear combination (Lagrange interpolation polynomial),
using the Lagrange coefficient :
Here we’re taking .
Notations
- for scalar and point in elliptic curve: scalar point multiplication
- : sample uniformly at random from set
Setup
BLS curve with pairing where are subgroups (elliptic curves) of the same order , generators . The scalar field from BLS. A hash function , hash to curve function , message space .
A number of nodes indexed from 1 to (inclusive).
A threshold .
A polynomial of degree whose coefficients are not known and sampled uniformly at random.
An (unknown) secret master key , and corresponding public master key .
Each node possesses a share of the secret key (called secret key share) , with corresponding public verification keys for each node .
Deriving public key shares and public key in
Each node can compute a verification key share in by computing . And after posting them on-chain, the master public key on can be recovered like so:
One can check that the verification key share in matches the one in with the pairing check for :
Encrypt
If
Input: , a valid setup (provided by a DKG in our case).
- Sample
- Compute :
- if :
- if :
- Ouput
Verify ciphertext
Input: ciphertext
- Compute
- Return
Create decryption key share
- If ciphertext verification succeeds, , output
Verify decryption key share
if :
and
can be verified with two pairings:
Scaling with the number of ciphertexts
This works with public key shares in , which is doable as the keyholder can easily map their key shares from to with the mapping which preserves the properties of the public keys, and the key shares in can be checked against the key shares in with a pairing after the DKG phase: .
One can check for a threshold of keyholders indexed by ( is keyholder set):
the above predicate is equivalent to with high probability (for nonzero random scalar ):
Alpha can be sampled solely from ALL the arguments to the pairings (Fiat-Shamir transformation).
For kernel execution, the random scalar can be chosen as the hash of all the arguments to the pairings
So that we go (for ciphertexts) from pairings down to ( pairing checks instead of pairing checks).
Why is the above batching secure?
Let’s consider the simpler problem:
Let A be an adversary who outputs pairs of group
elements and wins iff where . Prove that either forall or A cannot win except with negligible probability.
We obtain thus which is a polynomial of degree (so has at most roots in the base finite field ) that vanishes at . Assuming forall (otherwise the equality holds for any choice of ), by the Schwartz-Zippel lemma, the probability that a uniformly random vanishes the polynomial is which is negligible when working in a big finite field . We can take by the Fiat-Shamir transform as the hash function uniformly distributes outputs, regardless of the inputs, so that the probability of success of the adversary would remain .
One can reduce the above predicate to this simpler problem with the following chain of equivalences:
Combine decryption key shares
Input: decryption key shares from a set of distinct nodes
- Verify ciphertext
- Verify decryption key shares
- Recover plaintext :
- if :
- if :
Correctness:
For : by bilinearity of the pairing (and ):