我想在素数场上的椭圆曲线上进行点减法。我尝试将这些点减去(x,-y log(p))
,但我的答案似乎不匹配。
这就是我尝试进行减法的方法:
s9=point_addition(s6.a,s6.b,((s8.a)%211) ,-((s8.b)%211));
此处s9
,s6
和s8
都是包含两个int
的结构。
这是我的功能,它增加了点数:
structure point_addition(int x1, int y1, int x2, int y2)
{
int s,xL,yL;
if((x1-x2)!=0)
{
if ((((y1-y2)/(x1-x2)) % 211)>0)
s=(((y1-y2)/(x1-x2)) % 211);
else
s=(((y1-y2)/(x1-x2)) % 211) + 211;
if ((((s*s)-(x1+x2)) % 211)>0)
xL= (((s*s)-(x1+x2)) % 211) ;
else
xL= (((s*s)-(x1+x2)) % 211) + 211;
if(((-y1+s*(x1-x2)) % 211)>0)
yL= ((-y1+s*(x1-xL)) % 211);
else
yL= ((-y1+s*(x1-x2)) % 211) + 211;
}
else
{
xL= 198 ;
yL= 139;
}
s7.a= xL;
s7.b= yL;
return s7 ;
}
程序似乎没有给我正确的坐标请帮我用椭圆曲线加密编码。
答案 0 :(得分:2)
参见GregS关于分裂模式的评论。你需要找到分母的倒数然后乘以。要计算模逆,您可以使用扩展的欧几里德算法。
另外,你否定y坐标然后再添加211的方式有点奇怪。最好在传递参数时将字段元素保持在适当的范围内,例如要获得-y mod p,请使用p-y。
我认为这只是一个学习练习,因为你使用的是一个非常小的领域:)
答案 1 :(得分:1)
我完全不了解你在做什么,你的日志(p)应该是什么意思以及你的域名参数输入的地方,但减法很简单: 取消y坐标(-Y =模数-y),然后照常添加。
如果您想要计算参考,可以使用我的开源软件“学术签名” 来自this link 它的计算非常透明,并产生例如人类可读十六进制表示法中ECDSA签名的结果。我现在不确定,如果它可以用你正在使用的这么短的模数进行计算。
手册中包含有关如何正确编程ECC操作以及如何使用该软件的说明: Link to ecc Manual
此致 迈克尔安德斯