00001 #ifndef CRYPTOPP_ELGAMAL_H
00002 #define CRYPTOPP_ELGAMAL_H
00003
00004 #include "modexppc.h"
00005
00006 NAMESPACE_BEGIN(CryptoPP)
00007
00009 class ElGamalEncryptor : public PK_WithPrecomputation<PK_FixedLengthEncryptor>
00010 {
00011 public:
00012 ElGamalEncryptor(const Integer &p, const Integer &g, const Integer &y);
00013 ElGamalEncryptor(BufferedTransformation &bt);
00014
00015 void DEREncode(BufferedTransformation &bt) const;
00016
00017 void Precompute(unsigned int precomputationStorage=16);
00018 void LoadPrecomputation(BufferedTransformation &storedPrecomputation);
00019 void SavePrecomputation(BufferedTransformation &storedPrecomputation) const;
00020
00021 void Encrypt(RandomNumberGenerator &rng, const byte *plainText, unsigned int plainTextLength, byte *cipherText);
00022
00023 unsigned int MaxPlainTextLength() const {return STDMIN(255U, m_p.ByteCount()-3);}
00024 unsigned int CipherTextLength() const {return 2*m_p.ByteCount();}
00025
00026 void RawEncrypt(const Integer &k, const Integer &m, Integer &a, Integer &b) const;
00027
00028 const Integer & GetModulus() const {return m_p;}
00029 const Integer & GetGenerator() const {return m_g;}
00030 const Integer & GetPublicResidue() const {return m_y;}
00031
00032 const ModExpPrecomputation & GetGPC() const {return m_gpc;}
00033 const ModExpPrecomputation & GetYPC() const {return m_ypc;}
00034
00035 protected:
00036 ElGamalEncryptor() {}
00037 unsigned int ExponentBitLength() const;
00038
00039 Integer m_p, m_g, m_y;
00040 ModExpPrecomputation m_gpc, m_ypc;
00041 };
00042
00044 class ElGamalDecryptor : public ElGamalEncryptor, public PK_FixedLengthDecryptor
00045 {
00046 public:
00047 ElGamalDecryptor(const Integer &p, const Integer &g, const Integer &y, const Integer &x);
00048 ElGamalDecryptor(RandomNumberGenerator &rng, unsigned int pbits);
00049
00050 ElGamalDecryptor(RandomNumberGenerator &rng, const Integer &p, const Integer &g);
00051
00052 ElGamalDecryptor(BufferedTransformation &bt);
00053 void DEREncode(BufferedTransformation &bt) const;
00054
00055 unsigned int Decrypt(const byte *cipherText, byte *plainText);
00056
00057 void RawDecrypt(const Integer &a, const Integer &b, Integer &m) const;
00058
00059 const Integer & GetPrivateExponent() const {return m_x;}
00060
00061 protected:
00062 Integer m_x;
00063 };
00064
00065 NAMESPACE_END
00066
00067 #endif