密码学六:ECC算法

结果截图:
在这里插入图片描述
代码实现:

#include <iostream>
#define Ea 20
#define Eb 4
#define Ep 29
using namespace std;
int fast_pow(int a, int b, int c)
{
    int ans = 1;   ///记录结果
    a = a % c;   ///预处理,使得a处于c的数据范围之下
    while (b != 0)
    {
        if (b & 1)///奇数
        {
            ans = (ans * a) % c;///消除指数为奇数的影响
        }
        b >>= 1;    ///二进制的移位操作,不断的遍历b的二进制位
        a = (a * a) % c;   ///不断的加倍
    }
    return ans;
}
struct point {
    int x;
    int y;
    point():x(0),y(0){}
    point(int a, int b):x(a),y(b) { }
    bool operator==(const point& b) {
        return this->x == b.x && this->y == b.y;
    }
    point operator+(const point& b) {
        point result;
        if (*this == b) {
            long aaa = 3 * this->x * this->x + Ea;
            long bbb = 2 * this->y;
            //int m = (3 * this->x * this->x + Ea) / (2 * this->y) mod Ep;
            long m;
            if (aaa % bbb != 0) {
                m = ((aaa % Ep) * fast_pow(bbb, (Ep - 2), Ep)) % Ep;
            }
            else {
                m = (aaa / bbb) % Ep;
            }
            result.x = (m * m - 2 * this->x) % Ep;
            result.y = (m * (this->x - result.x) - this->y) % Ep;  
        }
        else {
            long aaa = b.y - this->y;
            long bbb = b.x - this->x;
            if (bbb == 0) {
                return point(13, 23);
            }
            long m;
            if (aaa % bbb != 0) {
                m = ((aaa % Ep) * fast_pow(bbb, (Ep - 2), Ep)) % Ep;
            }
            else {
                m = (aaa / bbb) % Ep;
            }
            result.x = (m * m - this->x - b.x) % Ep;
            result.y = (m * (this->x - result.x) - this->y) % Ep;
        }
        if (result.x < 0) {
            result.x += Ep;
        }
        if (result.y < 0) {
            result.y += Ep;
        }
        return result;
    }
    point operator-() {
        this->y = Ep - this->y;
        return *this;
    }
};
void getG(point x,int& G) {
    point Gx = x;
    G = 1;
    int num = 0;
    do{
        cout<<G<<"x:" << Gx.x << " " << Gx.y << endl;
        Gx = Gx + x;
        G++;
    } while (Gx.x != x.x);
    G++;
    cout << G << "x:" << Gx.x << " " << Gx.y << endl;
}
point getNG(point x,int n) {
    point result = x;
    for (int i = 1; i < n; ++i) {
        result = result + x;
    }

    return result;
}
void print(point p) {
    cout << "[" << " " << p.x << "," << p.y << " " << "]" << endl;
}
int main()
{
    //Alice
    //椭圆曲线 E29(20,4) 基点(13,23)
    //第一步,计算椭圆曲线的阶数
    int G;
    point* x=new point(13, 23);
    getG(*x, G);
    cout << "阶数为:" << G << endl;
    //求得G=36
    //第二步,选择一个私有密钥p(p<G)
    int p =25;
    //第三步,公开密钥K=p*(13,23)
    point K = getNG(*x, p);
    //将 曲线 基点 密钥 公开
    cout << "公开密钥:"<< endl;
    print(K);
    //Bob
    //第四步,需要加密的信息msg,并将msg按照某种编码方式编码到曲线上一点M
    int msg = 13;
    cout << "需要加密的信息:" << msg << endl;;
    point M(13,23);

    //第五步,产生一个随机数r<G
    //srand(unsigned(time(NULL)));
    int r = 6;
    //第六步,计算c1=M+r*K
    //           c2=r*(13,23)
    //(c1,c2)
    point c1 = M;
    for (int i = 0; i < r; ++i) {
        c1 = c1 + K;
    }
    point c2=*x;
    for (int i = 1; i < r; ++i) {
        c2 = c2 + *x;
    }
    cout << "密文为:" << endl;;
    print(c1);
    print(c2);

    //Alice解密
    //第七步:计算c1-p*c2
    point c3;
    point c4=*x;
    p = p*r % G;
    for (int i = 1; i < p; ++i) {
        c4 = c4 + *x;
    }
    c3 = c1 + (-c4);
    cout << "明文为:" << c3.x << endl;
    return 0;
}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

5436649486

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

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

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

打赏作者

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

抵扣说明:

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

余额充值