密码学系列| 3.5 Pollard’s − 1 分解算法

admin 2022年7月12日13:12:33评论165 views字数 2640阅读8分48秒阅读模式

3.5 Pollard’s  − 1 Factorization Algorithm

  在 3.4 一节中我们能够比较容易地去检测一个大数是否(可能)是素数。这很重要,因为 RSA 密码系统需要大素数才能操作下去。

  对于 RSA 来说,其安全性依赖于大数分解这一数学难题。而对因式分解的研究至少可以追溯到古希腊,但直到计算机的出现,人们才开始发明能够分解大数的算法。RSA 的悖论在于,为了使 RSA 更高效,我们希望使用一个尽可能小的模数 。另一方面,如果对手可以分解 ,那么我们的加密消息就不安全。因此,我们需要理解,或者尽可能量化大数分解的困难性,而其中的关键就是需要注意当前用于大数分解的不同算法的效率(算法复杂度)。

  在接下来的几节中,我们将不同程度地讨论一些已知的大整数分解方法。第 6.6 节描述了使用椭圆曲线的另一种方法。有兴趣研究这一主题的读者也可以查阅《A Course in Computational Algebraic Number Theory.》、《, Prime Numbers》、《Prime Numbers and Computer Methods for Factorization》、《Primality Testing and Integer Factorization in Public-Key Cryptography》以及这些作品中引用的参考文献。

  我们首先从 Pollard’s  − 1 算法开始。尽管这个方法并不适用于所有数字,但对于某些类型的数字,它是非常有效的。Pollard 的方法表明,存在乍一看似乎是安全,但实际上不安全的 RSA 模块,仅此一点就值得对Pollard 的方法进行研究。此外,Pollard’s  − 1方法为 Lenstra 的椭圆曲线因式分解方法提供了灵感,我们将在后面的第 6.6 节中研究该方法。

  现在我们有一个整数 ,我们的任务是分解整数  得到 。假设通过运气、努力或其他方法,我们找到了一个具有以下性质的整数 

  这意味着存在整数  以及  满足

  考虑一下如果我们随机选择一个整数  并计算  会发生什么?根据费马小定理,我们知道

  由于指数 ,所以  不太可能在模  下与 1 同余。因此随机选择一个整数 ,我们有很大的可能发现

  这就意味着我们用简单的 gcd 算法就可以分解出  来:

  这一切都很顺利,但你可能会问,我们在哪里可以找到这样一个指数 ,它可以被 整除,而不被  整除。Pollard 观察到,如果  是由一系列小素数乘积而来,那么它就能整除 (主要针对那些不太大的 ,否则也算不出它的阶乘)。那么想法出现,对于 ,我们随机选择一个整数 ,并计算

  (实际操作中我们通常简单的固定 )如果 gcd 算法的结果是1,那么我们继续用下一个 ,如果 gcd 的结果是 ,那么我们就不太幸运了,不过兴许换一个  就能够成功。如果我们得到了一个大于  小于  的整数,那么就意味着我们找到了  的一个非平凡因子,算法结束。

注 3.28 在我们准备用代码实现 Pollard 的想法之前,这里有两个需要注意的点。第一,我们需要关注  值的大小。尽管 ,我们也选一个大小适中的 ,我们直接计算  的值也是不太适合。因为  的十进制位长高达  ,这比宇宙中已知基本粒子的数量还要多。幸运的是,我们并不需要准确的计算出它,这里我们只关注  和  的最大公因子,因此计算  就足够了,然后我们再计算其与  的 gcd。因此我们实际上不需要处理比  大的数字。

第二,我们甚至不需要去计算指数 。假设我们在上一步已经计算好了 ,那么我们可以通过以下的式子计算下一个值

这引出了我们在表 3.3 中介绍的算法。

注 3.29 计算  需要多长的时间呢?我们在第 1.3.2 一节中给出的计算  的算法至多需要  步,其中每一步都是模  的乘法。根据 Stirling 公式,如果  比较大,那么 。所以我们可以在  步内计算出  。因此,即使  比较大,计算  也是可行的。

密码学系列| 3.5 Pollard’s  − 1 分解算法

Table 3.3: Pollard’s p − 1 factorization algorithm

例 3.30 我们使用 Pollard’s p−1 method 去分解 ,从  开始,然后连续增大指数,计算阶乘,我们发现

  从最后一行我们得到一个非平凡因子 ,是素数,另外一个因子 ,也是素数。

  之所以我们在  成功,是因为这里我们  可以分解为如下小素数的乘积:

  对于另外一个因子有 ,并不是由小(对于这里来说)因子乘积而来。

例 3.31 这里我们使用更大的数字,另 , 然后我们有

密码学系列| 3.5 Pollard’s  − 1 分解算法

所以使用  我们能够分解出  的因子 ,另外一个(素)因子为 480661,而  的小因子们为

注 3.32 注意到 Bob 和 Alice 在创建RSA密钥时很容易就能避免 Pollard’s  − 1方法。他们只需检查他们选择的秘密素数  和  ,是否满足  或者  能够完全分解为小素数的乘积这一性质。从密码学的角度来看,Pollard’s  − 1方法的重要性在于下面的一课。乍一看,大多数人不会想到  的因式分解性质会与分解  的难度有关。其寓意是,即使我们基于一个看似困难的问题(如整数分解)构建密码系统,我们也必须警惕这个问题的特殊情况,因为一些微妙和不那么明显的原因,这些问题比一般情况更容易解决。我们已经在离散对数问题的Pohlig–Hellman算法中看到了一个例子(第2.9节),稍后我们将在讨论椭圆曲线和椭圆曲线离散对数问题时再次看到它。

注 3.33 我们尚未讨论 Pollard’s  − 1 算法的成功率,假设  是随机选择的大小大致相同的素数。如果至少有一个  或  完全分解为小素数幂的乘积。那么明显  会是偶数,所以我们可以得到一个因子 , 然后, 或多或少应该像一个大小约等于  的随机数。那么我们引出以下问题:

随机选择一个大小约等于  的整数,其能够整除  的概率为多少。

注意到,如果 ,那么每一个整除  的素因子  满足 。一个其素因子均小于或者等于  的数,我们称之为 。那么一个很自然的想法,如果随机选择一个大小约为  的整数,其为  的概率是多少。即

给出整数n,我们应该如何选择 ,以使得我们随机选择的大小约为  的整数有一个合适的概率为 

所有现代整数分解方法的效率(或缺乏效率)在很大程度上取决于这个问题的答案。我们将在第 3.7 一节中研究 smooth number。

原文始发于微信公众号(山石网科安全技术研究院):密码学系列| 3.5 Pollard’s − 1 分解算法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月12日13:12:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   密码学系列| 3.5 Pollard’s − 1 分解算法http://cn-sec.com/archives/1172088.html

发表评论

匿名网友 填写信息