/* sample of Elliptic Curve Diffie-Hellman key sharing */ #include #include #include #include #include #include #include #include typedef mcl::FpT<> Fp; struct ZnTag; typedef mcl::EcT Ec; typedef mcl::FpT Zn; int main() { cybozu::RandomGenerator rg; /* system setup with a parameter secp192k1 recommended by SECG Ec is an elliptic curve over Fp the cyclic group of

is isomorphic to Zn */ const mcl::EcParam& para = mcl::ecparam::secp192k1; Zn::setModulo(para.n); Fp::setModulo(para.p); Ec::setParam(para.a, para.b); const Ec P(Fp(para.gx), Fp(para.gy)); /* Alice setups a private key a and public key aP */ Zn a; Ec aP; a.setRand(rg); Ec::power(aP, P, a); // aP = a * P; std::cout << "aP=" << aP << std::endl; /* Bob setups a private key b and public key bP */ Zn b; Ec bP; b.setRand(rg); Ec::power(bP, P, b); // bP = b * P; std::cout << "bP=" << bP << std::endl; Ec abP, baP; // Alice uses bP(B's public key) and a(A's priavte key) Ec::power(abP, bP, a); // abP = a * (bP) // Bob uses aP(A's public key) and b(B's private key) Ec::power(baP, aP, b); // baP = b * (aP) if (abP == baP) { std::cout << "key sharing succeed:" << abP << std::endl; } else { std::cout << "ERR(not here)" << std::endl; } }