Elgamal implementation problems
Angelo Nicolosi
amenuor at hotmail.com
Sun May 1 11:05:39 CEST 2011
Hello list!I am a student in computer science, and for a project I have to implement the Elgamal cryptosystem.What I am interested in is the additive homomorphic property of the "modified" scheme, namely:
Enc(m) = (c1, c2) = (g^k mod p , (h^k * g^message) mod p) Dec(Enc(m)) = (c2 * c1^-s)
The property is the following:
Enc(m) * Enc(m') = (c1 * c1' , c2 * c2');Dec(Enc(m) * Enc(m')) = g^(m + m');
My (maybe naive) implementation is the following:
void eg_encryption(eg_cipherText_t *cipherText, const mpz_t message, const eg_publicKey_t *publicKey){ mpz_t modMsg, k, tmp, tmp2; mpz_inits(k,tmp2,tmp,modMsg,NULL); //computing c1 = g^k mod p generateRandomElGamal(k, ELGAMAL_RAND_BITS); mpz_powm(cipherText->c1, publicKey->g, k, publicKey->p);
//computing c2 = h^k * g^M mod p //tmp = h^k mod p mpz_powm(tmp, publicKey->h, k, publicKey->p); mpz_set(modMsg, message); mpz_powm(tmp2, publicKey->g, modMsg, publicKey->p); mpz_mul(cipherText->c2, tmp2, tmp); //cleaning mpz_clears(k,tmp,tmp2,modMsg,NULL);}
voideg_decryption(mpz_t message, const eg_cipherText_t *cipherText, const eg_privateKey_t *privateKey){ mpz_t tmp, ms; mpz_inits(tmp,ms,NULL); //computing message = (c2 * ((c1^-s))) mpz_neg(ms, privateKey->s); mpz_powm(tmp, cipherText->c1, ms, privateKey->p); mpz_mul(message, cipherText->c2, tmp); mpz_mod(message, message, privateKey->p); //cleaning mpz_clears(tmp,ms,NULL);}
This is working if:
m + m' > 0;
if not I receive wrong results.Am I missing/misusing something?Do you have any advices in order to improve this implementation (both in security and in efficiency)?Thank you in advance for your helpfulness!Warm regards,Angelo.
More information about the gmp-discuss
mailing list