Crypto++
8.3
Free C++ class library of cryptographic schemes
|
Go to the documentation of this file.
6 #ifndef CRYPTOPP_ELGAMAL_H
7 #define CRYPTOPP_ELGAMAL_H
33 CRYPTOPP_UNUSED(groupParams); CRYPTOPP_UNUSED(ephemeralPublicKey);
34 CRYPTOPP_UNUSED(derivationParams);
35 agreedElement.
Encode(derivedKey, derivedLength);
38 size_t GetSymmetricKeyLength(
size_t plainTextLength)
const
40 CRYPTOPP_UNUSED(plainTextLength);
41 return GetGroupParameters().GetModulus().ByteCount();
44 size_t GetSymmetricCiphertextLength(
size_t plainTextLength)
const
46 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
47 if (plainTextLength <= GetMaxSymmetricPlaintextLength(len))
53 size_t GetMaxSymmetricPlaintextLength(
size_t cipherTextLength)
const
55 unsigned int len = GetGroupParameters().GetModulus().ByteCount();
58 if (cipherTextLength == len)
59 return STDMIN(255U, len-3);
66 CRYPTOPP_UNUSED(parameters);
67 const Integer &p = GetGroupParameters().GetModulus();
72 memcpy(block+modulusLen-2-plainTextLength, plainText, plainTextLength);
73 block[modulusLen-2] = (byte)plainTextLength;
75 a_times_b_mod_c(
Integer(key, modulusLen),
Integer(block, modulusLen-1), p).
Encode(cipherText, modulusLen);
78 DecodingResult SymmetricDecrypt(
const byte *key,
const byte *cipherText,
size_t cipherTextLength,
byte *plainText,
const NameValuePairs ¶meters)
const
80 CRYPTOPP_UNUSED(parameters);
81 const Integer &p = GetGroupParameters().GetModulus();
84 if (cipherTextLength != modulusLen)
87 Integer m = a_times_b_mod_c(
Integer(cipherText, modulusLen),
Integer(key, modulusLen).InverseMod(p), p);
90 unsigned int plainTextLength = plainText[0];
91 if (plainTextLength > GetMaxSymmetricPlaintextLength(modulusLen))
94 m.
Encode(plainText, plainTextLength);
106 template <
class BASE,
class SCHEME_OPTIONS,
class KEY>
114 size_t FixedMaxPlaintextLength()
const {
return this->MaxPlaintextLength(FixedCiphertextLength());}
115 size_t FixedCiphertextLength()
const {
return this->CiphertextLength(0);}
120 {
return Decrypt(rng, cipherText, FixedCiphertextLength(), plainText);}
139 template <
class BASE>
155 return ASN1::elGamal();
170 template <
class BASE>
186 return ASN1::elGamal();
219 bool pass = this->GetAbstractGroupParameters().Validate(rng, level);
221 const Integer &p = this->GetGroupParameters().GetModulus();
222 const Integer &q = this->GetAbstractGroupParameters().GetSubgroupOrder();
223 const Integer &x = this->GetPrivateExponent();
228 pass = pass && x.IsPositive() && x < p-1;
283 typedef SchemeOptions::PublicKey
PublicKey;
ElGamal encryption scheme with non-standard padding.
Interface for private keys.
Converts an enumeration to a type suitable for use as a template parameter.
PK_FinalTemplate< ElGamalObjectImpl< DL_DecryptorBase< Integer >, SchemeOptions, SchemeOptions::PrivateKey > > Decryptor
Implements PK_Encryptor interface.
DL_PublicKey_ElGamal< DL_CryptoKeys_GFP::PublicKey > PublicKey
Implements DL_PublicKey interface.
Discrete Log (DL) crypto scheme options.
ElGamal key agreement and encryption schemes default implementation.
ElGamal Public Key adapter.
static const Integer &CRYPTOPP_API One()
Integer representing 1.
DL_CryptoKeys_GFP::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
SchemeOptions::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
virtual OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
static Integer CRYPTOPP_API Gcd(const Integer &a, const Integer &n)
Calculate greatest common divisor.
ElGamal key agreement and encryption schemes keys.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
ElGamal key agreement and encryption schemes base class.
This file contains helper classes/functions for implementing public key algorithms.
Discrete Log (DL) base object implementation.
Classes and functions for schemes based on Discrete Logs (DL) over GF(p)
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
static const char * StaticAlgorithmName()
The algorithm name.
Interface for random number generators.
Interface for symmetric encryption algorithms used in DL cryptosystems.
unsigned int ByteCount() const
Determines the number of bytes required to represent the Integer.
Utility functions for the Crypto++ library.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
Interface for key derivation algorithms used in DL cryptosystems.
DL_PrivateKey_ElGamal< DL_CryptoKeys_GFP::PrivateKey > PrivateKey
Implements DL_PrivateKey interface.
Classes for the DSA signature algorithm.
Interface for public keys.
Returns a decoding results.
virtual OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
Classes and functions for working with ANS.1 objects.
ASN.1 object identifiers for algorthms and schemes.
ElGamal Private Key adapter.
Diffie-Hellman key agreement algorithm.
PK_FinalTemplate< ElGamalObjectImpl< DL_EncryptorBase< Integer >, SchemeOptions, SchemeOptions::PublicKey > > Encryptor
Implements PK_Encryptor interface.
void Encode(byte *output, size_t outputLen, Signedness sign=UNSIGNED) const
Encode in big-endian format.
Crypto++ library namespace.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check the key for errors.
GF(p) group parameters that default to safe primes.
Template implementing constructors for public key algorithm classes.
Interface for retrieving values given their names.
Abstract base classes that provide a uniform interface to this library.
Multiple precision integer with arithmetic operations.
Multiple precision integer with arithmetic operations.