根据 中的点 恢复 是困难的,即 是困难的,我们将在下一节讨论其困难性。然而,为了在密码学中更好的使用功能。
我们需要一个高效的根据 和 就能计算点 的方法。如果 很大,我们可不想一步一步的计算
其实高效的计算 的方法同我们在 1.3.2 一节介绍的计算幂次 一样。然而,因为在椭圆曲线密码系统中的运算是“加法”而不是“乘法”,所以在这里我们将这个算法称为 “Double and Add” 而不是原来的 “Square and multiply”。
但他们的底层思想还是一样的,首先我们将 进行 2 元展开:
这些点都是 的 2 的幂次倍,计算它们需要 次加倍。最后我们计算 只需要最多 次加法。
我们记在 中两个点的加法为一次“点加”,那么计算 最多只需要在 下进行 次“点加”。注意 ,所以计算 最多只需要 次 “点加”。这样即使是很大的 我们也能够快速的计算 了。我们将 “Double and Add” 算法的流程总结为表 6.3
例 6.16 我们使用“Double and Add” 算法计算 下的 , 其中
然后根据步骤计算,我们一共需要 9 次加倍 和 6 次加法,如表 6.4 所示。最后我们得到 。(表6.4中的 表示在表 6.3 中使用的 )
注:在计算 的时候还有一个额外的技巧可以稍微减少计算时间。基础想法是将 表示为 2 的幂次和与差,这样操作能够减少项数,在计算 的时候只用加更少的点。而一个重要的关键是在椭圆曲线中,减去一个点和加上一个点是一样容易的,因为 。这和在 中可相差甚远,因为在 下计算 需要的操作比计算两个元素相乘要麻烦的多。
举个例子,就拿例 6.16 中的 来说,,计算 一共需要 15 次“点加”(9次加倍,6次加法)但是如果我们把 947 表示为
那么我们可以计算
只需要 10 次加倍和 4 次加法总共 14 次”点加“。将一个数展开为正的 2 幂次和负的 2 幂次之和的技术称为 n 的 3 元展开。
这样的技术能够节省多少操作呢?假设 是一个很大的数,我们设 ,在极端的情况下 ,那么使用二元展开的 计算 需要 次“点加”( 次加倍和 次加法),因为
但是如果我们使用 3 元展开,我们在接下来会证明(命题 6.18)计算 只需要不超过 次“点加” ( 次加倍和 次加法)
上面考虑的是最极端的情况,但我们也需要知道平均情况下其表现如何。对一个随机数进行二元展开那么大约会有同样数量的 0 和 1,所以对于大多数的 ,通过二元展开计算 大约需要 次“点加” ( 次加倍和 次加法)。但是如果我们使用 3 元展开,可以测试的是大多数 展开后有 的项是 0,所以计算 大约只需要 次“点加” ( 次加倍和 次加法)
命题 6.18 设有正整数 ,,即 ,那么我们可以记

我们从做往右进行遍历,寻找两个或多个非 0 的 ,比如假设
(6.6)2s+ss+1+⋯+2s+t−1+0⋅2s+t
重复这个步骤,我们最后就可以把 展开为式 6.5,其中不存在两个连续的非零项。(注意到原来的二元展开最后一项只会是 ,但是新的展开可能会是 。)
原文始发于微信公众号(山石网科安全技术研究院):密码学 | 6.3.1 二重加法算法