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); }
public TempVarHolder(CipherGenContext p, Variable v) { parent = p; tempVar = v; }