计算机安全:蒙哥马利约减
蒙哥马利约减
问题
求y mod N,N为质数。y称为x模N关于R的Montgomery约减,即y=xR’ mod N
附加条件:不使用除法(除法速度慢)
尽量避免了使用取模运算
用移位、减法运算替代取模运算
目前使用最广泛的模指数运算方法
设计
1.取R为2的幂次方(如果 N表示为n个b进制数,则 R取b的幂次方),这样/ R即右移,*R即左移,mod R即与(R-1)按位与,大大提高了速度。
2.R和N互质,即存在R’和N’,使得RR’ + NN’=1。同时,R>N(why?),x/R<N。这些选择保证最多只需要一次减法即可完成取模。
结论
例子
取N = 3457,R = 2^16,得到N’=12929,R’=682。求y mod N:
计算得
由结论得,
代入计算得,
这种方法的另一个优势在于,也即 可提前计算。
函数
1 | int f(int a) |
应用:模指数
计算
计算x的M约减
计算A的M约减
计算A平方的M约减
A平方的M约减 乘 x̃的M约减,进行约减,即得。
应用:取模乘法
计算
计算x的M变换
计算y的M变换
计算x’和y’的积,再进行M约减
进行约减,即得。
写成函数如下:
1 | x̃ = MR(x * (R方 mod m)), ã = MR(1*(R方 mod m) ) //逆向快速幂 |
优化:用M约减实现M变换
即计算
多精度M乘法
略
barrett约减
其中第四部最多执行2次。
例子
b = 4, k = 3, x = (313221)b, and m = (233)b (x = 3561 and m = 47).
1/m = (0.00111302 · · ·)b
µ = ⌊46 / m⌋ = 87 = (1113)b,
q1 = ⌊(313221)b/42⌋ = (3132)b,
q2 = (3132)b · (1113)b = (10231302)b,
q3 = (1023)b,
r1 = (3221)b,
r2 = (1023)b · (233)b mod b4 = (3011)b,
r = r1 − r2 = (210)b.
故 x mod m = 36.