TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
ciphers::elliptic_curve_key_exchange Namespace Reference

namespace elliptic_curve_key_exchange More...

Classes

struct  Point
 Definition of struct Point. More...
 

Typedefs

typedef struct ciphers::elliptic_curve_key_exchange::Point Point
 Definition of struct Point.
 

Functions

uint256_t exp (uint256_t number, uint256_t power, const uint256_t &mod)
 This function calculates number raised to exponent power under modulo mod using Modular Exponentiation.
 
Point addition (Point a, Point b, const uint256_t &curve_a_coeff, uint256_t mod)
 Addition of points.
 
Point multiply (const Point &a, const uint256_t &curve_a_coeff, uint256_t p, const uint256_t &mod)
 multiply Point and integer
 

Detailed Description

namespace elliptic_curve_key_exchange

Demonstration of Elliptic Curve Diffie-Hellman key exchange.

Typedef Documentation

◆ Point

typedef struct ciphers::elliptic_curve_key_exchange::Point ciphers::elliptic_curve_key_exchange::Point

Definition of struct Point.

Definition of Point in the curve.

Function Documentation

◆ addition()

Point ciphers::elliptic_curve_key_exchange::addition ( Point a,
Point b,
const uint256_t & curve_a_coeff,
uint256_t mod )

Addition of points.

Add given point to generate third point. More description can be found here, and here

Parameters
aFirst point
bSecond point
curve_a_coeffCoefficient a of the given curve (y^2 = x^3 + ax + b) % mod
modGiven field
Returns
the resultant point

Slope

value zero

slope when the line is tangent to curve. This operation is performed while doubling. Taking derivative of y^2 = x^3 + ax + b => 2y dy = (3 * x^2 + a)dx => (dy/dx) = (3x^2 + a)/(2y)

if y co-ordinate is zero, the slope is infinite, return inf. else calculate the slope (here % mod and store in lambda)

Definition at line 110 of file elliptic_curve_key_exchange.cpp.

111 {
112 uint256_t lambda(0);
113 uint256_t zero(0);
114 lambda = zero = 0;
115 uint256_t inf = ~zero;
116 if (a.x != b.x || a.y != b.y) {
117 // Slope being infinite.
118 if (b.x == a.x) {
119 return {inf, inf};
120 }
121 uint256_t num = (b.y - a.y + mod), den = (b.x - a.x + mod);
122 lambda = (num * (exp(den, mod - 2, mod))) % mod;
123 } else {
134 if (!a.y) {
135 return {inf, inf};
136 }
137 uint256_t axsq = ((a.x * a.x)) % mod;
138 // Mulitply by 3 adjustment
139 axsq += (axsq << 1);
140 axsq %= mod;
141 // Mulitply by 2 adjustment
142 uint256_t a_2 = (a.y << 1);
143 lambda =
144 (((axsq + curve_a_coeff) % mod) * exp(a_2, mod - 2, mod)) % mod;
145 }
146 Point c;
147 // new point: x = ((lambda^2) - x1 - x2)
148 // y = (lambda * (x1 - x)) - y1
149 c.x = ((lambda * lambda) % mod + (mod << 1) - a.x - b.x) % mod;
150 c.y = (((lambda * (a.x + mod - c.x)) % mod) + mod - a.y) % mod;
151 return c;
152}
class for 256-bit unsigned integer
Definition uint256_t.hpp:33
uint256_t exp(uint256_t number, uint256_t power, const uint256_t &mod)
This function calculates number raised to exponent power under modulo mod using Modular Exponentiatio...
int y
Point respect to x coordinate.

◆ exp()

uint256_t ciphers::elliptic_curve_key_exchange::exp ( uint256_t number,
uint256_t power,
const uint256_t & mod )

This function calculates number raised to exponent power under modulo mod using Modular Exponentiation.

Parameters
numberinteger base
powerunsigned integer exponent
modinteger modulo
Returns
number raised to power modulo mod

Definition at line 78 of file elliptic_curve_key_exchange.cpp.

78 {
79 if (!power) {
80 return uint256_t(1);
81 }
82 uint256_t ans(1);
83 number = number % mod;
84 while (power) {
85 if ((power & 1)) {
86 ans = (ans * number) % mod;
87 }
88 power >>= 1;
89 if (power) {
90 number = (number * number) % mod;
91 }
92 }
93 return ans;
94}
void power(int x, int n)

◆ multiply()

Point ciphers::elliptic_curve_key_exchange::multiply ( const Point & a,
const uint256_t & curve_a_coeff,
uint256_t p,
const uint256_t & mod )

multiply Point and integer

Multiply Point by a scalar factor (here it is a private key p). The multiplication is called as double and add method

Parameters
aPoint to multiply
curve_a_coeffCoefficient of given curve (y^2 = x^3 + ax + b) % mod
pThe scalar value
modGiven field
Returns
the resultant point

Definition at line 165 of file elliptic_curve_key_exchange.cpp.

166 {
167 Point N = a;
168 N.x %= mod;
169 N.y %= mod;
170 uint256_t inf{};
171 inf = ~uint256_t(0);
172 Point Q = {inf, inf};
173 while (p) {
174 if ((p & 1)) {
175 if (Q.x == inf && Q.y == inf) {
176 Q.x = N.x;
177 Q.y = N.y;
178 } else {
179 Q = addition(Q, N, curve_a_coeff, mod);
180 }
181 }
182 p >>= 1;
183 if (p) {
184 N = addition(N, N, curve_a_coeff, mod);
185 }
186 }
187 return Q;
188}
Point addition(Point a, Point b, const uint256_t &curve_a_coeff, uint256_t mod)
Addition of points.
constexpr uint32_t N
A struct to represent sparse table for min() as their invariant function, for the given array A....