【问题标题】:Montgomery Multiplication in RSA: c=m^e%nRSA 中的蒙哥马利乘法:c=m^e%n
【发布时间】:2016-06-16 03:31:30
【问题描述】:

蒙哥马利乘法如何加速加密过程以计算 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 加密与蒙哥马利乘法优化一起工作的方式吗?

【问题讨论】:

    标签: c++ encryption optimization rsa montgomery-multiplication


    【解决方案1】:

    不,您不想单独对 m 进行 e 乘法运算来计算 RSA。

    您通常希望通过重复平方来执行 me mod n(还有其他可能性,但这是一种简单的方法,足以满足许多典型目的)。

    previous post on RSA 中,我包含了一个使用pow_mod 函数的实现。这反过来又使用了mul_mod 函数。蒙哥马利乘法(基本上)是mul_mod 函数的实现,它更适合处理大数。然而,为了使其有用,您至少需要在 pow_mod 函数的一般顺序上使用一些东西,而不仅仅是让 e 调用 mul_mod 的循环。

    鉴于实际使用 RSA 所涉及的数字量级,尝试仅使用重复乘法来计算 me mod n 可能需要数年(很可能是相当长的数年)才能完成,即使是一次加密。换句话说,不同的算法不仅仅是一个很好的优化——它绝对是实用的必要条件。

    用算法术语来说,使用普通乘法来提高 AB 基本上是 O(B)。使用那里显示的重复平方算法进行操作,基本上是 O(log B)。如果 B 非常大,则两者之间的差异是巨大

    【讨论】:

      猜你喜欢
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多