欢迎关注个人公众号摸鱼范式
转载自:
这篇文章为大家梳理一下整个蒙哥马利算法的本质,蒙哥马利算法并不是一个独立的算法,而是三个相互独立又相互联系的算法集合,其中包括
- 蒙哥马利乘模,是用来计算\(x\cdot y\ (mod\ N)\)
- 蒙哥马利约减,是用来计算\(t\cdot \rho^{-1}\ (mod\ N)\)
- 蒙哥马利幂模,是用来计算\(x^y\ (mod\ N)\)
其中蒙哥马利幂乘是RSA加密算法的核心部分。
基本概念
梳理几个概念,试想一个集合是整数模N之后得到的\(Z_N=\left\{0,1,2,\cdots,N-1\right\}\)
注:N在base-b进制下有\(l_N\)位。 比如10进制和100进制,都属于base-10进制,因为\(100=10^2\),所以b=10。在10进制下,667的\(l_N=3\)
这样的集合叫做N的剩余类环,任何属于这个集合Z的x满足以下两个条件:
- 正整数
- 最大长度是\(l_N\)
这篇文章中讲到的蒙哥马利算法就是用来计算基于\(Z_N\)集合上的运算,简单讲一下原因,因为RSA是基于大数运算的,通常是1024bit或2048bit,而我们的计算机不可能存储完整的大数,因为占空间太大,而且也没必要。因此,这种基于大数运算的加密体系在计算的时候都是基于\(Z_N\)集合的,自然,蒙哥马利算法也是基于\(Z_N\)。
在剩余类环上,有两种重要的运算,一类是简单运算,也就是加法和减法,另一类复杂运算,也就是乘法。我们比较熟悉的是自然数集上的运算,下面看下怎么从自然数集的运算演变成剩余类环上的运算。
对于加法运算,如果计算\(x\pm y\ (mod\ N)\),\(0\leqslant x,y\),试想自然数集上的 \(x\pm y\)
我们可以简单的通过加减N来实现从自然数到剩余类集的转换
另外一类是乘法操作,也就是\(x\cdot y\ (mod\ N)\),\(0\leqslant x,y\),那么
如果在自然数集下,令\(t=x\cdot y\),那么对于\(\mod N\)我们需要计算
加减操作很简单,具体的算这里就不细说了,我们用\(Z_N-ADD\)来代表剩余类环上的加法操作。既然我们可以做加法操作,那么我们就可以扩展到乘法操作,算法如下