2

我正在尝试在 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 密钥集。

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

4

2 回答 2

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 切换为 unsigned long (UInt64),Math.Pow 操作中的双精度也会溢出。您可能必须构建自己的 power 和 mod 函数来处理这些大数字。

编辑:找到这个 SO 帖子:加密和解密字符串

于 2013-05-02T06:26:55.360 回答
0

第一:尽量避免你自己的加密实现......

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

你可能知道像int/这样的整数类型long具有 32 / 64 位的固定长度

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

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

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

但请注意,写东西的天真方式

C = X ^ E mod N

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

如果您想查看基于 BigInteger 的 RSA 实现,请查看示例here
,您还会发现RSACryptoServiceProvider...如果您需要 RSA 计算,这应该是您的首选...

于 2013-05-03T23:24:55.120 回答