Esempio n. 1
0
        public static void GeneratePair(RandomGenerator random, out StatementBlock encrypt, out StatementBlock decrypt)
        {
            double varPrecentage = 1 + ((random.NextDouble() * 2) - 1) * VARIANCE;
            var    totalElements = (int)(((random.NextDouble() + 1) * RATIO_SUM) * varPrecentage);

            var elems = new List <CryptoElement>();

            for (int i = 0; i < totalElements * MAT_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new Matrix());
            }
            for (int i = 0; i < totalElements * NUMOP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new NumOp());
            }
            for (int i = 0; i < totalElements * SWAP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new Swap());
            }
            for (int i = 0; i < totalElements * BINOP_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new BinOp());
            }
            for (int i = 0; i < totalElements * ROTATE_RATIO / RATIO_SUM; i++)
            {
                elems.Add(new RotateBit());
            }
            for (int i = 0; i < 16; i++)
            {
                elems.Add(new AddKey(i));
            }
            Shuffle(random, elems);


            int[] x       = Enumerable.Range(0, 16).ToArray();
            int   index   = 16;
            bool  overdue = false;

            foreach (CryptoElement elem in elems)
            {
                elem.Initialize(random);
                for (int i = 0; i < elem.DataCount; i++)
                {
                    if (index == 16)
                    {
                        overdue = true;                         // Can't shuffle now to prevent duplication
                        index   = 0;
                    }
                    elem.DataIndexes[i] = x[index++];
                }
                if (overdue)
                {
                    Shuffle(random, x);
                    index   = 0;
                    overdue = false;
                }
            }

            var encryptContext = new CipherGenContext(random, 16);

            foreach (CryptoElement elem in elems)
            {
                elem.Emit(encryptContext);
            }
            encrypt = encryptContext.Block;
            PostProcessStatements(encrypt, random);


            var decryptContext = new CipherGenContext(random, 16);

            foreach (CryptoElement elem in Enumerable.Reverse(elems))
            {
                elem.EmitInverse(decryptContext);
            }
            decrypt = decryptContext.Block;
            PostProcessStatements(decrypt, random);
        }
Esempio n. 2
0
 public TempVarHolder(CipherGenContext p, Variable v)
 {
     parent  = p;
     tempVar = v;
 }