📄 ecc.txt
字号:
#include "iostream.h"
struct pointer{
int X;
int Y;
}G;
int p; //所选择的质数
int a,b;
int prikey;//私钥
void getparameter() //输入p,a,b的函数
{
int flag1=0;
while(!flag1)
{
cout<<"Please input a prime number: "<<endl;
cin>>p;
cout<<"Please input the parameters(<"<<p<<"):"<<endl<<"a: ";
cin>>a;
cout<<"b: ";
cin>>b;
if((4*a*a*a+27*b*b)%p) //4a^3+27b^2!=0 (mod p)
flag1=1;
}
cout<<"now we have the ecc: E"<<p<<"("<<a<<","<<b<<"): y2=x3+"<<a<<"x+"<<b<<endl;
}
void getG() //输入基点G的函数
{
int flag2=0;
int flag3=0;
while(!flag2)
{
int left,right;
while(!flag3)
{
cout<<"Please input the G(0=<X,Y<=p-1="<<p-1<<")"<<endl<<"X="; //输入 G(X,Y) X,Y<=p-1
cin>>G.X;
cout<<"Y=";
cin>>G.Y;
if((G.X>p-1)||(G.Y>p-1))
cout<<"Invalid number, input again!"<<endl;
else
flag3=1;
}
left=((G.Y)*(G.Y))%p; // y^2=x^3+ax+b (mod p)
right=((G.X)*(G.X)*(G.X)+a*(G.X)+b)%p;
if(left==right)
flag2=1;
else
{
cout<<"Not a pointer on the curve! Please input again!"<<endl;
flag3=0;
}
}
}
int getprikey() //输入私钥函数
{
cout<<"Please input the private key: ";
cin>>prikey;
cout<<endl;
return prikey;
}
struct pointer getpubkey(int key, struct pointer P)//得到公钥的函数,以基点,私钥为参数返回公钥
{
int slope;//存放斜率
int numerator;//存放分子
int denominator;//存放分母
struct pointer Q;
key=prikey;
numerator=3*P.X*P.X+a;
denominator=2*P.Y;
int i=1;
while((denominator*i)%p!=1) //i为分母的逆元
{
i++;
}
slope=(numerator*i)%p;
Q=P;
Q.X=(slope*slope-P.X-Q.X)%p;
if(Q.X<0)
Q.X=Q.X+p;
Q.Y=(slope*(P.X-Q.X)-P.Y)%p;
if(Q.Y<0)
Q.Y=Q.Y+p;
if(key>2) //key>2后,P!=Q,斜率公式不同
{
for(int n=0; n<key-2; n++)
{
int flag4=0;
numerator=Q.Y-P.Y;
denominator=Q.X-P.X;
if(((numerator>0)&&(denominator<0))||((numerator<0)&&(denominator>0))) //分子分母异号
flag4=1;
if(denominator<0)
denominator=-denominator;
int m=1;
while((denominator*m)%p!=1) //m为分母的逆元
{
m++;
}
if(flag4==0)
{
if(numerator<0)
numerator=-numerator;
slope=(numerator*m)%p; //正数情况
}
else
{
if(numerator<0)
numerator=-numerator;
slope=(-numerator*m)%p+p;//负数情况
}
Q.X=(slope*slope-P.X-Q.X)%p;
if(Q.X<0)
Q.X=Q.X+p;
Q.Y=(slope*(P.X-Q.X)-P.Y)%p;
if(Q.Y<0)
Q.Y=Q.Y+p;
}
}
return Q;
}
void main() //主函数
{
int k;
struct pointer Q;
cout<<"ECC key generator"<<endl;
getparameter();
getG();
k=getprikey();
Q=getpubkey(k, G);
cout<<"The public key Q is ("<<Q.X<<","<<Q.Y<<")"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -