计算机安全:蒙哥马利约减
目前使用最广泛的模指数运算方法
问题
求y mod N,N为质数。y称为x模N关于R的Montgomery约减,即y=xR’ mod N
附加条件:不使用除法(除法速度慢)
尽量避免使用取模运算
用移位、减法运算替代取模运算
设计
1.取R为2的n次方(如果 N表示为n个b进制数,则 R取b的幂次方),这样/ R即右移,*R即左移,mod R即与(R-1)按位与,大大提高了速度。
2.N<R,R和N互质,即存在R’和N’,使得RR’ + NN’=1(保证对任意的x<R,有k<R,使得kN=x<R。这保证表达式(见下文)的后半部分有解,且大小不超过R/R=1)。同时,加上y/R<N,故表达式的前半部分大小不超过N。综上可得,表达式整体大小不超过2N(故取模可以用减法做)。
推导
设T=Qm+r,欲求T mod m
将T分为n的两部分,高n位为T’,低n位为T’’
则:
前半部分只需要移位和最多一次减法。
对于后半部分,需要找到0.km,使其与表达式后半部分相加,能将小数部分变成0。即T’’+km=cR(R的低位全为0)。加之m和R互素,故这样的k一定存在。实际上,k=-1/m*T’’ mod R
综合可得,T+km是R的倍数。
结论
x模 N 关于 R 的Montgomery 约减用2次乘法、1次加法(把-k换成k)、2次移位、1次减法(最后取模时使用)。
注意:xmod R和x’’ modR结果一致,因为x’mod R结果为0。同时,结论的x*N‘ modR等于推导式中的-k
例子
取N = 3457,R = 2^16,得到N’=12929,R’=682。求y mod N:
计算得
由结论得,
代入计算得,
这种方法的另一个优势在于,也即 可提前计算。
函数
1 | int f(int a) |
应用:模指数
计算
计算x*R²的M约减
计算x̃²的M约减A:
计算A平方的M约减
A平方的M约减 乘 x̃的M约减,再进行约减,即得。
乘方写成函数如下:
1 | x̃ = MR(x * (R方 mod m)), ã = MR(1*(R方 mod m) ) //逆向快速幂,输出:x^{e} mod m. |
应用:取模乘法
计算
计算x的M变换
计算y的M变换
计算x’和y’的积,再进行M约减
进行约减,即得。
优化:用M约减实现M变换
即计算
优化:多精度M约减
当T比较大时。
T为2n位,N为n位,R为b的n次方。
理论:
实例:
优化:多精度M乘法
x为n位,y为n位,N为n位,R为b的n次方。
理论:
实例:
证明方式见回放
其中r1-r2可能为负数,只需要加一次模。(因为−b^{k+1} < r1 − r2 < b^{k+1})
其中第四步最多执行2次。(因为Q-q3≤2)
设x=Qm+r,则x 的高 k+1位与 1/m 的高 2k 比特中的低 k+1 位相乘,取整数部分(高k+1位)得到Q的近似值q3(Q-2≤q3≤Q)。Qm+r-q3m对m取模得到r。
问题
为什么是模b的k+1次方,为什么要求b>3?
为什么r1和r2对非m取模,不影响正确性?
为什么要求b>k?
例子
故 x mod m = 36。