6 #ifndef CRYPTOPP_ELGAMAL_H
7 #define CRYPTOPP_ELGAMAL_H
26 CRYPTOPP_UNUSED(groupParams), CRYPTOPP_UNUSED(ephemeralPublicKey), CRYPTOPP_UNUSED(derivationParams);
27 agreedElement.
Encode(derivedKey, derivedLength);
30 size_t GetSymmetricKeyLength(
size_t plainTextLength)
const
32 CRYPTOPP_UNUSED(plainTextLength);
33 return GetGroupParameters().GetModulus().ByteCount();
36 size_t GetSymmetricCiphertextLength(
size_t plainTextLength)
const
38 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
39 if (plainTextLength <= GetMaxSymmetricPlaintextLength(len))
45 size_t GetMaxSymmetricPlaintextLength(
size_t cipherTextLength)
const
47 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
48 if (cipherTextLength == len)
49 return STDMIN(255U, len-3);
56 CRYPTOPP_UNUSED(parameters);
57 const Integer &p = GetGroupParameters().GetModulus();
62 memcpy(block+modulusLen-2-plainTextLength, plainText, plainTextLength);
63 block[modulusLen-2] = (byte)plainTextLength;
65 a_times_b_mod_c(
Integer(key, modulusLen),
Integer(block, modulusLen-1), p).
Encode(cipherText, modulusLen);
68 DecodingResult SymmetricDecrypt(
const byte *key,
const byte *cipherText,
size_t cipherTextLength,
byte *plainText,
const NameValuePairs ¶meters)
const
70 CRYPTOPP_UNUSED(parameters);
71 const Integer &p = GetGroupParameters().GetModulus();
74 if (cipherTextLength != modulusLen)
77 Integer m = a_times_b_mod_c(
Integer(cipherText, modulusLen),
Integer(key, modulusLen).InverseMod(p), p);
80 unsigned int plainTextLength = plainText[0];
81 if (plainTextLength > GetMaxSymmetricPlaintextLength(modulusLen))
84 m.
Encode(plainText, plainTextLength);
90 #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
95 template <
class BASE,
class SCHEME_OPTIONS,
class KEY>
99 size_t FixedMaxPlaintextLength()
const {
return this->MaxPlaintextLength(FixedCiphertextLength());}
100 size_t FixedCiphertextLength()
const {
return this->CiphertextLength(0);}
105 {
return Decrypt(rng, cipherText, FixedCiphertextLength(), plainText);}
107 #ifndef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562
130 CRYPTOPP_CONSTEXPR
static const char *StaticAlgorithmName() {
return "ElgamalEnc/Crypto++Padding";}
132 typedef SchemeOptions::GroupParameters GroupParameters;