Crypto++
8.6
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;
287 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.
Discrete Log (DL) crypto scheme options.
unsigned char byte
8-bit unsigned datatype
ElGamal key agreement and encryption schemes default implementation.
ElGamal Public Key adapter.
SchemeOptions::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
virtual OID GetAlgorithmID() const
Retrieves the OID of the algorithm.
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)
DL_PrivateKey_ElGamal< DL_CryptoKeys_ElGamal::PrivateKey > PrivateKey
Implements DL_PrivateKey interface.
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.
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.
DL_PublicKey_ElGamal< DL_CryptoKeys_ElGamal::PublicKey > PublicKey
Implements DL_PublicKey interface.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
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.
DL_CryptoKeys_ElGamal::GroupParameters GroupParameters
Implements DL_GroupParameters interface.
Crypto++ library namespace.
bool Validate(RandomNumberGenerator &rng, unsigned int level) const
Check the key for errors.
ElGamal encryption for safe interop.
Template implementing constructors for public key algorithm classes.
static const Integer & One()
Integer representing 1.
Interface for retrieving values given their names.
Abstract base classes that provide a uniform interface to this library.
static Integer Gcd(const Integer &a, const Integer &n)
Calculate greatest common divisor.
Multiple precision integer with arithmetic operations.
Multiple precision integer with arithmetic operations.