密码学 | 6.3.1 二重加法算法

密码学 1年前 (2023) admin
299 0 0

根据  中的点  恢复  是困难的,即  是困难的,我们将在下一节讨论其困难性。然而,为了在密码学中更好的使用功能。

我们需要一个高效的根据  和  就能计算点  的方法。如果  很大,我们可不想一步一步的计算 
其实高效的计算  的方法同我们在 1.3.2 一节介绍的计算幂次  一样。然而,因为在椭圆曲线密码系统中的运算是“加法”而不是“乘法”,所以在这里我们将这个算法称为 “Double and Add” 而不是原来的 “Square and multiply”。
但他们的底层思想还是一样的,首先我们将  进行 2 元展开:

(我们知道 )然后我们计算

注意到  只是简单的前面  的两倍,所以有

这些点都是  的 2 的幂次倍,计算它们需要  次加倍。最后我们计算  只需要最多  次加法。

我们记在  中两个点的加法为一次“点加”,那么计算  最多只需要在   下进行  次“点加”。注意 ,所以计算  最多只需要  次 “点加”。这样即使是很大的  我们也能够快速的计算 了。我们将 “Double and Add” 算法的流程总结为表 6.3
密码学 | 6.3.1 二重加法算法
例 6.16 我们使用“Double and Add” 算法计算 下的 , 其中

 的 2 元展开为

然后根据步骤计算,我们一共需要 9 次加倍 和 6 次加法,如表 6.4 所示。最后我们得到 。(表6.4中的  表示在表 6.3 中使用的 
密码学 | 6.3.1 二重加法算法

注:在计算  的时候还有一个额外的技巧可以稍微减少计算时间。基础想法是将  表示为 2 的幂次和与差,这样操作能够减少项数,在计算  的时候只用加更少的点。而一个重要的关键是在椭圆曲线中,减去一个点和加上一个点是一样容易的,因为 。这和在  中可相差甚远,因为在  下计算  需要的操作比计算两个元素相乘要麻烦的多。

举个例子,就拿例 6.16 中的  来说,,计算  一共需要 15 次“点加”(9次加倍,6次加法)但是如果我们把 947 表示为

那么我们可以计算

只需要 10 次加倍和 4 次加法总共 14 次”点加“。将一个数展开为正的 2 幂次和负的 2 幂次之和的技术称为 n 的 3 元展开

这样的技术能够节省多少操作呢?假设  是一个很大的数,我们设 ,在极端的情况下 ,那么使用二元展开的  计算  需要  次“点加”( 次加倍和  次加法),因为

但是如果我们使用 3 元展开,我们在接下来会证明(命题 6.18)计算  只需要不超过  次“点加” ( 次加倍和  次加法)

上面考虑的是最极端的情况,但我们也需要知道平均情况下其表现如何。对一个随机数进行二元展开那么大约会有同样数量的 0 和 1,所以对于大多数的 ,通过二元展开计算  大约需要  次“点加” ( 次加倍和  次加法)。但是如果我们使用 3 元展开,可以测试的是大多数  展开后有  的项是 0,所以计算  大约只需要  次“点加” ( 次加倍和  次加法)

命题 6.18 设有正整数  ,,即 ,那么我们可以记

密码学 | 6.3.1 二重加法算法

其中 ,并且  中至多有  个 元素不为 0。
证明:我们首先将  进行 2 元展开

我们从做往右进行遍历,寻找两个或多个非 0 的  ,比如假设

其中 ,也即  的 2 元展开后有

(6.6)2s+ss+1++2s+t1+02s+t

上式可以进行简化:

于是我们可以把式 6.6 化为

重复这个步骤,我们最后就可以把  展开为式 6.5,其中不存在两个连续的非零项。(注意到原来的二元展开最后一项只会是 ,但是新的展开可能会是 。)
       

原文始发于微信公众号(山石网科安全技术研究院):密码学 | 6.3.1 二重加法算法

版权声明:admin 发表于 2023年4月27日 上午10:22。
转载请注明:密码学 | 6.3.1 二重加法算法 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...