我在网上找到了这个示例:


在由
$$ y ^ 2 = x ^ 3 + 9x + 17 \ quad \ text {over} \定义的椭圆曲线组中mathbb {F} _ {23},$$
$ Q =(4,5)$到基数$ P =(16,5)$的离散对数$ k $是多少?

一种找到k的(简单)方法是计算$ P $的倍数,直到找到$ Q $。
$ P $的前几个倍数是:

$ P =(16,5),2P =(20,20),3P =(14,14),4P =(19,20),5P =(13,10)$,
$ 6 P =(7,3),7P =(8,7),8P =(12,17),9P =(4,5)$

因为$ 9P =(4,5)= Q $,$ Q $与基数$ P $的离散对数为$ k = 9 $。


如何获得这些标量倍数?


$ P =(16,5),2P =(20,20), 3P =(14,14),4P =(19,20),5P =(13,10)$,
$ 6P =(7,3),7P =(8,7),8P =(12 ,17),9P =(4,5)$


如何检查$ 9·(16,5)=(4,5)$?

#1 楼

$ \ def \ dbl {\ mathrm {dbl}} $好的,让我们在mikeazo和雨披的答案之间做一个缺失的步骤。

我假设您已经阅读了mikeazo的答案,知道如何加和加倍。

现在,我们如何获得一个点的标量倍数?

一个简单的算法就是“双重加法”,它就是这样做的。 br />
在一个简单的示例中,我们有$ 5 = 4 + 1 = 2·2 + 1 $,因此$ 5·P =(2·2 + 1)·P = 2·2·P + P $。因此我们计算$ P→\ dbl(P)= 2·P→\ dbl(\ dbl(P))= 4·P→4·P + P = 5·P $。

您以$ 200 $为例,我们有$ 200 = 128 + 64 + 8 = 2 ^ 7 + 2 ^ 6 + 2 ^ 3 $,因此$ 200·P = 2 ^ 7·P + 2 ^ 6·P + 2 ^ 3 ·P $,可以计算为$ \ dbl(\ dbl(\ dbl(\ dbl(\ dbl(\ dbl(\ dbl(P))))))))+ \ dbl(\ dbl(\ dbl(\ dbl(\ dbl(\ dbl(P)))))+ \ dbl(\ dbl(\ dbl(P)))$。 (当然,您只计算一次公共子项。)或者,我们可以使用分布定律这样写:$ 200·P = 2·2·(2·2 ·2·(2·P + P)+ P)$。

(请注意,这里我们使用标量因子的二进制形式来决定何时添加和何时不添加。)

当$ d $具有二进制形式$ d_kd_ {k-1} \ dots d_1d_0 $(假设d_k = 1)时,这里有两种通用形式的$ d·P $算法:

从小端开始:

Q := 0
R := P
for i = 0 .. k:
   if(d_i = 1)
      Q = add(Q, R)
   R = double(R)
return Q


从大端开始:

Q := 0
for i = k ... 0:
   Q := double(Q)
   if(d_i = 1)
      Q := add(Q, P)
return Q


请注意,这实际上与用于模(或其他)乘幂运算的算法相同,只是使用平方运算和乘法运算(然后通常称为平方乘运算)。

此外,如果在智能卡上实施,则这种微不足道的实现方式很容易受到功耗分析攻击,因为加倍和加法使用的功率量不尽相同,仅在(通常是机密的)指数中设置了一点时,才执行此操作。有一些措施可以解决这个问题,而且点乘法算法也更有效-任何有关椭圆曲线的书都应提及其中一些。

评论


$ \ begingroup $
是的,这就是我想要的,所以您的意思是计算200P,首先将其转换为二进制以得到2 ^ 7 + 2 ^ 6 + 2 ^ 3,然后再形成dbl(dbl(dbl( dbl(dbl(dbl(dbl(P)))))))dbl(dbl(dbl(dbl(dbl(dbl(P))))))dbl(dbl(dbl(P))),直到这一部分我能理解,谢谢您的示例,接下来我需要再次计算dbl(P)然后再计算dbl(dbl(P)),直到dbl(dbl(dbl(dbl(dbl(dbl(dbl(dbl(P)))))) )) 七次?
$ \ endgroup $
–刘思基(Keith Lau Si Keit)
2012年10月1日,凌晨3:02

$ \ begingroup $
抱歉,“加倍”数是您的二进制数的指数-对于$ 2 ^ 7·P $,您必须将$ P $加倍七次。
$ \ endgroup $
–PaŭloEbermann
2012年10月1日上午8:51

$ \ begingroup $
有一种叫方乘的方法可以用来解决问题吗?
$ \ endgroup $
–刘思基(Keith Lau Si Keit)
2012年10月2日,下午5:52

$ \ begingroup $
@KeithLauSiKeit:平方乘是“乘幂”算法(来自平方和乘法),您需要一个乘法算法(来自加法和加倍)。但是正如我提到的(我将进行更清晰的编辑),如果您交换操作的名称,则“双重加法”实际上与“平方乘”相同。
$ \ endgroup $
–PaŭloEbermann
2012年10月2日,下午16:53

#2 楼

在图形上,对于两个不同的点($ P + Q = R $),加法看起来像这样:



为了执行$ P + P = 2P $,您可以绘制与$ P $相切的线。找到它相交的位置,并围绕$ x $轴进行反射。像这样:



从数学上讲,这是通过找到与$ P $相切的线,相交的位置并反射约$ x $来完成的。诀窍是要记住在给定的字段中进行数学运算。

因此,在您的示例中,$ P $处的斜率切线为$ s =(3(16)^ 2 + 9)\ cdot (2 \ cdot 5)^ {-1} \ bmod {23} = 11 $。 $ 2P $的$ x $坐标为$ s ^ 2-2(16)\ bmod {23} = 20 $。

$ y $坐标为$ -5 + s \ cdot( 16-20)\ bmod {23} = 20 $。

可以在此处找到一个很好的小程序,以查看发生了什么。一旦拥有2P,则添加P以获得3P,依此类推。

评论


$ \ begingroup $
我知道如何计算2P,但是如果说k大则表示200P?
$ \ endgroup $
–刘思基(Keith Lau Si Keit)
2012年9月29日下午16:01

$ \ begingroup $
太好了!但是我仍然对这一点加法/乘法感到困惑。 2P + 2P = 3P + P = 4P吗?还是只有一种方法可以计算任何特定点?
$ \ endgroup $
–notthetup
2012年11月1日,11:30

$ \ begingroup $
$ 2P + 2P = 3P + P = 4P $是正确的。
$ \ endgroup $
– Mikeikeazo
2012年11月1日上午11:56

$ \ begingroup $
您使用什么软件绘制地图?非常漂亮
$ \ endgroup $
– T.B
2014年9月8日9:17



$ \ begingroup $
他的出处:infosecwriters.com/text_resources/pdf/…(据我所知,他没有写任何评论)。
$ \ endgroup $
–杰夫
18-3-25在22:27



#3 楼

您要问的还不清楚。是否做点加法(麦克对此进行了介绍),如何进行标量点乘法(例如,如何计算9G = G + G + G + G + G + G + G + G + G + G)或如何计算离散量对数(例如,给定点G和Q,求k使得kG = Q)。如果您要问后者,我的回答是适用的。

一种简单易懂的方法来计算$ O(\ sqrt {N})$时间中的离散日志是Big-Step-Little-步。在这种情况下,它的工作方式如下。

我们知道,这条特殊的曲线上有32个点(计算无穷远处的点)。如果我们使用的是逼真的尺寸的曲线(而不是这个玩具示例),则可以通过点计数算法知道这一点。

现在,如果曲线上的点数是平滑的(即,由小因素组成),有相当有效的方法来计算离散日志;我们绝不使用具有平滑组序的椭圆曲线,特别是因为它们在密码学上较弱。因此,我将忽略这些方法,并讨论适用于所有曲线的方法。

因此,我们知道离散对数是介于0到31之间的值。我们选择bigstep $ b \ approx \ sqrt {32} $;我们将选择值6。

因此,我们计算出较大的步长,计算各种整数$ i $的$ 6iG $,直到$ 6i \ ge 31 $:

$ 0G = 0 $

$ 6G =(7,3)$

$ 12G =(18,10)$

$ 18G = (10,16)$

$ 24G =(12,6)$

$ 30G =(20,3)$

然后,我们计算出一些小步骤,即$ Q-iG $ of $ 0 \ le i
$ Q-0G =(4,5)$

$ Q-1G =(12,17)$

$ Q-2G =(8,7)$

$ Q-3G =(7,3)$

$ Q-4G =(13,10)$

$ Q-5G =(19,20)$

然后,我们扫描两个列出要搜索的共同点。在这里我们看到$ 6G $和$ Q-3G $都是点$(7,3)$,因此$ 6G = Q-3G $或$ Q = 9G $

现在,在这个玩具示例中,这实际上比幼稚的方法要完成的工作更多。但是,如果我们扩大组的规模,我们很快就会达到严格限制此方法的地步。

评论


$ \ begingroup $
我不明白如何做上面例子中所说的标量乘法,P =(16,5)我知道使用加倍来获得2P值。但是在进行加密时,给定随机值k表示200,如何计算kP =(x,y)。像您的示例一样,您是如何获得全部(7,3)(18,10)(10,16)的……这是我不知道的部分。
$ \ endgroup $
–刘思基(Keith Lau Si Keit)
2012年9月30日上午11:01

#4 楼

我对所有事物的混合感到惊讶。简单的问题是:如何获得200P。
有一个非常古老的二进制算法,可以用不同的方式使用


double and add:这是乘法
平方并乘:这是幂运算
平方并加:这是在分形中众所周知的曼德罗序列。或进行梅森数初等性检验的技巧。
除并加:这是线性逆同余生成器。
依此类推,列表是无限的。

这两个操作加在一起的逻辑总是相同的,并且几何构造至少有2000年的历史。

200 = 128 + 64 + 8 =(2 +1)* 64 + 8 =((2 + 1)* 8 +1)* 8

从左到右运行它

用于乘法

200 * x =((2 * x + x)* 2 * 2 * 2 + x)* 2 * 2 * 2

这是序列dbl,add,dbl,dbl,dbl,add,dbl,dbl,dbl。

求幂(**是提高幂的符号)

x ** 200 =((x ** 2 * x)** 2 * * 2 ** 2 * x)** 2 ** 2 ** 2

这是序列squ,mul,squ,squ,squ,mul,squ,squ,squ。完成。

等等。

在任何字段,环,组...中,您可以定义运算符和元素,例如乘法,加法,恒等,... 。这对椭圆曲线上的点有效,您可以将它们彼此添加。向自身添加点是一种加倍操作。然后您需要使用具有2000年历史的二进制技巧来从double中创建乘法并加法。

评论


$ \ begingroup $
嗯,“双加”和“平方与乘”是两种同时表达的方式。另外,什么是“ mandelbrot序列”或“除法加法”(至少在使用组运算方面?)。
$ \ endgroup $
–雨披
2014年7月15日17:00