簡單RSA破解

問題描述

Alice decides to use RSA with the public key N = 1889570071. In order to guard against transmission errors, Alice has Bob encrypt his message twice, once using the encryption exponent e1 = 1021763679 and once using the encryption exponent e2 = 519424709. Eve intercepts the two encrypted messages
c1 = 1244183534 and c2 = 732959706. Assuming that Eve also knows N and the two encryption exponents e1 and e2. Please help Eve recover Bob’s plaintext without finding a factorization of N.

分析

Alice 給 Bob發(fā)送的密文是用兩個不同密鑰e1e2加密兩次得到的。即如圖:


易知:

其中:

可以用擴展歐幾里得算法解得u、v,故有:

如果gcd(e1, e2)剛好等于1,那么Eve就破解了密碼。

實現(xiàn)

#include <iostream>
#include <gmp.h>
#include <gmpxx.h>

using namespace std;

//擴展歐幾里得算法求u、v
mpz_class gcdEx (mpz_class a, mpz_class b, mpz_class &u, mpz_class &v)
{
    if(b==0)
    {
        u = 1, v = 0;
        return a;
    }
    else
    {
        mpz_class r = gcdEx(b, a % b, u, v); /* r = GCD(a, b) = GCD(b, a%b) */
        mpz_class t = u;
        u = v;
        v = t - a/b * v;
        return r;
    }
}

//快速冪取模
mpz_class fast_exp (mpz_class a, mpz_class b, mpz_class c)
{
    mpz_class ans=1;   //記錄結果
    a=a%c;   //預處理,使得a處于c的數(shù)據范圍之下
    while(b!=0)
    {
        if(b % 2 != 0) ans = (ans * a) % c;   //如果該位是1,那么a是需要乘進結果的
        b>>=1;    //移位操作,其實就是遍歷b的每一位
        a = (a * a) % c;   //不斷的加倍
    }
    return ans;
}

//快速乘取模
mpz_class F_mul(mpz_class a, mpz_class b, mpz_class c) {
    mpz_class ans = 0;
    a %= c;
    while (b != 0) {
        if (b % 2 != 0) ans = (ans + a) % c;
        a = (a + a) % c;
        b >>= 1;
    }
    return ans;
}


int main ()
{
    mpz_class N("1889570071", 10);
    mpz_class e1("1021763679", 10);
    mpz_class e2("519424709", 10);
    mpz_class c[2];
    c[0].set_str("1244183534", 10);  c[1].set_str("732959706", 10);
    mpz_class s[2];
    mpz_class r = gcdEx (e1, e2, c[0], c[1]);
    mpz_class rev, x;
    int tn = 0;
    if (s[1] < 0) tn = 1;
    gcdEx(N, c[tn], x, rev);
    if (rev < 0) rev = (rev + N) % N;
    mpz_class res = F_mul(fast_exp(rev, -s[tn], N), fast_exp(c[!tn], s[!tn], N), N);
    cout << res << endl;
    return 0;
}

得到結果:1054592380

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容