• 大小: 9KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-21
  • 语言: C/C++
  • 标签: ECC  RSA  C++  教学  

资源简介

在QT环境下完成,不过可以轻易改成VC编译,因为使用的是纯C++ 只引用了iostream,十分干净,轻松编译 适合初学者学习

资源截图

代码片段和文件信息

#include “ecc.h“

long long int ecc::getMIM(long long int x long long int mod)//参考https://baike.baidu.com/item/乘法逆元/5831857?fr=aladdin
{
    long long int QX1X2X3Y1Y2Y3T1T2T3;
    X1 = 1;
    X2 = 0;
    X3 = mod;
    Y1 = 0;
    Y2 = 1;
    Y3 = (x%mod + mod) %mod;//获得正整数


    while(Y3 != 1){
        if(Y3 == 0)
        {
            //cout<<“wrong MIM!“<            throw 25112;
        }
        Q = X3 / Y3;
        T1 = X1 - Q * Y1;
        T2 = X2 - Q * Y2;
        T3 = X3 - Q * Y3;
        X1 = Y1;
        X2 = Y2;
        X3 = Y3;
        Y1 = T1;
        Y2 = T2;
        Y3 = T3;
    }
    return Y2;
}

point ecc::add(point pa point pb)//素域加法,相关可以查资料
{
    long long int kk;
    if(isEqual(papb))
        kk = ((3 * pa.x * pa.x + a) * getMIM(2* pa.y p)) % p ;
    //必须使用正整数。这里pa.y的值不能取0.当取0时,这就不能进行这个计算了,因为 pa = -pb了,则,应该进行一个判断。但是,这样的结果是 O,是不在椭圆曲线上的,不能进行输出的值。这里是有一个周期数在,对于容易一个基值的也就是先给出的A来说,它有一个周期n,使nA = O,而这里所有参数的选取值都小于n,使其不会达到O,保证了不会出错。
    else
        kk = (pb.y - pa.y) * getMIM(pb.x - pa.x  p) %p;
    point c;
    c.x = (kk*kk - pa.x -pb.x) %p;
    c.y = (kk * (pa.x - c.x) - pa.y)%p ;
    c.x = (c.x + p) %p;
    c.y = (c.y + p) %p;

    return c;
}

point ecc::mul(point b long long int n)//就是执行N遍素域加法
{
    point q = b;
    n = n -1;
    for(long long int i = 1 ; i < n;i++){
        q = add(qb) ;
    }
    return q;
}

bool ecc::isEqual(point pa point pb)
{
    return pa.x == pb.x && pa.y == pb.y;
}

point ecc::DCodePoint(twopoint t long long int kKey)//ElGamal的标准解密算法,使用私钥k才可以解密
{
    //cout<    point Z = mul(t.firstkKey);
    point c1k;
    c1k.x = Z.x;
    c1k.y = p-Z.y;
    point m;
    m = add(c1kt.second);
    return m;
}


twopoint ecc::ECodePoint(point m twopoint publicKey)//ElGamal的标准加密算法用公钥A,B加密
{
    point c1c2;
    c1 = mul(publicKey.firstr) ;
    point Y = mul(publicKey.secondr) ;
    c2 = add(mY);
    return twopoint(c1c2);
}



ecc::ecc()
{

}

void ecc::setEllipticParameter(long long int kSet long long int aSet long long int bSet long long int pSet long long int rSet)
{
    k = kSet;
    a = aSet;
    b = bSet;
    p = pSet;
    r = rSet;
}

void ecc::calKey(long long int x long long int y)
{
    A.x = x;
    A.y = y;
    B = mul(Ak);
}

void ecc::encode(char *in char *out long long int length twopoint publicKey)
{
    point M;
    twopoint C;
    for(long long int i =0; i < length;i++)
    {
        M.x = i+rand()%10;
        M.y = in[i];
        C = ECodePoint(MpublicKey);
        out[i*4+0] = (char)C.first.x;
        out[i*4+1] = (char)C.first.y;
        out[i*4+2] = (char)C.second.x;
        out[i*4+3] = (char)C.second.y;
    }
}

void ecc::decode(char *in char *out long long int length long long int kKey)
{
    point M;
    twopoint C;
    if(length%4 != 0)
    {
        cout<<“密文长度不是4的倍数,不合法。“<

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-06-26 02:02  ECCRSA\
     文件        3810  2019-06-26 02:01  ECCRSA\ecc.cpp
     文件        1993  2019-06-24 15:11  ECCRSA\ecc.h
     文件         181  2019-06-23 02:57  ECCRSA\ECCRSA.pro
     文件       24006  2019-06-26 02:02  ECCRSA\ECCRSA.pro.user
     文件       11339  2019-06-25 03:19  ECCRSA\main.cpp
     文件        1570  2019-06-23 22:37  ECCRSA\rsa.cpp
     文件        1046  2019-06-24 15:11  ECCRSA\rsa.h

评论

共有 条评论