本文节选自《密码学引论》第二版。
Montgomery算法把部分积对任意的n取模运算转化为对数基R的取模,由于R比n小得多,对数基R的取模运算要比对n的取模运算简单得多。对于特别选择的R可使得对R的取模运算变为移位运算,从而可以提高模乘运算的速度。因为利用Montgomery算法可以实现快速模幂运算,所以Montgomery算法在RSA密码的软硬件实现中得到广泛应用。
Montgomery算法:
设n为模数,选择一个与n互素的正整数R作为基数。再选择正整数R^-1和n' ,满足0<R^-1 <n,0<n'<R,且使
R(R^-1)-nn'=1
根据上式有:R(R^-1) = 1modn,nn' = -1 modR。
于是称R^-1为R的模n迹。n‘为n的模R负逆。
设A和B是要模乘的两个数,且满足0≤AB < nR,Montgomery算法Mon(A,B.R,n)给出计算模乘ABR^-1modn的快速算法。
Function Mon(A,B,R,n):
- T=AB
- s=Tn' modR
- t=(T+sn)/R
- if t>=n then retum(t-n) else returm t
根据算法Mon(A,B,R,n)可知,t=(T+sn)/R,tR=T+sn。所以有
T +sn=0 mod R
这说明(T+sn)是R的倍数,因此t为整数。根据tR=T+sn,于是又有
tR=T mod n; t=TR^-1 mod n; t=ABR^-1 mod n ;
这就证明了Montgomery算法完成了ABR^-1 mod n的计算。即
Mon(A,B,R,n) =AB R^-1 mod n
为了利用函数Mon(A,B,R,n),必须首先选择产生R和n’,但是这种选择产生的计算是一次性的,可以预处理,因此消耗的时间不多。
值得注意的是,在函数Mon(A,B,R,n)中的第①步,计算T=AB,由于A和B都是大数,这乘法运算仍是很麻烦的。这说明Montgomery 算法并不能省略大数的乘法运算。但是这里仅仅是计算大数的乘法,而不需要取模运算。这与普通的大数模乘运算相比,仍然节省了很多。
另外,在函数Mon(A,B,R,n)中没有进行mod n的计算,只进行了mod R的计算。一般R比n小得多,而且通常都选R=2^w ,w是非负整数,从而使mod R的计算变成移位操作,计算更加简捷。
下面给出利用函数Mon(A,B,R,n)计算y=ab mod n的完整过程。
1.首先进行预处理:
A=aR,B=bR
2.然后计算:
Y= Mon(A,B,R,n) =ABR^-1 mod n
=(aR)(bR)R^-1 mod n=abR mod n
3.最后进行调整运算:
y =YR^-1 mod n
= (abR)R^-1 mod n=ab mod n
注意,由于Mongomery算法采用了mod R运算,因此在计算ab mod n时先要进行预处理,最后还要进行调整运算。