蒙哥马利乘法如何加速计算 RSA 加密中使用的 c=m^e%n 的加密过程?我知道蒙哥马利乘法可以有效地将 a*b%n 相乘,但是当试图找到 m^e%n 时,有没有比每次循环并计算蒙哥马利乘法更有效的方法来将 m*me 相乘?
mpz_class mod(mpz_class &m, mpz_class &exp, mpz_class &n) {
//End goal is to return m^exp%n
// cout << "Begin mod";
mpz_class orig_m = m; //the original message
mpz_class loc_m = m; //local value of m (to be changed as you cycle through)
cout << "m: " << m << " exp: " << exp << " n: " << n << endl;
//Conversion to the montgomery world
mpz_class mm_xp = (loc_m*r)%n;
mpz_class mm_yp = (orig_m*r)%n;
for(int i=0; i < exp-1; i++) //Repeat multiplaction "exp" number of times
{
mm(mm_xp, mm_yp, n); //montgomery multiplication algorithm returns m*orig_m%n but in the montgomery world form
}
mm_xp = (mm_xp*r_p)%n; //convert from montgomery world to normal numbers
return mm_xp;
}
我正在使用 gmp 库,所以我可以在这里处理更大的数字。r 和 r_p 在单独的函数中预先计算并且是全局的。在这个例子中,我正在使用 10 的幂(尽管我意识到使用 2 的幂会更有效)
我在乘法之前转换为蒙哥马利形式,并在 for 循环中重复乘法 m*m,在 m^e 步骤结束时转换回正常世界。我很想知道是否有另一种方法可以以不同的方式计算操作 m^e%n,而不仅仅是在 for 循环中循环?截至目前,我相信这是计算的瓶颈,但我很可能是错的。
实际的蒙哥马利乘法步骤发生在下面的函数中。
void mm(mpz_class &ret, const mpz_class &y, const mpz_class &n)
{
mpz_class a = ret*y;
while(a%r != 0)
{
a += n;
}
ret = a/r; //ret*y%n in montgomery form
// cout << ret << endl;
}
这就是 RSA 加密如何与蒙哥马利乘法优化一起工作的吗?