【问题标题】:C# BigIntegers get the positive modPowC# BigIntegers 获得正数 modPow
【发布时间】:2013-07-07 11:08:12
【问题描述】:

我正在尝试实施 SRP 协议以进行安全身份验证。我的问题是,当我必须计算一个负数的 ModPow 时,它也会返回一个负数。我知道它可能被称为余数而不是模数,但我真的必须得到正模数才能生成正确的散列。

我该怎么做?

【问题讨论】:

  • 为什么要计算负数的 ModPow?我认为 SRP 从来没有做过这种操作。
  • 因为减法后得到一个负数。 B - k * pow(g, x, N)。这对我来说是一个负值。
  • 你应该添加 N 直到它不再是负数。 2 点 - 3 点是 11 点,而不是 -1 点。你可以做 result mod N 以确保它在 N of 0 的加法之一内。

标签: c# .net math srp-protocol


【解决方案1】:

您可以从结果中添加(或减去)任意倍数的模数,因为:r + km = r (mod m)

我假设结果是:-m < r < 0,所以您只需使用r + m


正确的做法是找到基数的最小非负残基,模 m,先于取幂 - 即,r <- r + m然后 取幂。

【讨论】:

  • 我该怎么做呢?因为在它变为正数之前我不能将 m 添加到它,因为它是一个非常大的负数,而 m 与它相比非常小。
【解决方案2】:

SRP 没有任何需要取负数的 ModPow 的操作。所有与 ModPow 相关的算术都应该在模算术中完成,这实际上意味着所有输入和输出都应该是非负的并且小于某个模数 N。

如果你最终得到一个负数,也许在做减法之后,你基本上应该将 N 添加到结果中,直到它为非负数。对于巨大的负值,计算 x % N 等价于添加 N 直到它只需要再添加 N 为正。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多