跪求蒙哥玛利模幂算法的代码解释

来源:百度知道 编辑:UC知道 时间:2024/05/22 18:06:52
哪为大哥能详细给我将下下面代码的意思~
中间变量初始化:
R取比n大的第一个2k,k是正整数。
R’×(R-n) mod n=1, n’= R – z, (z×n) mod R =1。
M(m) //蒙哥马利蒙氏算法
{ m=a*b
k = ( m * n’ ) mod R;
x = (m + k*n ) / R;
if (x>=n) x -= n;
return x;
}
exp(C,E,n) //调用蒙氏算法完成模幂运算,这是将模幂运算转成模乘的一种算法
{
D=R-n;
P=C*R mod n;
i=0;
while(true)
{
if(E的当前二进制位Ei==1)
D=M(D*P); //从低位到高位检测二进制位
i+=1;
if(i==E的二进制位数)break;
P=M(P*P);
}
return D*R’ (mod n);
}
希望高手大哥些能解释详细点~特别是EXP函数~小弟一直没看懂

最近在学习RSA算法的相关知识,对于其中的核心模密运算以及模密运算的核心——模乘也开始有一点点了解。蒙哥马利模乘的优点在于减少了取模的次数(在大数的条件下)以及简化了除法的复杂度(在2的k次幂的进制下除法仅需要进行左移操作)。一般的模密是调用模乘运算来实现的(正如你所列的代码),可以看一下下面一段文字(选自hellman2000的博客):

模幂运算是RSA 的核心算法,最直接地决定了RSA 算法的性能。针对快速模幂
运算这一课题,西方现代数学家提出了大量的解决方案,通常都是先将幂模运算转
化为乘模运算。

例如求D=C**15 % N,由于:a*b % n = (a % n)*(b % n) % n,所以:

C1 =C*C % N =C**2 % N
C2 =C1*C % N =C**3 % N
C3 =C2*C2 % N =C**6 % N
C4 =C3*C % N =C**7 % N
C5 =C4*C4 % N =C**14 % N
C6 =C5*C % N =C**15 % N

即:对于E=15的幂模运算可分解为6 个乘模运算,归纳分析以上方法可以发现
对于任意E,都可采用以下算法计算D=C**E % N:

D=1
WHILE E>=0
IF E%2=0
C=C*C % N
E=E/2
ELSE
D=D*C % N
E=E-1
RETURN D

继续分析会发现,要知道E 何时能整除 2,并不需要反复进行减一或除二的操
作,只需验证E 的二进制各位是0 还是1 就可以了,从左至右或从右至左验证都可
以,从左至右会更简洁,设E=Sum[i=0 to n](E*2**i),0<=E<=1,则:

D=1
FOR i=n TO 0
D=D*D % N
IF E=1 D=D*C % N
RETURN D

这样,模幂运算就转化成了一系列的模乘运算。