6 #ifndef CRYPTOPP_ELGAMAL_H
7 #define CRYPTOPP_ELGAMAL_H
30 CRYPTOPP_UNUSED(groupParams), CRYPTOPP_UNUSED(ephemeralPublicKey), CRYPTOPP_UNUSED(derivationParams);
31 agreedElement.
Encode(derivedKey, derivedLength);
34 size_t GetSymmetricKeyLength(
size_t plainTextLength)
const
36 CRYPTOPP_UNUSED(plainTextLength);
37 return GetGroupParameters().GetModulus().ByteCount();
40 size_t GetSymmetricCiphertextLength(
size_t plainTextLength)
const
42 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
43 if (plainTextLength <= GetMaxSymmetricPlaintextLength(len))
49 size_t GetMaxSymmetricPlaintextLength(
size_t cipherTextLength)
const
51 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
52 if (cipherTextLength == len)
53 return STDMIN(255U, len-3);
60 CRYPTOPP_UNUSED(parameters);
61 const Integer &p = GetGroupParameters().GetModulus();
66 memcpy(block+modulusLen-2-plainTextLength, plainText, plainTextLength);
67 block[modulusLen-2] = (byte)plainTextLength;
69 a_times_b_mod_c(
Integer(key, modulusLen),
Integer(block, modulusLen-1), p).
Encode(cipherText, modulusLen);
72 DecodingResult SymmetricDecrypt(
const byte *key,
const byte *cipherText,
size_t cipherTextLength,
byte *plainText,
const NameValuePairs ¶meters)
const
74 CRYPTOPP_UNUSED(parameters);
75 const Integer &p = GetGroupParameters().GetModulus();
78 if (cipherTextLength != modulusLen)
81 Integer m = a_times_b_mod_c(
Integer(cipherText, modulusLen),
Integer(key, modulusLen).InverseMod(p), p);
84 unsigned int plainTextLength = plainText[0];
85 if (plainTextLength > GetMaxSymmetricPlaintextLength(modulusLen))
88 m.
Encode(plainText, plainTextLength);
97 template <
class BASE,
class SCHEME_OPTIONS,
class KEY>
103 size_t FixedMaxPlaintextLength()
const {
return this->MaxPlaintextLength(FixedCiphertextLength());}
104 size_t FixedCiphertextLength()
const {
return this->CiphertextLength(0);}
109 {
return Decrypt(rng, cipherText, FixedCiphertextLength(), plainText);}
135 CRYPTOPP_STATIC_CONSTEXPR
const char* StaticAlgorithmName() {
return "ElgamalEnc/Crypto++Padding";}
137 typedef SchemeOptions::GroupParameters GroupParameters;