我嘗試實施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