C语言中带奇迹库的ECC加密
我想用C语言中的miracle库来模拟一些算法。这些算法是不同坐标系下的ECC加密。我有两个算法,应该给我相同的输出。但我不知道为什么我不能得到它。这是我想要模拟的算法: 我的模拟应该给我相同的代码输出:C语言中带奇迹库的ECC加密,c,algorithm,encryption,cryptography,elliptic-curve,C,Algorithm,Encryption,Cryptography,Elliptic Curve,我想用C语言中的miracle库来模拟一些算法。这些算法是不同坐标系下的ECC加密。我有两个算法,应该给我相同的输出。但我不知道为什么我不能得到它。这是我想要模拟的算法: 我的模拟应该给我相同的代码输出: fp=fopen("common.ecs","rt"); fscanf(fp,"%d\n",&bits); mip->IOBASE=16; cinnum(n,fp); cinnum(a,fp); cinnum(b,fp); cinnum(r,fp); cinnum(x,fp)
fp=fopen("common.ecs","rt");
fscanf(fp,"%d\n",&bits);
mip->IOBASE=16;
cinnum(n,fp);
cinnum(a,fp);
cinnum(b,fp);
cinnum(r,fp);
cinnum(x,fp);
cinnum(y,fp);
mip->IOBASE=16;
printf("modulus is %d bits in length\n",logb2(n));
window = 8 ;
nb = bits ;
ebrick_init(&binst,x,y,a,b,n,window,nb);
printf("%d elliptic curve points have been precomputed and stored\n",(1<< window));
e = mirvar(2) ;
printf("--------------------\n");
printf("naive method\n");
ecurve_init(a,b,n,MR_AFFINE);
g = epoint_init();
p = epoint_init();
q = epoint_init();
epoint_set(x,y,0,g);
ecurve_mult(e,g,q);
epoint_get(q,x_calc,y_calc);
cotnum(x_calc,stdout);
cotnum(y_calc,stdout);
printf("--------------------\n");
fp=fopen(“common.ecs”、“rt”);
fscanf(fp、%d\n、&bit);
mip->IOBASE=16;
cinnum(n,fp);
cinnum(a,fp);
cinnum(b,fp);
cinnum(r,fp);
cinnum(x,fp);
cinnum(y,fp);
mip->IOBASE=16;
printf(“模数长度为%d位,\n”,logb2(n));
窗口=8;
nb=位;
ebrick_init(&binst,x,y,a,b,n,window,nb);
printf(“%d个椭圆曲线点已预计算并存储”;(1您可以在FIPS的规范pdf上进行验证
common.ecs中的曲线是NISTP 192曲线
实际上,您已经猜到第一个参数是我们使用的素数模的位大小。第二行对应于十六进制表示的素数模p(它对应于素数2^192-2^64-1)。第三行是曲线Weierstrass方程中的系数A,它加速计算,使A=-3模p(参见示例)。第四行是曲线Weierstrass方程中的系数B,以十六进制表示。您可以看到第四行中的数字非常接近(以十六进制表示)对于p模的直线,它是曲线(点组)的顺序(有哈斯定理来解释这一点(你可以找到它))。第五条直线是曲线点组的点生成器的x坐标(十六进制)。第六条直线是y坐标(十六进制)曲线点组的点生成器。此站点现在不允许我放图片。请耐心等待,直到我这样做:)从仿射到投影:(x,y)->(x,y,1)。从投影到仿射:(x,y,z)->(x/z^2,y/z^3),只要z!=0。@GregS我这样做了,但我的代码不起作用:(