C#:RSA实现不使用大键

时间:2013-05-02 06:16:23

标签: 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密钥集。

有人可以解释为什么我没有得到预期的输出吗?

2 个答案:

答案 0 :(得分: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切换为无符号长整数(UInt64),Math.Pow操作中的double也会溢出。您可能需要构建自己的power和mod函数来处理这些大数字。

编辑:发现此帖子:Encrypt and decrypt a string

答案 1 :(得分:0)

首先:尽量避免自己的加密实施......

如果您只是想知道这些东西是如何工作的,或者这是一项任务:

您可能知道int / long等整数类型的固定长度为32/64位

你的变量只是溢出......

RSA计算通常取决于更大的数字...

Biginteger类将帮助您进行任意大小的整数计算...

但要注意写作

之类的东西的天真方式

C = X ^ E mod N

这里带来一点问题......假设X是明文...... E是一些指数......即使数字相对较小,X ^ E的中间结果也会太大......你需要考虑模块化算术的一些属性...你可以将X ^ E分成多个操作,并可以将模数减少应用于所有这些(减少数字的大小)而不改变结果......一种方法是方形和乘法算法...但您不必自己实现... BigInteger包含ModPow函数...

如果您想查看基于BigInteger的RSA实施take a look here
在示例中,您还会找到RSACryptoServiceProvider ...如果您需要RSA计算,这应该是您的首选......