蒙哥馬利乘法是如何在RSA加密中使用加速計算c = m^e%n的加密過程的? 我知道蒙哥馬利乘法可以有效地乘a * b%n,但是當試圖找到m^e%n時,是否有比乘以m * me次數更有效的方法,而不是每次循環和計算蒙哥馬利乘法?RSA中的蒙哥馬利乘法:c = m^e%n
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的冪)
我轉換爲蒙哥馬利形式之前的乘法和重複乘法m * m for循環,在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加密如何與蒙哥馬利乘法優化一起工作嗎?