I was playing around with a problem in e-voting schemes that use additive homomorphic encryption to tally votes, namely that at the end of the day somebody (or somebodies, if the secret material has been broken up somehow) has to be trusted to decrypt the final tally.
Looking at ElGamal's additive variant, reproduced here for reference:
- $M$ is a modulo field in which all computation happens
- $g$ is a generator for $M$
- private key = $k_2$ = random number < $M$
- public key = $k_1$ = $g^{k_2}$
- $m$ is a member of the modulo field $M$
- $x$ is the plaintext
- $r$ is a random number < $M$, different for each call to E
- this is the ephemeral key, used in the second $D(...)$
- $E(k_1, x) = <g^r, m^x * k_1^r> = <c_1, c_2>$
- $D(k_2, c_1, c_2) = c_2 * ({c_1^{k_2}})^{-1}$
- $D(r, k_1, c_1, c_2) = c_2 * (k_1^r)^{-1}$
In e-voting schemes*, every vote is represented as a 1 or 0 plaintext and tallying is a simple matter of multiplying all the ciphertexts together and decrypting the result.
The following scheme eliminates the need to release the private key to decrypt the final tally:
Prior to the "election"
- precompute a large list of random numbers $R = [R_1, ... , R_n]$ where $n$ is the number of possible voters
- let $A = [A_1, ..., A_n] = [R_1, A_1+R_2, A_2+R3, ... , A_{n-1}+R_n]$
- publish the hashes of each member of A in order
When encrypting "ballots"
- when choosing an $r$ for a $E(k_1, x)$, choose the first unused member of R
After the election
- publish all the ciphertexts (the "ballots")
- publish $A_y$ where $y$ is the number of ballots cast
$A_y$ would be the ephemeral key for the tally, but wouldn't allow for the decryption of any other ballots (like the private key would). The correctness of $A_y$ is achieved by the polling authority committing to its value by publishing hashes before hand.
In a nutshell, it's just publishing a commitment (via hashing) for all possible ephemeral keys for the final tally; then releasing the singular relevant ephemeral key. Everyone can tally, and decrypt that tally but decrypting individual "ballot" values shouldn't be possible.
I built a little proof of concept program that actual does this (using some open source implementations of additive ElGamal), and it works.
Of course, simply working isn't sufficient; I'm curious about the security of the scheme.
My question, are there any publications or other work related to this approach?
This seems like a pretty simple extension to the well documented additive ElGamal e-voting schemes, but my Google-Fu is failing to find anything and I'm personally unfamiliar with any such material.
(This approach [the pre-computed ephemeral key part, specifically] being broken and why, also acceptable naturally)
*Simplified greatly from actual schemes, but this is the heart of the crypto bits.