2

我正在尝试将 RSA 算法用于学习目的。现在我有以下问题。我坚持以下几点。

我需要解决以下功能:

c = value^e % n

c = 加密结果值 = 要加密的数字 d = 我的公钥 n = RSA 模块

我只使用 double 作为所有变量的数据类型。我用以下行解决的功能:

double c = Math.Pow(value, e) % n

这里的问题是,看起来 math.pow 函数产生了错误的值,看起来有点不准确。当我用 Windows 计算器尝试这个时,我得到了一个更好的结果,这是正确的。

我的问题:有人知道,如何解决这个问题以获得与 RSA 一起使用的正确结果。所有其他部分的计算绝对正确。它只能是 math.pow 或模数的东西。

4

4 回答 4

3

您正在使用浮点函数来完成真正应该使用任意精度整数来完成的事情。

于 2010-11-26T09:10:31.713 回答
1

如果添加对System.Numerics.dll(在 .NET 4.0 中)的引用,则可以使用System.Numerics.BigInteger允许整数运算的新结构,而不必担心执行和溢出操作。然后,您可以轻松地实现BigInteger准确的电源。

于 2010-11-26T09:35:15.247 回答
0

编写一个计算任意精度数的幂的方法并不难,只需使用 Decimal 数据类型就可以了。

于 2010-11-26T09:16:41.247 回答
0

以整数执行所有计算。

在循环 e 次中,提高幂变成乘以值。在循环内执行 % 操作以避免溢出。

您可以通过替换 while 循环将结果减少到 n 以下来避免 % 运算符。(% 操作符通常很慢。如果速度不是问题,请继续使用它。)

c = 1;
for (int i = e; i--; i > 0)
{
    c *= value;
    while ( c > n) { c -= n; }
}
于 2010-11-26T09:19:02.450 回答