c++不用gmp库实现ecc加法数据由键盘输入
时间: 2024-02-22 15:58:24 浏览: 92
C# 调用 C++ 动态库并调用自身注册到动态库的函数
下面是不用 GMP 库实现 ECC 加法并从键盘输入数据的代码示例:
```c++
#include <iostream>
// 定义椭圆曲线参数
const int a = 2;
const int b = 3;
const int p = 17;
// 定义点结构体
struct Point {
int x;
int y;
};
// 定义求模逆元函数
int mod_inv(int a, int m) {
int m0 = m, t, q;
int x0 = 0, x1 = 1;
if (m == 1) {
return 0;
}
while (a > 1) {
q = a / m;
t = m;
m = a % m;
a = t;
t = x0;
x0 = x1 - q * x0;
x1 = t;
}
if (x1 < 0) {
x1 += m0;
}
return x1;
}
// 定义ECC加法函数
Point add(Point p1, Point p2) {
Point p3;
int lambda;
// 判断是否为同一点
if (p1.x == p2.x && p1.y == p2.y) {
lambda = ((3 * p1.x * p1.x + a) * mod_inv(2 * p1.y, p)) % p;
} else {
lambda = ((p2.y - p1.y) * mod_inv(p2.x - p1.x, p)) % p;
}
// 计算新的点坐标
p3.x = (lambda * lambda - p1.x - p2.x) % p;
p3.y = (lambda * (p1.x - p3.x) - p1.y) % p;
return p3;
}
int main() {
// 定义两个点
Point p1, p2;
// 从键盘输入点坐标
std::cout << "Input Point 1 (x, y): ";
std::cin >> p1.x >> p1.y;
std::cout << "Input Point 2 (x, y): ";
std::cin >> p2.x >> p2.y;
// 计算相加结果
Point p3 = add(p1, p2);
// 输出结果
std::cout << "(" << p3.x << ", " << p3.y << ")" << std::endl;
return 0;
}
```
在上面的代码中,我们定义了一个椭圆曲线参数和一个点结构体。然后定义了一个求模逆元函数mod_inv(),用于计算斜率的倒数。在add()函数中,我们首先判断两个点是否为同一点,如果是,则计算斜率lambda,否则计算lambda'。最后根据lambda或lambda'计算新的点坐标。我们在主函数中定义两个点并从键盘输入它们的坐标,然后调用add()函数计算它们的相加结果,最后输出结果。
阅读全文