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

📄 ecc.c

📁 C语言实现的ecc加密算法
💻 C
字号:
#include "stdio.h"
#include "math.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)
	{
		printf("Please input a prime number: \n");
	    scanf("%d",&p);
    	printf("Please input the parameters:\n");
    	printf("  a=");
	    scanf("%d",&a);
	    printf("  b=");
	    scanf("%d",&b);
		if((4*a*a*a+27*b*b)%p) //4a^3+27b^2!=0 (mod p)
			flag1=1;
	}
	printf("now we have the ecc: E%d(%d,%d):y2=x3+%dx+%d\n",p,a,b,a,b);
}

void getG() //输入基点G的函数
{
	int flag2=0;
	int flag3=0;
	while(!flag2)
	{
		int left,right;
		while(!flag3)
		{
			printf("Please input the G(X,Y) 0=<X,Y<=p-1. \n");
			printf("  X=");
			scanf("%d",&G.X);
			printf("  Y=");
			scanf("%d",&G.Y);
			if((G.X>p-1)||(G.Y>p-1))
				printf("Invalid number, input again!\n");
			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 
		{
			printf("Not a pointer on the curve! Please input again!\n");
			flag3=0;
		}
	}
}


int getprikey() //输入私钥函数
{
	printf("Please input the private key: \n");
	scanf("%d",&prikey);
	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++;
		printf("%d\n",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,斜率公式不同
	{
	    int n;
		for(n=0; n<key-2; n++)
		{
			int flag4=0;
			numerator=Q.Y-P.Y;
			denominator=Q.X-P.X;
			printf("分子:%d\n",numerator);
			printf("分母:%d\n",denominator);
			if(((numerator>0)&&(denominator<0))||((numerator<0)&&(denominator>0))) //分子分母异号
				flag4=1; 
			if(denominator<0)
				denominator=-denominator;
				else if(denominator==0)
				printf("Sorry,the denominator=0.ERROR\n");
			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;
				printf("Q.X:%d\n",Q.X);
			Q.Y=(slope*(P.X-Q.X)-P.Y)%p;
			if(Q.Y<0)
				Q.Y=Q.Y+p;
				printf("Q.Y:%d\n",Q.Y);
		}
	}
	return Q;
}

	
int main(void) //主函数
{
	int k;
	struct pointer Q;
	printf("    ******************************************************\n");
	printf("    *       ECC key generator                            *\n");
	printf("    * FROM: TongJi University                            *\n");
    printf("    *       The Computer Sciense of the year of 02       *\n");
    printf("    *       方文鑫(020843)                             *\n");
    printf("    *       Thank you!                                   *\n");
    printf("    ******************************************************\n");
    printf("\n");
    printf("      Press the key e to exit.\n");
    while(getch()!='e')
    {
	getparameter();
	getG();
	k=getprikey();
    Q=getpubkey(k, G);
	printf("The public key Q is:%d,%d\n",Q.X,Q.Y);
	printf("Please press any key to continue.(except the key e)\n");
    }	

}

/*a=1,b=6,x=3,y=6*/ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -