예제 #1
0
파일: Program.cs 프로젝트: sorrge/LSAG
        private static void TestMultiExp()
        {
            Console.Write("Testing multi-exponentiation");
            int k    = 111;
            var seed = new byte[1000];
            var r    = new Random();

            r.NextBytes(seed);
            var rnd = new HMACDRBG(seed);
            var mod = new Modular(new BigInteger(5555555566666777777));

            var g  = Enumerable.Range(0, k).Select(i => rnd.GenerateInteger(BigInteger.One << r.Next(200) + 200)).ToArray();
            var me = new MultiExponentiation(mod.Modulus, g);

            for (int i = 0; i < 1000; ++i)
            {
                var e = Enumerable.Range(0, k).Select(j => rnd.GenerateInteger(BigInteger.One << r.Next(100) + 100)).ToArray();
                //var z = mod.Pow(g, e, ref cache);
                var z  = me.Pow(e);
                var z2 = BigInteger.One;
                for (int j = 0; j < k; ++j)
                {
                    z2 = (z2 * BigInteger.ModPow(g[j], e[j], mod.Modulus)).Mod(mod.Modulus);
                }

                if (!z.Equals(z2))
                {
                    Console.WriteLine("ouch");
                }

                if (i % 100 == 0)
                {
                    Console.Write('.');
                }

                r.NextBytes(seed);
                rnd.Reseed(seed);
            }

            Console.WriteLine();
        }