蒙哥马利算法详解

Posted 轩辕223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒙哥马利算法详解相关的知识,希望对你有一定的参考价值。

例行广告,推广一下我的博客http://zwgeek.com

这篇文章为大家梳理一下整个蒙哥马利算法的本质,蒙哥马利算法并不是一个独立的算法,而是三个相互独立又相互联系的算法集合,其中包括

  • 蒙哥马利乘模,是用来计算 xy (mod N)
  • 蒙哥马利约减,是用来计算 tρ1 (mod N)
  • 蒙哥马利幂模,是用来计算 xy (mod N)

其中蒙哥马利幂乘是RSA加密算法的核心部分。

基本概念

梳理几个概念,试想一个集合是整数模N之后得到的
ZN=0,1,2,,N1

注:N在base-b进制下有 lN 位。 比如10进制和100进制,都属于base-10进制,因为 100=102 ,所以b=10。在10进制下,667的 lN=3

这样的集合叫做N的剩余类环,任何属于这个集合Z的x满足以下两个条件:
1. 正整数
2. 最大长度是 lN

这篇文章中讲到的蒙哥马利算法就是用来计算基于 ZN 集合上的运算,简单讲一下原因,因为RSA是基于大数运算的,通常是1024bit或2018bit,而我们的计算机不可能存储完整的大数,因为占空间太大,而且也没必要。因此,这种基于大数运算的加密体系在计算的时候都是基于 ZN 集合的,自然,蒙哥马利算法也是基于 ZN

在剩余类环上,有两种重要的运算,一类是简单运算,也就是加法和减法,另一类复杂运算,也就是乘法。我们比较熟悉的是自然数集上的运算,下面看下怎么从自然数集的运算演变成剩余类环上的运算。

对于加法运算,如果计算 x±y (mod N) ( 0x,y<N ),试想自然数集上的 x±y

0x+y2(N1)

(N1)xy(N1)

我们可以简单的通过加减N来实现从自然数到剩余类集的转换

另外一类是乘法操作,也就是 xy (mod N) ( 0x,y<N ),那么

0xy(N1)2

如果在自然数集下,令 t=xy ,那么对于 modN 我们需要计算

tNtN

加减操作很简单,具体的算这里就不细说了,我们用 ZNADD 来代表剩余类环上的加法操作。既然我们可以做加法操作,那么我们就可以扩展到乘法操作,算法如下

但是这并不是一个好的解决方案,因为通常来说,我们不会直接做w位乘w位的操作,这个后面会用蒙哥马利的乘法来代替解决。

对于取模操作,一般有以下几种方法

1,根据以下公式,来计算取模操作

tNtN

这种解法有以下特征

  • 整个计算过程是基于标准的数字表示
  • 不需要预计算(也就是提前计算一些变量,以备使用)
  • 涉及到一个除法操作,非常费时和复杂

2,用Barrett reduction算法,这篇文章不细说,但是有以下特征

  • 基于标准的数字表示
  • 不需要预计算
  • 需要 2(lN+1)(lN+1) 次数乘运算

3,用蒙哥马利约减,也就是下面要讲的算法,有以下特征

  • 不是基于标准的数字表示(后文中有提到,是基于蒙哥马利表示法)
  • 需要预计算
  • 需要 2(lN)(lN) 次数乘运算

蒙哥马利预备知识

在将蒙哥马利算法之前,先看一下在自然数下的乘法公式

计算 xy ,想象一下我们常用的计算乘法的方法,用乘数的每一位乘上被乘数,然后把得到的结果相加,总结成公式,可以写成如下的形式。

xy=xsuml以上是关于蒙哥马利算法详解的主要内容,如果未能解决你的问题,请参考以下文章

蒙哥马利算法

蒙哥马利基2的算法的Verilog 硬件实现(大数模乘)

论文翻译2:61蒙哥马利模块化逆算法回顾

欧几里得算法解决 RR' - NN' = 1. 使用蒙哥马利算法进行模幂运算以在 python 或 Petite Chez 方案中实现费马检验

中国剩余定理算法详解 + POJ 1006 Biorhythms 生理周期

经典排序算法——冒泡排序算法详解