In a special ElGamal encryption scheme, every user has an ElGamal encryption key-pair using the same cyclic group $G$ and generator $g$.
The system has a special function :
$$ \mathrm{ShuffleEncrypt}(m_1, m_2, h_1, h_2 ) = \text{RandomPermutationOf} ( \operatorname{Enc}( h_1,m_1) , \operatorname{Enc}( h_2, m_2) ) = ( a, b)$$
$m_1$ and $m_2$ are plaintexts.
So given two public keys $h_1$ and $h_2$ and two plaintexts the function encrypts them and shuffles the resulting ElGamal ciphertexts ($a$ and $b$).
I want to prove in zero knowledge that $\mathrm{ShuffleEncrypt}$ was correctly done:
- $m_1$, $m_2$ and the ElGamal randomization values must be kept hidden.
- The ZNP must prove that $m_1$ and $m_2$ were known to the party doing $\mathrm{ShuffleEncrypt}$.
The verifier knows $h_1$, $h_2$, $a$ and $b$.
The ZN proof probably involves hiding both base an exponent values. Since there are many users, they cannot jointly compute a master shared key nor any other shared secret.
Any idea? (Maybe another public key cryptosystem is better suited for this kind of ZNP.)