C语言中使用Miracle Library进行ECC加密

问题描述 投票:2回答:1

我想在C中使用奇迹库来模拟一些算法。这些算法是不同坐标的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

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF

-3

64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1 FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831 188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012 07192B95FFC8DA78631011ED6B24CDD573F977A11E794811

根据上面的代码,当我在奇迹中启动曲线时,点在仿射坐标中。我应该首先用雅可比坐标改变它们,然后再做下一步。我不知道如何改变雅各比点的仿射点。一个基本的问题是,我无法理解奇迹如何使用此代码初始化曲线并给我加倍。

如果我想在纸上执行步骤并比较我的结果,我该如何更改这些数字。我的意思是我可以在common.ecs中使用哪些数字代替这些数字?我希望我能比以前更多地解释我的问题。我很迷茫 :(

c algorithm encryption cryptography elliptic-curve
1个回答
0
投票

您可以在FIPS https://csrc.nist.gov/csrc/media/publications/fips/186/3/archive/2009-06-25/documents/fips_186-3.pdf的规范pdf上验证common.ecs中的曲线是NISTP 192曲线。

实际上,您已经猜到第一个参数是我们使用的质数模数的位大小。第二行对应于十六进制表示中的素数模数p(它对应于素数2 ^ 192-2 ^ 64-1)。第三行是曲线的Weierstrass方程中的系数A,它加速计算得到A = -3模p(参见例如Guide to elliptic curve cryptography)。第四行是十六进制曲线的Weierstrass方程中的系数B.你可以看到第四行中的数字是接近(以十六进制表示)到p模数的线,它是曲线的(点的组)的顺序(有Hasse定理来解释这个(你可以找到它there))。第五行是曲线点组的点生成器的x坐标(十六进制)。第六行是曲线点组的点生成器的y坐标(十六进制)。

© www.soinside.com 2019 - 2024. All rights reserved.