2013-05-02 53 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计算,这应该是你的第一选择...