Verifiable Encryption With ElGamal and Kryptology using Golang
With verifiable encryption, Bob can generate a Non-interactive Zero-Knowledge Proof (NIZKP) that a certain encryption key has been used to encrypt a message to ciphertext. Alice can then receive the ciphertext, and then check the encryption key that has been used, and verify it. An example of this might be where Bob sends Alice an encryption key and uses Trent’s public key to encrypt it. Bob then creates a proof of the key and sends it to Alice with the ciphertext. Alice checks the proof and makes sure it has used Trent’s public key. Alice can then pass the ciphertext to Trent, and then who can also produce a proof of successful decryption.
ElGamal encryption has many great advantages over other public key methods, including the usage of homomorphic encryption. The following defines the basic method of using ElGamal with elliptic curve cryptography:
To create the proof:
We then get two Schnorr proof values. To verify: