1 package civitas.crypto.ciphertext;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Controller;
5
6 import civitas.crypto.CryptoBase;
7 import civitas.crypto.parameters.ElGamalParameters;
8 import civitas.crypto.publickey.ElGamalPublicKey;
9 import civitas.crypto.reencryptfactor.ElGamalReencryptFactor;
10 import civitas.util.CivitasBigInteger;
11
12 @Controller
13 public class ElGamalReencrypt {
14
15 @Autowired
16 CryptoBase cryptoBase;
17
18 public ElGamalCiphertextish apply(final ElGamalPublicKey key, final ElGamalCiphertextish ciphertext) {
19 ElGamalParameters ps = key.params;
20 CivitasBigInteger c1 = ciphertext.getA();
21 CivitasBigInteger c2 = ciphertext.getB();
22 CivitasBigInteger y = cryptoBase.generateRandomElement(ps.q);
23 c1 = c1.modMultiply(ps.g.modPow(y, ps.p), ps.p);
24 c2 = c2.modMultiply(key.y.modPow(y, ps.p), ps.p);
25 return new ElGamalCiphertext(c1, c2);
26 }
27
28 public ElGamalCiphertextish apply(
29 final ElGamalPublicKey key, final ElGamalCiphertextish ciphertext, final ElGamalReencryptFactor factor) {
30 ElGamalParameters ps = key.params;
31 CivitasBigInteger a = ciphertext.getA();
32 CivitasBigInteger b = ciphertext.getB();
33 CivitasBigInteger r = factor.r();
34 a = a.modMultiply(ps.g.modPow(r, ps.p), ps.p);
35 b = b.modMultiply(key.y.modPow(r, ps.p), ps.p);
36 return new ElGamalCiphertext(a, b);
37 }
38 }