ECC算法与ECDSA签名、SM2签名、SM2加密、ElGamal加密的C/C++实现

一、原理

ECDSA

SM2

ElGamal

二、C/C++实现

头文件

POperation.h

#ifndef POPERATION_H
#define POPERATION_H

// 定义点的结构
typedef struct {
    long long x;
    long long y;
} Point;

// 定义椭圆曲线的结构
typedef struct {
    long long a, b; // 曲线参数 y^2 = x^3 + ax + b
    long long p;    // 有限域的素数
} EllipticCurve;

// 模逆运算的函数声明
long long mod_inverse(long long a, long long m);

// 点加运算的函数声明
Point point_add(Point P, Point Q, EllipticCurve ec);

// 点乘运算的函数声明
Point point_multiply(long long scalar, Point P, EllipticCurve ec);

#endif // POPERATION_H

ECDSA.h

#ifndef ECDSA_H
#define ECDSA_H

#include "POperation.h" // 包含 EllipticCurve 和 Point 结构的定义

// ECDSA签名函数声明
void ecdsa_sign(char* message, long long d, EllipticCurve ec, Point G, long long n, long long* r, long long* s);

// ECDSA验证函数声明
int ecdsa_verify(char* message, Point Q, EllipticCurve ec, Point G, long long n, long long r, long long s);

// 简单哈希函数声明
long long simple_hash(char* message);

#endif // ECDSA_H

ElGamal.h

#ifndef ELGAMAL_H
#define ELGAMAL_H

#include <gmpxx.h>
#include <vector>
#include <iostream>

// 检测原根
bool is_primitive_root(const mpz_class& g, const mpz_class& p);

// 生成大质数和其原根
void generate_prime_and_primitive_root(mpz_class& p, mpz_class& g);

// 生成公钥和私钥
void generate_keys(mpz_class& p, mpz_class& g, mpz_class& y, mpz_class& x);

// 加密
void encrypt(const mpz_class& p, const mpz_class& g, const mpz_class& y, const mpz_class& m, mpz_class& c1, mpz_class& c2);

// 解密
void decrypt(const mpz_class& p, const mpz_class& x, const mpz_class& c1, const mpz_class& c2, mpz_class& m);

#endif  // ELGAMAL_H

SM2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是巴巴布莱特呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值