2014-03-01 343 views
0

我試過編寫一個函數來使用擴展歐幾里德算法找到RSA的私鑰,我找不到錯誤,但我真的不想從頭開始重新開始!對於某些價值觀來說,這是正確的,但對於其他人來說,這是不正確的,我不明白爲什麼,我真的很感激這種幫助,如果這個問題太含糊,我很抱歉(我知道這會讓人們煩惱)。任何人都可以找到錯誤?非常感謝您提前:RSA解密的私鑰C++

unsigned long long int modinv(unsigned long long int u, unsigned long long int v) 
{ 
    unsigned long long int inv, u1, u3, v1, v3, t1, t3, q; 
    unsigned long long int iter; 

    u1 = 1; 
    u3 = u; 
    v1 = 0; 
    v3 = v; 

    iter = 1; 

    while (v3 != 0) 
    { 

     q = u3/v3; 
     t3 = u3 % v3; 
     t1 = u1 + q * v1; 

     u1 = v1; v1 = t1; u3 = v3; v3 = t3; 
     iter = -iter; 
    } 

    if (u3 != 1) 
     return 0; 
    if (iter < 0) 
     inv = v - u1; 
    else 
     inv = u1; 
    return inv; 
} 

回答

1

請勿在此處使用無符號值,因爲它會使算法無效。因此,您可以使用long long int而不是unsigned long long int。另請注意,當使用無符號值時,iter = -iter將無法​​按預期工作,因爲它會下溢。假設您有iter = 1,那麼-iter將不是-1,而是18446744073709551615(= 2^64-1)。 iter < 0的支票也一直是錯誤的。

對於任何現實生活中的應用程序,您都需要比64位類型更大的數字。有很多方法可以做到這一點,但GMP(GNU Multiple Precision lib)有mpz_powm(r, base, exp, mod),您可以在解密階段使用它。更多信息here

,如果你給你的密文c和私鑰定義爲n(= P×Q)和d那麼你可以解密c成明文m這樣所以基本上:

#include <gmp.h> // requires GMP lib to be installed. 
void rsaDecrypt(const mpz_t c, const mpz_t n, const mpz_t d, mpz_t m) { 
    mpz_init(m); 
    mpz_powm(m, c, d, n); // m = c^d (mod n) 
} 
+0

非常感謝,我猜測密文輸入「c」是數字嗎? – MichaelRad

+0

我收到錯誤「'mpz_t'沒有命名一個類型」 – MichaelRad

+0

哦,你需要安裝GMP之後才能使用它。我只是給你一些想法。但首先嚐試使用'long long int'作爲數據類型,以便它不是無符號的。然後再次嘗試使用您的測試數據。 –