⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pubkey.h

📁 lots Elliptic curve cryptography codes. Use Visual c++ to compile
💻 H
📖 第 1 页 / 共 5 页
字号:
		return p.release();	}};//! _template <class SCHEME_OPTIONS>class DL_VerifierImpl : public DL_ObjectImpl<DL_VerifierBase<typename SCHEME_OPTIONS::Element>, SCHEME_OPTIONS, typename SCHEME_OPTIONS::PublicKey>{public:	PK_MessageAccumulator * NewVerificationAccumulator() const	{		return new PK_MessageAccumulatorImpl<CPP_TYPENAME SCHEME_OPTIONS::HashFunction>;	}};//! _template <class SCHEME_OPTIONS>class DL_EncryptorImpl : public DL_ObjectImpl<DL_EncryptorBase<typename SCHEME_OPTIONS::Element>, SCHEME_OPTIONS, typename SCHEME_OPTIONS::PublicKey>{};//! _template <class SCHEME_OPTIONS>class DL_DecryptorImpl : public DL_ObjectImpl<DL_DecryptorBase<typename SCHEME_OPTIONS::Element>, SCHEME_OPTIONS, typename SCHEME_OPTIONS::PrivateKey>{};// ********************************************************//! _template <class T>class CRYPTOPP_NO_VTABLE DL_SimpleKeyAgreementDomainBase : public SimpleKeyAgreementDomain{public:	typedef T Element;	CryptoParameters & AccessCryptoParameters() {return AccessAbstractGroupParameters();}	unsigned int AgreedValueLength() const {return GetAbstractGroupParameters().GetEncodedElementSize(false);}	unsigned int PrivateKeyLength() const {return GetAbstractGroupParameters().GetSubgroupOrder().ByteCount();}	unsigned int PublicKeyLength() const {return GetAbstractGroupParameters().GetEncodedElementSize(true);}	void GeneratePrivateKey(RandomNumberGenerator &rng, byte *privateKey) const	{		Integer x(rng, Integer::One(), GetAbstractGroupParameters().GetMaxExponent());		x.Encode(privateKey, PrivateKeyLength());	}	void GeneratePublicKey(RandomNumberGenerator &rng, const byte *privateKey, byte *publicKey) const	{		const DL_GroupParameters<T> &params = GetAbstractGroupParameters();		Integer x(privateKey, PrivateKeyLength());		Element y = params.ExponentiateBase(x);		params.EncodeElement(true, y, publicKey);	}		bool Agree(byte *agreedValue, const byte *privateKey, const byte *otherPublicKey, bool validateOtherPublicKey=true) const	{		try		{			const DL_GroupParameters<T> &params = GetAbstractGroupParameters();			Integer x(privateKey, PrivateKeyLength());			Element w = params.DecodeElement(otherPublicKey, validateOtherPublicKey);			Element z = GetKeyAgreementAlgorithm().AgreeWithStaticPrivateKey(				GetAbstractGroupParameters(), w, validateOtherPublicKey, x);			params.EncodeElement(false, z, agreedValue);		}		catch (DL_BadElement &)		{			return false;		}		return true;	}	const Element &GetGenerator() const {return GetAbstractGroupParameters().GetSubgroupGenerator();}protected:	virtual const DL_KeyAgreementAlgorithm<Element> & GetKeyAgreementAlgorithm() const =0;	virtual DL_GroupParameters<Element> & AccessAbstractGroupParameters() =0;	const DL_GroupParameters<Element> & GetAbstractGroupParameters() const {return const_cast<DL_SimpleKeyAgreementDomainBase<Element> *>(this)->AccessAbstractGroupParameters();}};enum CofactorMultiplicationOption {NO_COFACTOR_MULTIPLICTION, COMPATIBLE_COFACTOR_MULTIPLICTION, INCOMPATIBLE_COFACTOR_MULTIPLICTION};typedef EnumToType<CofactorMultiplicationOption, NO_COFACTOR_MULTIPLICTION> NoCofactorMultiplication;typedef EnumToType<CofactorMultiplicationOption, COMPATIBLE_COFACTOR_MULTIPLICTION> CompatibleCofactorMultiplication;typedef EnumToType<CofactorMultiplicationOption, INCOMPATIBLE_COFACTOR_MULTIPLICTION> IncompatibleCofactorMultiplication;//! DH key agreement algorithmtemplate <class ELEMENT, class COFACTOR_OPTION>class DL_KeyAgreementAlgorithm_DH : public DL_KeyAgreementAlgorithm<ELEMENT>{public:	typedef ELEMENT Element;	static const char * CRYPTOPP_API StaticAlgorithmName()		{return COFACTOR_OPTION::ToEnum() == INCOMPATIBLE_COFACTOR_MULTIPLICTION ? "DHC" : "DH";}	Element AgreeWithEphemeralPrivateKey(const DL_GroupParameters<Element> &params, const DL_FixedBasePrecomputation<Element> &publicPrecomputation, const Integer &privateExponent) const	{		return publicPrecomputation.Exponentiate(params.GetGroupPrecomputation(), 			COFACTOR_OPTION::ToEnum() == INCOMPATIBLE_COFACTOR_MULTIPLICTION ? privateExponent*params.GetCofactor() : privateExponent);	}	Element AgreeWithStaticPrivateKey(const DL_GroupParameters<Element> &params, const Element &publicElement, bool validateOtherPublicKey, const Integer &privateExponent) const	{		if (COFACTOR_OPTION::ToEnum() == COMPATIBLE_COFACTOR_MULTIPLICTION)		{			const Integer &k = params.GetCofactor();			return params.ExponentiateElement(publicElement, 				ModularArithmetic(params.GetSubgroupOrder()).Divide(privateExponent, k)*k);		}		else if (COFACTOR_OPTION::ToEnum() == INCOMPATIBLE_COFACTOR_MULTIPLICTION)			return params.ExponentiateElement(publicElement, privateExponent*params.GetCofactor());		else		{			assert(COFACTOR_OPTION::ToEnum() == NO_COFACTOR_MULTIPLICTION);			if (!validateOtherPublicKey)				return params.ExponentiateElement(publicElement, privateExponent);			if (params.FastSubgroupCheckAvailable())			{				if (!params.ValidateElement(2, publicElement, NULL))					throw DL_BadElement();				return params.ExponentiateElement(publicElement, privateExponent);			}			else			{				const Integer e[2] = {params.GetSubgroupOrder(), privateExponent};				Element r[2];				params.SimultaneousExponentiate(r, publicElement, e, 2);				if (!params.IsIdentity(r[0]))					throw DL_BadElement();				return r[1];			}		}	}};// ********************************************************//! A template implementing constructors for public key algorithm classestemplate <class BASE>class CRYPTOPP_NO_VTABLE PK_FinalTemplate : public BASE{public:	PK_FinalTemplate() {}	PK_FinalTemplate(const CryptoMaterial &key)		{this->AccessKey().AssignFrom(key);}	PK_FinalTemplate(BufferedTransformation &bt)		{this->AccessKey().BERDecode(bt);}	PK_FinalTemplate(const AsymmetricAlgorithm &algorithm)		{this->AccessKey().AssignFrom(algorithm.GetMaterial());}	PK_FinalTemplate(const Integer &v1)		{this->AccessKey().Initialize(v1);}#if (defined(_MSC_VER) && _MSC_VER < 1300)	template <class T1, class T2>	PK_FinalTemplate(T1 &v1, T2 &v2)		{this->AccessKey().Initialize(v1, v2);}	template <class T1, class T2, class T3>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3)		{this->AccessKey().Initialize(v1, v2, v3);}		template <class T1, class T2, class T3, class T4>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3, T4 &v4)		{this->AccessKey().Initialize(v1, v2, v3, v4);}	template <class T1, class T2, class T3, class T4, class T5>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3, T4 &v4, T5 &v5)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5);}	template <class T1, class T2, class T3, class T4, class T5, class T6>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3, T4 &v4, T5 &v5, T6 &v6)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3, T4 &v4, T5 &v5, T6 &v6, T7 &v7)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>	PK_FinalTemplate(T1 &v1, T2 &v2, T3 &v3, T4 &v4, T5 &v5, T6 &v6, T7 &v7, T8 &v8)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7, v8);}#else	template <class T1, class T2>	PK_FinalTemplate(const T1 &v1, const T2 &v2)		{this->AccessKey().Initialize(v1, v2);}	template <class T1, class T2, class T3>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3)		{this->AccessKey().Initialize(v1, v2, v3);}		template <class T1, class T2, class T3, class T4>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4)		{this->AccessKey().Initialize(v1, v2, v3, v4);}	template <class T1, class T2, class T3, class T4, class T5>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5);}	template <class T1, class T2, class T3, class T4, class T5, class T6>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>	PK_FinalTemplate(const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7, const T8 &v8)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7, v8);}	template <class T1, class T2>	PK_FinalTemplate(T1 &v1, const T2 &v2)		{this->AccessKey().Initialize(v1, v2);}	template <class T1, class T2, class T3>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3)		{this->AccessKey().Initialize(v1, v2, v3);}		template <class T1, class T2, class T3, class T4>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4)		{this->AccessKey().Initialize(v1, v2, v3, v4);}	template <class T1, class T2, class T3, class T4, class T5>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5);}	template <class T1, class T2, class T3, class T4, class T5, class T6>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7);}	template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>	PK_FinalTemplate(T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7, const T8 &v8)		{this->AccessKey().Initialize(v1, v2, v3, v4, v5, v6, v7, v8);}#endif};//! Base class for public key encryption standard classes. These classes are used to select from variants of algorithms. Note that not all standards apply to all algorithms.struct EncryptionStandard {};//! Base class for public key signature standard classes. These classes are used to select from variants of algorithms. Note that not all standards apply to all algorithms.struct SignatureStandard {};template <class STANDARD, class KEYS, class ALG_INFO>class TF_ES;//! Trapdoor Function Based Encryption Schemetemplate <class STANDARD, class KEYS, class ALG_INFO = TF_ES<STANDARD, KEYS, int> >class TF_ES : public KEYS{	typedef typename STANDARD::EncryptionMessageEncodingMethod MessageEncodingMethod;public:	//! see EncryptionStandard for a list of standards	typedef STANDARD Standard;	typedef TF_CryptoSchemeOptions<ALG_INFO, KEYS, MessageEncodingMethod> SchemeOptions;	static std::string CRYPTOPP_API StaticAlgorithmName() {return std::string(KEYS::StaticAlgorithmName()) + "/" + MessageEncodingMethod::StaticAlgorithmName();}	//! implements PK_Decryptor interface	typedef PK_FinalTemplate<TF_DecryptorImpl<SchemeOptions> > Decryptor;	//! implements PK_Encryptor interface	typedef PK_FinalTemplate<TF_EncryptorImpl<SchemeOptions> > Encryptor;};template <class STANDARD, class H, class KEYS, class ALG_INFO>	// VC60 workaround: doesn't work if KEYS is first parameterclass TF_SS;//! Trapdoor Function Based Signature Schemetemplate <class STANDARD, class H, class KEYS, class ALG_INFO = TF_SS<STANDARD, H, KEYS, int> >	// VC60 workaround: doesn't work if KEYS is first parameterclass TF_SS : public KEYS{public:	//! see SignatureStandard for a list of standards	typedef STANDARD Standard;	typedef typename Standard::SignatureMessageEncodingMethod MessageEncodingMethod;	typedef TF_SignatureSchemeOptions<ALG_INFO, KEYS, MessageEncodingMethod, H> SchemeOptions;	static std::string CRYPTOPP_API StaticAlgorithmName() {return std::string(KEYS::StaticAlgorithmName()) + "/" + MessageEncodingMethod::StaticAlgorithmName() + "(" + H::StaticAlgorithmName() + ")";}	//! implements PK_Signer interface	typedef PK_FinalTemplate<TF_SignerImpl<SchemeOptions> > Signer;	//! implements PK_Verifier interface	typedef PK_FinalTemplate<TF_VerifierImpl<SchemeOptions> > Verifier;};template <class KEYS, class SA, class MEM, class H, class ALG_INFO>class DL_SS;//! Discrete Log Based Signature Schemetemplate <class KEYS, class SA, class MEM, class H, class ALG_INFO = DL_SS<KEYS, SA, MEM, H, int> >class DL_SS : public KEYS{	typedef DL_SignatureSchemeOptions<ALG_INFO, KEYS, SA, MEM, H> SchemeOptions;public:	static std::string StaticAlgorithmName() {return SA::StaticAlgorithmName() + std::string("/EMSA1(") + H::StaticAlgorithmName() + ")";}	//! implements PK_Signer interface	typedef PK_FinalTemplate<DL_SignerImpl<SchemeOptions> > Signer;	//! implements PK_Verifier interface	typedef PK_FinalTemplate<DL_VerifierImpl<SchemeOptions> > Verifier;};//! Discrete Log Based Encryption Schemetemplate <class KEYS, class AA, class DA, class EA, class ALG_INFO>class DL_ES : public KEYS{	typedef DL_CryptoSchemeOptions<ALG_INFO, KEYS, AA, DA, EA> SchemeOptions;public:	//! implements PK_Decryptor interface	typedef PK_FinalTemplate<DL_DecryptorImpl<SchemeOptions> > Decryptor;	//! implements PK_Encryptor interface	typedef PK_FinalTemplate<DL_EncryptorImpl<SchemeOptions> > Encryptor;};NAMESPACE_END#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -