2013-05-02 70 views
2

我想在C#中實現RSA加密。我把它用小扳手的工作像這樣:C#:RSA實現不能用大鍵

public static int n = 33; 
    public static int e = 7; 
    public static int d = 3; 

    static void Main(string[] args) 
    { 
     int A = 9; 
     int enc = (int)(Math.Pow(A, e) % n); 
     int dec = (int)(Math.Pow(enc, d) % n); 
     Console.WriteLine(A); 
     Console.WriteLine(enc); 
     Console.WriteLine(dec); 
    } 

此輸出:

9 
15 
9 

我不明白爲什麼它不具有較大的鍵的工作。如果我給這些鍵值:

public static int n = 3233; 
    public static int e = 17; 
    public static int d = 2753; 

它輸出:

9 
1971 
-2147483648 

根據維基百科(並與一所大學的網站上的RSA計算器檢查),N = 3233 E = 17 d = 2753是一個有效的RSA密鑰集。

有人可以解釋爲什麼我沒有得到預期的輸出?

+0

請注意,有[類](http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider .aspx)在.NET Framework中爲您處理RSA加密/解密。不要實施任何家庭安全,這是容易出錯的方法。 – nvoigt 2013-05-02 06:33:22

回答

1

您的整數溢出。將您的代碼更改爲:

static void Main(string[] args) 
     { 
      checked 
      { 
       int A = 9; 
       int enc = (int)(Math.Pow(A, e) % n); 
       int dec = (int)(Math.Pow(enc, d) % n); 
       Console.WriteLine(A); 
       Console.WriteLine(enc); 
       Console.WriteLine(dec); 
      } 
     } 

並且您將看到它會引發錯誤。 32位整數可以保持最大值。即使您將A切換爲無符號long(UInt64),Math.Pow操作中的double也會溢出。你可能不得不建立你自己的力量和mod功能來處理這些大數字。

編輯:發現這個SO職位:Encrypt and decrypt a string

0

第一:儘量避免自己的加密實現...

,如果你只是想知道如何STHE東西的作品,或者如果這是一個任務:

正如你可能知道的整數類型,如int/long有32個/ 64位的

您的變量的固定長度的簡單溢出...

RSA計算通常取決於有這樣大的數字...

Biginteger類會幫助你任意大小的整數calcualtions ...

但要知道,像

寫的東西用簡單的方式

C = X^E模N

這裏帶來一個小問題......假設X是明文... E是一些指數...即使相對較小的數字X^E的中間結果會太大...你需要考慮到模塊算術的一些性質......你可以將X^E分割成多個運算,並且可以在不改變結果的情況下將模減少應用於所有這些運算(這會減少數字的大小)......對此的一種方法是廣場和乘法算法...但你沒有實現利用自己...... BigInteger包含ModPow功能...

,如果你想看到一個基於RSA的BigInteger實施take a look here
例如,您還可以找到RSACryptoServiceProvider ......如果你需要RSA計算,這應該是你的第一選擇...