我正在尝试在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 :(得分: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计算,这应该是您的首选......