【问题标题】:RSA - Math.pow inaccurateRSA - Math.pow 不准确
【发布时间】:2010-11-26 09:08:03
【问题描述】:

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

我需要解决以下函数:

c = value^e % n

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

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

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

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

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

【问题讨论】:

  • 您不能对 RSA 使用浮点数。你需要BigIntegers

标签: c# math rsa pow


【解决方案1】:

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

【讨论】:

  • 您认为我应该使用哪种数据类型。据我所知, Math.pow 仅适用于双数据类型。有什么建议么?非常感谢。
  • 我不是 C# 专家。在他的回答中,Enigmativity Suggests System.Numerics.BigInteger
【解决方案2】:

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

【讨论】:

  • 他只需要使用BigInteger.ModPowmsdn.microsoft.com/en-us/library/…
  • @CodeInChaos ModPow 不会打败学习方面吗? (但感谢您找到这个。当然,已经有一个库函数可以做他想做的事。+1 是第一个提到它的人。)
  • @UncleO:可能,但我不这么认为,因为 OP 并没有真正尝试在他的原始代码中实现模幂运算。
【解决方案3】:

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

【讨论】:

  • 十进制也不适用于 RSA。十进制是 128 位,对于 RSA,您需要 1024 到 4096 位。
【解决方案4】:

以整数执行所有计算。

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

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

c = 1;
for (int i = e; i--; i > 0)
{
    c *= value;
    while ( c > n) { c -= n; }
}

【讨论】:

  • 你不觉得这对于 RSA 来说有点 bit 吗?
  • 这是一个学习练习。如果他想修改它以处理更长的长度,他可以。要点是他应该在整数类型中使用这个算法,而不是浮点数,并且应该在每次迭代时使用 mod 操作,而不是在结束时。
  • 对于大整数,循环 e 次在您的一生中不起作用:-) 有一种更好的方法可以根据指数的每一位进行平方或相乘。在每一步减少 mod N 也很关键。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2023-03-16
  • 2014-03-15
  • 2018-02-23
  • 2021-04-02
相关资源
最近更新 更多