diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/generators/ElGamalKeyPairGenerator.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/generators/ElGamalKeyPairGenerator.java | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/generators/ElGamalKeyPairGenerator.java b/bcprov/src/main/java/org/bouncycastle/crypto/generators/ElGamalKeyPairGenerator.java new file mode 100644 index 0000000..f23b697 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/crypto/generators/ElGamalKeyPairGenerator.java @@ -0,0 +1,44 @@ +package org.bouncycastle.crypto.generators; + +import java.math.BigInteger; + +import org.bouncycastle.crypto.AsymmetricCipherKeyPair; +import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator; +import org.bouncycastle.crypto.KeyGenerationParameters; +import org.bouncycastle.crypto.params.DHParameters; +import org.bouncycastle.crypto.params.ElGamalKeyGenerationParameters; +import org.bouncycastle.crypto.params.ElGamalParameters; +import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters; +import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters; + +/** + * a ElGamal key pair generator. + * <p> + * This generates keys consistent for use with ElGamal as described in + * page 164 of "Handbook of Applied Cryptography". + */ +public class ElGamalKeyPairGenerator + implements AsymmetricCipherKeyPairGenerator +{ + private ElGamalKeyGenerationParameters param; + + public void init( + KeyGenerationParameters param) + { + this.param = (ElGamalKeyGenerationParameters)param; + } + + public AsymmetricCipherKeyPair generateKeyPair() + { + DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.INSTANCE; + ElGamalParameters egp = param.getParameters(); + DHParameters dhp = new DHParameters(egp.getP(), egp.getG(), null, egp.getL()); + + BigInteger x = helper.calculatePrivate(dhp, param.getRandom()); + BigInteger y = helper.calculatePublic(dhp, x); + + return new AsymmetricCipherKeyPair( + new ElGamalPublicKeyParameters(y, egp), + new ElGamalPrivateKeyParameters(x, egp)); + } +} |