📄 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 + -