Q5 ECC Without Library
Q5 ECC Without Library
#include <NTL/ZZ.h>
#include <NTL/ZZ_p.h>
struct Point {
ZZ_p x, y;
bool is_infinity = false;
Point() : is_infinity(true) {}
Point(ZZ_p x, ZZ_p y) : x(x), y(y), is_infinity(false) {}
};
// Scalar multiplication: k * P
Point scalar_mult(const ZZ& k, const Point& P, const ZZ_p& a) {
Point result; // Infinity
Point current = P;
ZZ n = k;
while (n > 0) {
if (n % 2 == 1) {
result = point_add(result, current, a);
}
current = point_add(current, current, a);
n /= 2;
}
return result;
}
int main() {
// Initialize finite field
ZZ p;
conv(p, PRIME_P);
ZZ_p::init(p);
// Base point G
ZZ_p gx, gy;
conv(gx, GX);
conv(gy, GY);
Point G(gx, gy);
// Decryption
Point kQ = scalar_mult(private_key, C1, a);
Point decrypted_message = point_add(C2, Point(kQ.x, -kQ.y), a);
cout << "Decrypted Message: (" << decrypted_message.x << ", " <<
decrypted_message.y << ")" << endl;
return 0;
}