蒙哥马利算法求解大整数幂求模

2019-04-13 12:23发布

蒙哥马利大整数模幂算法

  前几天写了一篇博客《25行代码实现完整的RSA算法》,是关于用Python代码实现一个完整的RSA算法的代码,整个代码中最核心、最浪费时间的代码部分就是关于求解大整数模幂算法这里。整个算法也叫“蒙哥马利幂模”算法。
  首先简单介绍一下蒙哥马利相关的几个算法,具体详细介绍可以参考《蒙哥马利算法详解》。蒙哥马利算法并不是一个独立的算法,而是三个相互独立又相互联系的算法集合,其中包括:
  • 蒙哥马利乘模,是用来计算xy(modN)" role="presentation">xy(modN)
  • 蒙哥马利约减,是用来计算tρ1(modN)" role="presentation">tρ1(modN)
  • 蒙哥马利幂模,是用来计算xy(modN)" role="presentation">xy(modN)
  在这三个算法中,蒙哥马利幂模是RSA加密算法的核心部分。本篇文章为了简单起见就不介绍前两个“蒙哥马利乘模”和“蒙哥马利约减”算法了。主要介绍第三个“蒙哥马利幂模”的计算方法过程,以及通过一个小例子进行说明这个算法的具体计算过程,至于证明方法我就不在这里介绍,大家只要能看到这个例子以后,能把代码写出来就能写完整的RSA算法了。如果想看已经实现的代码请参考这里,或者这里。在这两篇博文里都有完整的代码实现方法。下面介绍“蒙哥马利幂模”的详细计算过程:
  RSA公钥密码的加密算法与解密算法都要计算“模幂乘运算”ab(modN)" role="presentation">ab(modN)
设b的二进制数字表示为br1...b1b0" role="presentation">br1...b1b0,即:
      b=b0+b1×2+...+br1×2r1" role="presentation">b=b0+b1×2+...+br1×2r1
于是:
      abab0×(a2)b1×...×(a2r1)br1(modN)" role="presentation">abab0×(a2)b1×...×(a2r1)br1(modN)
A0=a" role="presentation">A0=aAi(Ai1)2(modN)" role="presentation">Ai(Ai1)2(modN),i = 1, 2… r - 1,则有:
    abA0b0×A1b1×...×Ar1br1(modN)" role="presentation">abA0b0×A1b1×...×Ar1br1(modN)
其中,在这里
Aibi={Ai,bi=11,bi=0i=0,1...r1" role="presentation">