2013-05-13 109 views
1

我試圖解密是使用RSA算法問題RSA解密式

enter image description here

從上面的例子是從Website取加密的消息,所以我試圖實現它在C#:

int msg = 67; 

int Ee = 5; 
int Nn = 91; 
int Dd = 29; 

var cipher = Math.Pow(msg, Ee) % Nn; 
var msg2 = Math.Pow(cipher, Dd) % Nn; 

MessageBox.Show("Msg: " + msg.ToString() + " cipher: " + cipher.ToString() 
        + " msg: " + msg2.ToString()); 

,輸出爲以下幾點:

消息:67密碼:58 msg:45

正如你所看到的 - 加密工作正常,但解密不是!

於是我就和檢查網站和事實證明,Javaspript使用另一個公式:

function mod(m, n) 
{   
    return m - n*Math.floor(m/n) 
} 
function PowerMod(x,p,N) 
    // Compute x^p mod N 
    { 
     var A = 1 
     var m = p 
     var t = x 

     while(m > 0) 
     { 
      k = Math.floor(m/2) 
      r = m - 2*k 
      if(r == 1) 
       A = mod(A*t, N) 
      t = mod(t*t, N) 
      m = k 
     }   
     return A 
    } 

     var temp = "" 
     var e = form.e.value 
     var d = form.d.value 
     var N = form.N.value 
     var M = form.Msg.value 

     form.Cipher.value = PowerMod(M,e,N) 

     var C = form.Cipher.value 
     form.Decipher.value = PowerMod(C,d,N) 

而不是複製和粘貼準備公式 - 我想知道爲什麼我的做法是不工作,我寧願修復我的公式,而不僅僅是重寫JS。關於如何解決解密的任何想法?

+0

容易實現但不安全的解決方案是'BigInteger.ModPow' – CodesInChaos 2013-05-14 05:48:53

回答

3

您的邏輯是正確的,但Math.Pow()不會產生精確的結果,因爲它太大而無法處理。這是最終破壞你的算法。在實踐中,RSA密鑰比那個大得多,並且計算b^e根本不可行。

The PowerMod() JavaScript函數執行模冪運算(b^e % m),使用從右到左的二進制方法不會降低精度,這就是它工作的原因。

你可以在維基百科條目上閱讀更多關於modular exponentiation的文章。

2

的密文是58,你的解密密鑰是29

58^29 =非常,非常巨大的。大約1.378516 * 10^51

我認爲你的直接方法是超出了Math.Pow中使用的double數據類型的精度。對於一個模數除法,它是最不重要的位,最重要的位是那些被忽略/丟失的位。

它看起來像我的javascript算法一起摺疊電源操作和mod操作,所以數據始終保持在底層數據類型的精度範圍內。