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

📄 eccrypto.cpp

📁 lots Elliptic curve cryptography codes. Use Visual c++ to compile
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			"0000000000000000000000000000000000000000000000000000000000000007",			"0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",			1),		EcRecommendedParameters<ECP>(ASN1::secp128r1(),			"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",			"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",			"E87579C11079F43DD824993C2CEE5ED3",			"04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83",			"FFFFFFFE0000000075A30D1B9038A115",			1),		EcRecommendedParameters<ECP>(ASN1::secp128r2(),			"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",			"D6031998D1B3BBFEBF59CC9BBFF9AEE1",			"5EEEFCA380D02919DC2C6558BB6D8A5D",			"047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44",			"3FFFFFFF7FFFFFFFBE0024720613B5A3",			4),		EcRecommendedParameters<ECP>(ASN1::secp160r2(),			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",			"B4E134D3FB59EB8BAB57274904664D5AF50388BA",			"0452DCB034293A117E1F4FF11B30F7199D3144CE6DFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",			"0100000000000000000000351EE786A818F3A1A16B",			1),		EcRecommendedParameters<ECP>(ASN1::secp192k1(),			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",			"000000000000000000000000000000000000000000000000",			"000000000000000000000000000000000000000000000003",			"04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",			"FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",			1),		EcRecommendedParameters<ECP>(ASN1::secp224k1(),			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",			"00000000000000000000000000000000000000000000000000000000",			"00000000000000000000000000000000000000000000000000000005",			"04A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",			"010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",			1),		EcRecommendedParameters<ECP>(ASN1::secp224r1(),			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",			"B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",			"04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",			1),		EcRecommendedParameters<ECP>(ASN1::secp384r1(),			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",			"B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",			"04AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",			"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",			1),		EcRecommendedParameters<ECP>(ASN1::secp521r1(),			"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",			"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",			"0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",			"0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",			"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",			1),	};	begin = rec;	end = rec + sizeof(rec)/sizeof(rec[0]);}template <class EC> OID DL_GroupParameters_EC<EC>::GetNextRecommendedParametersOID(const OID &oid){	const EcRecommendedParameters<EllipticCurve> *begin, *end;	GetRecommendedParameters(begin, end);	const EcRecommendedParameters<EllipticCurve> *it = std::upper_bound(begin, end, oid, OIDLessThan());	return (it == end ? OID() : it->oid);}template <class EC> void DL_GroupParameters_EC<EC>::Initialize(const OID &oid){	const EcRecommendedParameters<EllipticCurve> *begin, *end;	GetRecommendedParameters(begin, end);	const EcRecommendedParameters<EllipticCurve> *it = std::lower_bound(begin, end, oid, OIDLessThan());	if (it == end || it->oid != oid)		throw UnknownOID();	const EcRecommendedParameters<EllipticCurve> &param = *it;	m_oid = oid;	std::auto_ptr<EllipticCurve> ec(param.NewEC());	this->m_groupPrecomputation.SetCurve(*ec);	StringSource ssG(param.g, true, new HexDecoder);	Element G;	bool result = GetCurve().DecodePoint(G, ssG, (size_t)ssG.MaxRetrievable());	SetSubgroupGenerator(G);	assert(result);	StringSource ssN(param.n, true, new HexDecoder);	m_n.Decode(ssN, (size_t)ssN.MaxRetrievable());	m_k = param.h;}template <class EC>bool DL_GroupParameters_EC<EC>::GetVoidValue(const char *name, const std::type_info &valueType, void *pValue) const{	if (strcmp(name, Name::GroupOID()) == 0)	{		if (m_oid.m_values.empty())			return false;		this->ThrowIfTypeMismatch(name, typeid(OID), valueType);		*reinterpret_cast<OID *>(pValue) = m_oid;		return true;	}	else		return GetValueHelper<DL_GroupParameters<Element> >(this, name, valueType, pValue).Assignable()			CRYPTOPP_GET_FUNCTION_ENTRY(Curve);}template <class EC>void DL_GroupParameters_EC<EC>::AssignFrom(const NameValuePairs &source){	OID oid;	if (source.GetValue(Name::GroupOID(), oid))		Initialize(oid);	else	{		EllipticCurve ec;		Point G;		Integer n;		source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::Curve(), ec);		source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::SubgroupGenerator(), G);		source.GetRequiredParameter("DL_GroupParameters_EC<EC>", Name::SubgroupOrder(), n);		Integer k = source.GetValueWithDefault(Name::Cofactor(), Integer::Zero());		Initialize(ec, G, n, k);	}}template <class EC>void DL_GroupParameters_EC<EC>::GenerateRandom(RandomNumberGenerator &rng, const NameValuePairs &alg){	try	{		AssignFrom(alg);	}	catch (InvalidArgument &)	{		throw NotImplemented("DL_GroupParameters_EC<EC>: curve generation is not implemented yet");	}}template <class EC>void DL_GroupParameters_EC<EC>::BERDecode(BufferedTransformation &bt){	byte b;	if (!bt.Peek(b))		BERDecodeError();	if (b == OBJECT_IDENTIFIER)		Initialize(OID(bt));	else	{		BERSequenceDecoder seq(bt);			word32 version;			BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);	// check version			EllipticCurve ec(seq);			Point G = ec.BERDecodePoint(seq);			Integer n(seq);			Integer k;			bool cofactorPresent = !seq.EndReached();			if (cofactorPresent)				k.BERDecode(seq);			else				k = Integer::Zero();		seq.MessageEnd();		Initialize(ec, G, n, k);	}}template <class EC>void DL_GroupParameters_EC<EC>::DEREncode(BufferedTransformation &bt) const{	if (m_encodeAsOID && !m_oid.m_values.empty())		m_oid.DEREncode(bt);	else	{		DERSequenceEncoder seq(bt);		DEREncodeUnsigned<word32>(seq, 1);	// version		GetCurve().DEREncode(seq);		GetCurve().DEREncodePoint(seq, this->GetSubgroupGenerator(), m_compress);		m_n.DEREncode(seq);		if (m_k.NotZero())			m_k.DEREncode(seq);		seq.MessageEnd();	}}template <class EC>Integer DL_GroupParameters_EC<EC>::GetCofactor() const{	if (!m_k)	{		Integer q = GetCurve().FieldSize();		Integer qSqrt = q.SquareRoot();		m_k = (q+2*qSqrt+1)/m_n;	}	return m_k;}template <class EC>Integer DL_GroupParameters_EC<EC>::ConvertElementToInteger(const Element &element) const{	return ConvertToInteger(element.x);};template <class EC>bool DL_GroupParameters_EC<EC>::ValidateGroup(RandomNumberGenerator &rng, unsigned int level) const{	bool pass = GetCurve().ValidateParameters(rng, level);	Integer q = GetCurve().FieldSize();	pass = pass && m_n!=q;	if (level >= 2)	{		Integer qSqrt = q.SquareRoot();		pass = pass && m_n>4*qSqrt;		pass = pass && VerifyPrime(rng, m_n, level-2);		pass = pass && (m_k.IsZero() || m_k == (q+2*qSqrt+1)/m_n);		pass = pass && CheckMOVCondition(q, m_n);	}	return pass;}template <class EC>bool DL_GroupParameters_EC<EC>::ValidateElement(unsigned int level, const Element &g, const DL_FixedBasePrecomputation<Element> *gpc) const{	bool pass = !IsIdentity(g) && GetCurve().VerifyPoint(g);	if (level >= 1)	{		if (gpc)			pass = pass && gpc->Exponentiate(this->GetGroupPrecomputation(), Integer::One()) == g;	}	if (level >= 2 && pass)	{		const Integer &q = GetSubgroupOrder();		Element gq = gpc ? gpc->Exponentiate(this->GetGroupPrecomputation(), q) : ExponentiateElement(g, q);		pass = pass && IsIdentity(gq);	}	return pass;}template <class EC>void DL_GroupParameters_EC<EC>::SimultaneousExponentiate(Element *results, const Element &base, const Integer *exponents, unsigned int exponentsCount) const{	GetCurve().SimultaneousMultiply(results, base, exponents, exponentsCount);}template <class EC>CPP_TYPENAME DL_GroupParameters_EC<EC>::Element DL_GroupParameters_EC<EC>::MultiplyElements(const Element &a, const Element &b) const{	return GetCurve().Add(a, b);}template <class EC>CPP_TYPENAME DL_GroupParameters_EC<EC>::Element DL_GroupParameters_EC<EC>::CascadeExponentiate(const Element &element1, const Integer &exponent1, const Element &element2, const Integer &exponent2) const{	return GetCurve().CascadeMultiply(exponent1, element1, exponent2, element2);}template <class EC>OID DL_GroupParameters_EC<EC>::GetAlgorithmID() const{	return ASN1::id_ecPublicKey();}// ******************************************************************template <class EC>void DL_PublicKey_EC<EC>::BERDecodePublicKey(BufferedTransformation &bt, bool parametersPresent, size_t size){	typename EC::Point P;	if (!this->GetGroupParameters().GetCurve().DecodePoint(P, bt, size))		BERDecodeError();	SetPublicElement(P);}template <class EC>void DL_PublicKey_EC<EC>::DEREncodePublicKey(BufferedTransformation &bt) const{	this->GetGroupParameters().GetCurve().EncodePoint(bt, this->GetPublicElement(), this->GetGroupParameters().GetPointCompression());}// ******************************************************************template <class EC>void DL_PrivateKey_EC<EC>::BERDecodePrivateKey(BufferedTransformation &bt, bool parametersPresent, size_t size){	BERSequenceDecoder seq(bt);		word32 version;		BERDecodeUnsigned<word32>(seq, version, INTEGER, 1, 1);	// check version		BERGeneralDecoder dec(seq, OCTET_STRING);		if (!dec.IsDefiniteLength())			BERDecodeError();		Integer x;		x.Decode(dec, (size_t)dec.RemainingLength());		dec.MessageEnd();		if (!parametersPresent && seq.PeekByte() != (CONTEXT_SPECIFIC | CONSTRUCTED | 0))			BERDecodeError();		if (!seq.EndReached() && seq.PeekByte() == (CONTEXT_SPECIFIC | CONSTRUCTED | 0))		{			BERGeneralDecoder parameters(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 0);			this->AccessGroupParameters().BERDecode(parameters);			parameters.MessageEnd();		}		if (!seq.EndReached())		{			// skip over the public element			SecByteBlock subjectPublicKey;			unsigned int unusedBits;			BERGeneralDecoder publicKey(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 1);			BERDecodeBitString(publicKey, subjectPublicKey, unusedBits);			publicKey.MessageEnd();			Element Q;			if (!(unusedBits == 0 && this->GetGroupParameters().GetCurve().DecodePoint(Q, subjectPublicKey, subjectPublicKey.size())))				BERDecodeError();		}	seq.MessageEnd();	this->SetPrivateExponent(x);}template <class EC>void DL_PrivateKey_EC<EC>::DEREncodePrivateKey(BufferedTransformation &bt) const{	DERSequenceEncoder privateKey(bt);		DEREncodeUnsigned<word32>(privateKey, 1);	// version		// SEC 1 ver 1.0 says privateKey (m_d) has the same length as order of the curve		// this will be changed to order of base point in a future version		this->GetPrivateExponent().DEREncodeAsOctetString(privateKey, this->GetGroupParameters().GetSubgroupOrder().ByteCount());	privateKey.MessageEnd();}NAMESPACE_END#endif

⌨️ 快捷键说明

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