资源简介
在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
相关资源
- C++ Qt5实现RSA加解密
- 软件学院密码学实验四RSA
- rsa MFC实现源码
- linux下C语言从N模数、E公钥指数、D私
- MFC有界面RSA加密解密算法实现
- RSA加密算法的C语言实现
- RSA算法C语言实现.zip
- 字符串的RSA加密与解密 c语言实现
- RSA数字签名程序(C++实现)
- 椭圆曲线ECC基本参数的生成(C++)
- ecc检验原理和算法的C语言设计
- 密码学基于RCB和CBC的RSA实现(c++)
- rsa基于openssl1.1 实现签名(rsasign.cpp)
- RSA数字签名算法实现
- RSA KEY生成 C语言代码
- RSA加密解密之Linux C语言版
- C++编写的 rsa数字签名 源代码
- 用C实现的RSA加解密文本文件
- RSA 加密工具 Version 1.0支持文件、文本
- 生成RSA密钥对(修正版)
- 密码学编程c++代码
- 基于rsa数字签名c++实现
- rsa加密算法 c语言实现
- 分解大整数
- rsa加密算法c语言源码已经测试验证
- sm2 签名验证 公钥机密私钥解密的实现
- c++ RSA公共密钥加密解密加实验报告
- C++实现RSA公钥私钥加密算法
- 大数实现的椭圆曲线ECC加解密算法
- SHA-3 加密算法C语言测试代码-基于Ke
评论
共有 条评论