View Javadoc
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  }