⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecc.txt

📁 这是个密钥匙生成代码
💻 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 + -