public void Verify(byte[] data, byte[] expecteddata) { byte[] first = new byte[data.Length / 2]; byte[] second = new byte[data.Length / 2]; Array.Copy(data, 0, first, 0, first.Length); Array.Copy(data, first.Length, second, 0, second.Length); BigInteger r = new BigInteger(first); BigInteger s = new BigInteger(second); BigInteger w = s.ModInverse(_q); BigInteger u1 = (new BigInteger(expecteddata) * w) % _q; BigInteger u2 = (r * w) % _q; BigInteger v = ((_g.ModPow(u1, _p) * _y.ModPow(u2, _p)) % _p) % _q; if (v != r) throw new VerifyException("Failed to verify"); }