我尝试实施ElGamal签名,但验证有问题。据的消息m维基百科,签名(R,S)是正确的,如果:
ElGamal签名验证
有一种公知的算法,用于计算ModPow,这是在签名步骤中使用:
但我无法找到计算第一个公式的方法。如果我尝试直接计算功率,这似乎太大了。我用C#编写代码并使用BigInteger,它甚至不允许用BigInteger指数计算权力 - 我只接受普通整数,这是合理的。
有没有简化?这应该如何计算? 谢谢
我尝试实施ElGamal签名,但验证有问题。据的消息m维基百科,签名(R,S)是正确的,如果:
ElGamal签名验证
有一种公知的算法,用于计算ModPow,这是在签名步骤中使用:
但我无法找到计算第一个公式的方法。如果我尝试直接计算功率,这似乎太大了。我用C#编写代码并使用BigInteger,它甚至不允许用BigInteger指数计算权力 - 我只接受普通整数,这是合理的。
有没有简化?这应该如何计算? 谢谢
我已经在matlab中实现了这个算法,它的工作正常。我为大数使用了可变精度整数(vpi)。
zvyr = vpi(mod(((y^r)*(r^s)),p))
我相信类似的东西可以用于C#。
我从这个答案中删除了你的问题。如果您有自己的问题,则应该将其作为问题发布。 – Magnilex 2015-03-18 16:39:39
使用与计算g^k (mod p)
,square-and-multiply完全相同的算法进行计算。您不需要自己实现该算法,ModPow
方法是BigInteger
类型的一部分。
bool success = BigInteger.ModPow(g, h, p) ==
(BigInteger.ModPow(y, r, p) + BigInteger.ModPow(r, s, p)) % p;
注意(mod p)
以数学公式的右边是不是一个操作符,它会告诉你整个公式应一致性模p处理。
'BigInteger.ModPow' – CodesInChaos 2015-03-18 16:39:44