Montgomery Modular Multiplication
Table of Contents
1. 简介
Montgomery 模乘法是美国数学家 Peter L. Montgomery 于 1985 年在论文 Modular Multiplication Without Trial Division 中提出的,本文将介绍它。
不过,单个模乘法并不是 Montgomery 算法的应用场景,它的主要应用场景是模幂(Modular exponentiation)计算,即已知
2. Montgomery 空间
设
设
原空间 | Montgomery 空间 |
---|---|
下面我们看看在 “Montgomery 空间” 进行模加法运算有什么特点。
从上式可知,要计算
- 把
转换到 Montgomery 空间,分别记为 ; - 在 Montgomery 空间进行模加法运算
,假设结果是 ; - 把得到结果
转换回原空间。
下面演示一下这个过程。假设要计算
下面我们再看看在 “Montgomery 空间” 进行普通模乘法运算有什么特点。
可以发现,要计算
在这种新模乘运算定义下,有:
这样,计算
- 把
转换到 Montgomery 空间,分别记为 ; - 在 Montgomery 空间计算
,假设结果是 ; - 把得到结果
从 Montgomery 空间转换回原空间。
干嘛这么折腾呢? 直接计算
不过,需要说明的是,如果只是进行一次模乘运算,转换到 Montgomery 空间进行计算没有优势,因为计算前需要把数字转换到 Montgomery 空间,在 Montgomery 空间得到结果后,还需要从 Montgomery 空间转换回原空间。如果是进行模幂运算(相当于多次模乘),则转移到 Montgomery 空间进行计算有很大优势,因为进入 Montgomery 空间,和退出 Montgomery 空间只需要在计算开始和结束时分别进行一次。
3. Montgomery Reduction
这节介绍 Montgomery Reduction 算法,它是下一节 4 的基础。
Montgomery Reduction 是指已知
下面以具体值
- 假设
能够被 整除,则计算 非常快,因为这时有 ,也就是说把 右移 5 位就行了,不用进行除法运算了。由于 , 右移 5 位后会小于 ,不用再取模了。 - 假设
不能被 整除,那怎么办呢?思路如下,我们想办法找这样的 ,使得 可以被 整除,这样的话 就很容易求解了,因为和前面介绍的一样,它会等于 ,右移运算不涉及除法,是很快的。而 显然和 是相等的,所以问题的关键就是寻找合适的 。前面提到对 的要求是 可以被 整除,写成式子就是 ,从而有 ,如果定义新记号 (一般我们可以提前把 计算出来),则 。对 的计算也是很快的,由于 ,取 的最低 5 个二进制位就行。
3.1. REDC 算法
基于上面的分析,我们可总结出 Montgomery Reduction 算法(简记为 REDC 算法,摘自:The REDC algorithm):
function REDC is input: Integers R and m with gcd(R, m) = 1, Integer m' in [0, R − 1] such that mm' ≡ −1 mod R, Integer T in the range [0, Rm − 1]. output: Integer S in the range [0, m − 1] such that S ≡ TR⁻¹ mod m U ← ((T mod R)m') mod R # mod R 的性能很高,编程实现时 R 一般是 2ⁿ,相当于只留下最低 n 个二进制位 t ← (T + Um) / R # 这里 T + Um 一定可以被 R 整除(前面有分析),编程实现是往往为右移运算 if t ≥ m then # 因为 T < mR, U < R ,从而有 t = (T + Um) / R < (mR+mR)/R = 2m,所以 t ≥ m 时,变为 t-m 即可 return t − m else return t end if end function
3.1.1. R 的选择
前面提到需要满足
假设
3.2. REDC(Multiprecision Version)
5. 使用 Mont(x,y) 快速计算模幂
节 2 中提到过,如果只是进行一次模乘运算,转换到 Montgomery 空间进行计算没有优势,因为计算前需要把数字转换到 Montgomery 空间,在 Montgomery 空间得到结果后,还需要从 Montgomery 空间转换回原空间。 Montgomery 算法真正的应用场景是计算模幂,即
在介绍使用 Mount(x,y) 快速计算模幂前,先介绍一下“Left-to-right binary exponentiation”算法,如图 3 所示。
Figure 3: Left-to-right binary exponentiation
下面以
先把十进制
A | ||
---|---|---|
8 | 1 | |
7 | 0 | |
6 | 0 | |
5 | 0 | |
4 | 1 | |
3 | 1 | |
2 | 0 | |
1 | 1 | |
0 | 1 |
注:Left-to-right binary exponentiation 并不是乘法次数最少的方法。比如求
6. Montgomery 的不同实现
前面介绍的算法都是教科书中算法,在编程实现时,往往还有其它一些优化,论文 Analyzing and Comparing Montgomery Multiplication Algorithms 中分析和比较了几种实现。
OpenSSL 中 BN_mod_exp/BN_mod_exp_mont 的实现用到了 Montgomery 算法来加快模幂计算,参考:https://github.com/openssl/openssl/blob/9c8d04dbec03172d6ffe4eaa38ea4b1ac2741f26/crypto/bn/bn_exp.c#L304
7. 参考
- 本文主要总结于 Handbook of Applied Cryptography,Chapter 14 Efficient Implementation
- https://en.wikipedia.org/wiki/Montgomery_modular_multiplication
- 1985 年 Peter L. Montgomery 发表的论文 Modular Multiplication Without Trial Division
- 论文 Comparison of three modular reduction functions 中对传统方法、Barrett Reduction 算法和 Montgomery 算法进行了性能比较
- Efficient Software Implementations of Modular Exponentiation
- Rethinking Modular Multi-Exponentiation in Real-World Applications