我想使用 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);
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");
common.ecs 文件的内容是:
192
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-3
64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1 FFFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831 188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012 07192B95FFC8DA78631011ED6B24CDD573F977A11E794811
根据上面的代码,当我奇迹般地启动一条曲线时,这些点位于仿射坐标中。我应该首先在 Jacobian 坐标中更改它们,然后再执行下一步。我不知道如何将 affine point 更改为 Jacobian point 。 一个基本问题是我无法理解奇迹是如何用这段代码初始化曲线并给我加倍的。
如果我想在纸上执行这些步骤并比较我的结果,我该如何更改这些数字。我的意思是我可以用什么数字代替 common.ecs 中的这个数字?我希望我能比以前更多地解释我的问题。我很困惑:(
最佳答案
您可以在 FIPS 的规范 pdf 上验证 https://csrc.nist.gov/csrc/media/publications/fips/186/3/archive/2009-06-25/documents/fips_186-3.pdf common.ecs 中的曲线是 NISTP 192 曲线。
实际上,您已经猜到第一个参数是我们使用的素数模数的大小(以位为单位)。第二行对应十六进制表示的素数模p(对应素数2^192-2^64-1)。第三行是曲线的 Weierstrass 方程中的系数 A,它加速计算使 A=-3 模 p(参见示例 Guide to elliptic curve cryptography)。第四行是十六进制表示的曲线Weierstrass方程中的系数B。如您所见,第四行中的数字接近(以十六进制表示)p 模数的线,它是曲线(的点组)的顺序(有哈斯定理来解释这一点(你可以找到它 there ))。第五行是曲线点组的点生成器的 x 坐标(十六进制)。第六行是曲线点组的点生成器的y坐标(十六进制)。
关于c - 使用 C 中的 Miracle Library 进行 ECC 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359204/