Inheritance: IAsymmetricBlockCipher
Exemple #1
0
 private void CreateAcryptoEngine()
 {
     IAsymmetricBlockCipher engine;
     switch (_MSec.Algorithm)
     {
         case ESec.ACRYPTO_ELGAMAL:
             engine = new ElGamalEngine();
             break;
         case ESec.ACRYPTO_NACCACHESTERN:
             engine = new NaccacheSternEngine();
             break;
         case ESec.ACRYPTO_RSABLINDED:
             engine = new RsaBlindedEngine();
             break;
         case ESec.ACRYPTO_RSABLINDING:
             engine = new RsaBlindingEngine();
             break;
         case ESec.ACRYPTO_RSA:
             engine = new RsaEngine();
             break;
     }
 }
        public virtual byte[] ProcessBlock(byte[] inBytes, int inOff, int length)
        {
            if (this.key == null)
            {
                throw new InvalidOperationException("NaccacheStern engine not initialised");
            }
            if (length > this.GetInputBlockSize() + 1)
            {
                throw new DataLengthException("input too large for Naccache-Stern cipher.\n");
            }
            if (!this.forEncryption && length < this.GetInputBlockSize())
            {
                throw new InvalidCipherTextException("BlockLength does not match modulus for Naccache-Stern cipher.\n");
            }
            BigInteger bigInteger = new BigInteger(1, inBytes, inOff, length);

            if (this.debug)
            {
                Console.WriteLine("input as BigInteger: " + bigInteger);
            }
            byte[] result;
            if (this.forEncryption)
            {
                result = this.Encrypt(bigInteger);
            }
            else
            {
                IList list = Platform.CreateArrayList();
                NaccacheSternPrivateKeyParameters naccacheSternPrivateKeyParameters = (NaccacheSternPrivateKeyParameters)this.key;
                IList smallPrimesList = naccacheSternPrivateKeyParameters.SmallPrimesList;
                for (int i = 0; i < smallPrimesList.Count; i++)
                {
                    BigInteger bigInteger2 = bigInteger.ModPow(naccacheSternPrivateKeyParameters.PhiN.Divide((BigInteger)smallPrimesList[i]), naccacheSternPrivateKeyParameters.Modulus);
                    IList      list2       = this.lookup[i];
                    if (this.lookup[i].Count != ((BigInteger)smallPrimesList[i]).IntValue)
                    {
                        if (this.debug)
                        {
                            Console.WriteLine(string.Concat(new object[]
                            {
                                "Prime is ",
                                smallPrimesList[i],
                                ", lookup table has size ",
                                list2.Count
                            }));
                        }
                        throw new InvalidCipherTextException(string.Concat(new object[]
                        {
                            "Error in lookup Array for ",
                            ((BigInteger)smallPrimesList[i]).IntValue,
                            ": Size mismatch. Expected ArrayList with length ",
                            ((BigInteger)smallPrimesList[i]).IntValue,
                            " but found ArrayList of length ",
                            this.lookup[i].Count
                        }));
                    }
                    int num = list2.IndexOf(bigInteger2);
                    if (num == -1)
                    {
                        if (this.debug)
                        {
                            Console.WriteLine("Actual prime is " + smallPrimesList[i]);
                            Console.WriteLine("Decrypted value is " + bigInteger2);
                            Console.WriteLine(string.Concat(new object[]
                            {
                                "LookupList for ",
                                smallPrimesList[i],
                                " with size ",
                                this.lookup[i].Count,
                                " is: "
                            }));
                            for (int j = 0; j < this.lookup[i].Count; j++)
                            {
                                Console.WriteLine(this.lookup[i][j]);
                            }
                        }
                        throw new InvalidCipherTextException("Lookup failed");
                    }
                    list.Add(BigInteger.ValueOf((long)num));
                }
                BigInteger bigInteger3 = NaccacheSternEngine.chineseRemainder(list, smallPrimesList);
                result = bigInteger3.ToByteArray();
            }
            return(result);
        }