Inheritance: AsymmetricKeyParameter
		/**
		* Initializes this algorithm. Must be called before all other Functions.
		*
		* @see org.bouncycastle.crypto.AsymmetricBlockCipher#init(bool,
		*      org.bouncycastle.crypto.CipherParameters)
		*/
		public void Init(
			bool				forEncryption,
			ICipherParameters	parameters)
		{
			this.forEncryption = forEncryption;

			if (parameters is ParametersWithRandom)
			{
				parameters = ((ParametersWithRandom) parameters).Parameters;
			}

			key = (NaccacheSternKeyParameters)parameters;

			// construct lookup table for faster decryption if necessary
			if (!this.forEncryption)
			{
				if (debug)
				{
                    System.Diagnostics.Debug.WriteLine("Constructing lookup Array");
				}
				NaccacheSternPrivateKeyParameters priv = (NaccacheSternPrivateKeyParameters)key;
				IList primes = priv.SmallPrimesList;
				lookup = new IList[primes.Count];
				for (int i = 0; i < primes.Count; i++)
				{
					BigInteger actualPrime = (BigInteger) primes[i];
					int actualPrimeValue = actualPrime.IntValue;

					lookup[i] = Platform.CreateArrayList(actualPrimeValue);
					lookup[i].Add(BigInteger.One);

					if (debug)
					{
                        System.Diagnostics.Debug.WriteLine("Constructing lookup ArrayList for " + actualPrimeValue);
					}

					BigInteger accJ = BigInteger.Zero;

					for (int j = 1; j < actualPrimeValue; j++)
					{
//						BigInteger bigJ = BigInteger.ValueOf(j);
//						accJ = priv.PhiN.Multiply(bigJ);
						accJ = accJ.Add(priv.PhiN);
						BigInteger comp = accJ.Divide(actualPrime);
						lookup[i].Add(priv.G.ModPow(comp, priv.Modulus));
					}
				}
			}
		}
        public override void PerformTest()
        {
            // Test with given key from NaccacheSternPaper (totally insecure)

            // First the Parameters from the NaccacheStern Paper
            // (see http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf )

            smallPrimes.Add(u1);
            smallPrimes.Add(u2);
            smallPrimes.Add(u3);
            smallPrimes.Add(v1);
            smallPrimes.Add(v2);
            smallPrimes.Add(v3);

            NaccacheSternKeyParameters pubParameters = new NaccacheSternKeyParameters(false, g, n, sigma.BitLength);

            NaccacheSternPrivateKeyParameters privParameters = new NaccacheSternPrivateKeyParameters(g, n, sigma
                .BitLength, smallPrimes, phi_n);

            IAsymmetricCipherKeyPair pair = new AsymmetricCipherKeyPair(pubParameters, privParameters);

            // Initialize Engines with KeyPair

            if (debug)
            {
                Console.WriteLine("initializing encryption engine");
            }
            cryptEng.Init(true, pair.Public);

            if (debug)
            {
                Console.WriteLine("initializing decryption engine");
            }
            decryptEng.Init(false, pair.Private);

            byte[] data = paperTest.ToByteArray();

            if (!new BigInteger(data).Equals(new BigInteger(enDeCrypt(data))))
            {
                Fail("failed NaccacheStern paper test");
            }

            //
            // key generation test
            //

            //
            // 768 Bit test
            //

            if (debug)
            {
                Console.WriteLine();
                Console.WriteLine("768 Bit TEST");
            }

            // specify key generation parameters
            NaccacheSternKeyGenerationParameters genParam
                = new NaccacheSternKeyGenerationParameters(new SecureRandom(), 768, 8, 30, debug);

            // Initialize Key generator and generate key pair
            NaccacheSternKeyPairGenerator pGen = new NaccacheSternKeyPairGenerator();
            pGen.Init(genParam);

            pair = pGen.GenerateKeyPair();

            if (((NaccacheSternKeyParameters)pair.Public).Modulus.BitLength < 768)
            {
                Console.WriteLine("FAILED: key size is <786 bit, exactly "
                           + ((NaccacheSternKeyParameters)pair.Public).Modulus.BitLength + " bit");
                Fail("failed key generation (768) length test");
            }

            // Initialize Engines with KeyPair

            if (debug)
            {
                Console.WriteLine("initializing " + genParam.Strength + " bit encryption engine");
            }
            cryptEng.Init(true, pair.Public);

            if (debug)
            {
                Console.WriteLine("initializing " + genParam.Strength + " bit decryption engine");
            }
            decryptEng.Init(false, pair.Private);

            // Basic data input
            data = Hex.Decode(input);

            if (!new BigInteger(1, data).Equals(new BigInteger(1, enDeCrypt(data))))
            {
                Fail("failed encryption decryption (" + genParam.Strength + ") basic test");
            }

            // Data starting with FF byte (would be interpreted as negative
            // BigInteger)

            data = Hex.Decode(edgeInput);

            if (!new BigInteger(1, data).Equals(new BigInteger(1, enDeCrypt(data))))
            {
                Fail("failed encryption decryption (" + genParam.Strength + ") edgeInput test");
            }

            //
            // 1024 Bit Test
            //
            /*
                    if (debug)
                    {
                        Console.WriteLine();
                        Console.WriteLine("1024 Bit TEST");
                    }

                    // specify key generation parameters
                    genParam = new NaccacheSternKeyGenerationParameters(new SecureRandom(), 1024, 8, 40, debug);

                    pGen.Init(genParam);
                    pair = pGen.generateKeyPair();

                    if (((NaccacheSternKeyParameters)pair.Public).getModulus().bitLength() < 1024)
                    {
                        if (debug)
                        {
                            Console.WriteLine("FAILED: key size is <1024 bit, exactly "
                                            + ((NaccacheSternKeyParameters)pair.Public).getModulus().bitLength() + " bit");
                        }
                        Fail("failed key generation (1024) length test");
                    }

                    // Initialize Engines with KeyPair

                    if (debug)
                    {
                        Console.WriteLine("initializing " + genParam.getStrength() + " bit encryption engine");
                    }
                    cryptEng.Init(true, pair.Public);

                    if (debug)
                    {
                        Console.WriteLine("initializing " + genParam.getStrength() + " bit decryption engine");
                    }
                    decryptEng.Init(false, pair.Private);

                    if (debug)
                    {
                        Console.WriteLine("Data is           " + new BigInteger(1, data));
                    }

                    // Basic data input
                    data = Hex.Decode(input);

                    if (!new BigInteger(1, data).Equals(new BigInteger(1, enDeCrypt(data))))
                    {
                        Fail("failed encryption decryption (" + genParam.getStrength() + ") basic test");
                    }

                    // Data starting with FF byte (would be interpreted as negative
                    // BigInteger)

                    data = Hex.Decode(edgeInput);

                    if (!new BigInteger(1, data).Equals(new BigInteger(1, enDeCrypt(data))))
                    {
                        Fail("failed encryption decryption (" + genParam.getStrength() + ") edgeInput test");
                    }
            */
            // END OF TEST CASE

            try
            {
                new NaccacheSternEngine().ProcessBlock(new byte[]{ 1 }, 0, 1);
                Fail("failed initialisation check");
            }
            catch (InvalidOperationException)
            {
                // expected
            }

            if (debug)
            {
                Console.WriteLine("All tests successful");
            }
        }