在公钥算法实现中,通常需要计算a mod M、a*b mod M、a^b mod M等,一般看见mod M,最直接想到的当然是除法,可是除法运算慢且实现难,于是,就有人发明了一种不需要计算除法的计算模的方法,这就是所谓的Montgomery乘法。
Montgomery乘法的数学表达是A*B*R^(-1) mod M,其中,A、B是与M同位长的大数,R = 2^bitlen(bitlen指M位长),R^(-1)是指R相对于M的模逆,即R^(-1)是满足如下条件的数:R*R^(-1) mod M = 1;这个条件成立的充要条件是R与M互素,这一点只需要M为奇数即可,所以Montgomery乘法通常适用于对奇数求模。
更为重要的是,Montgomery乘法可以做大量的并行运算,而A*B mod M则必须先将A*B计算出来再计算除法。所以当使用硬件实现Montgomery乘法会有很高的效率。
如何使用A*B*R^(-1) mod M代替A*B mod M呢?
通常,将x映射成x*R mod M,后者可以称之为x的Montgomery表示,可以发现,输入两个Montgomery表示下的乘数,使用Montgomery乘法运算,可以得到原乘数使用普通模乘得到的数的Montgomery表示。所以,要计算模乘运算,可以先将乘数化成Montgomery表示,然后使用Montgomery乘法,最后将结果脱掉Montgomery表示,即得普通模乘的结果;这个过程虽然复杂些,但是对于计算大量模乘的运算(例如模幂)而言,只是多了初始的入和出Montgomery表示的过程,但中间每次计算Montgomery乘法,却比计算普通模乘省下大量时间。