public override void EmitInverse(CipherGenContext context) { Expression a = context.GetDataExpression(DataIndexes[0]); Expression b = context.GetDataExpression(DataIndexes[1]); switch (Operation) { case CryptoBinOps.Add: context.Emit(new AssignmentStatement { Value = a - b, Target = a }); break; case CryptoBinOps.Xor: context.Emit(new AssignmentStatement { Value = a ^ b, Target = a }); break; case CryptoBinOps.Xnor: context.Emit(new AssignmentStatement { Value = a ^ (~b), Target = a }); break; } }
public override void EmitInverse(CipherGenContext context) { Expression val = context.GetDataExpression(DataIndexes[0]); switch (Operation) { case CryptoNumOps.Add: context.Emit(new AssignmentStatement { Value = val - (LiteralExpression)InverseKey, Target = val }); break; case CryptoNumOps.Xor: context.Emit(new AssignmentStatement { Value = val ^ (LiteralExpression)InverseKey, Target = val }); break; case CryptoNumOps.Mul: context.Emit(new AssignmentStatement { Value = val * (LiteralExpression)InverseKey, Target = val }); break; case CryptoNumOps.Xnor: context.Emit(new AssignmentStatement { Value = val ^ (LiteralExpression)InverseKey, Target = val }); break; } }
void EmitCore(CipherGenContext context) { Expression val = context.GetDataExpression(Index); context.Emit(new AssignmentStatement { Value = val ^ context.GetKeyExpression(Index), Target = val }); }
private void EmitCore(CipherGenContext context) { Expression a = context.GetDataExpression(DataIndexes[0]); Expression b = context.GetDataExpression(DataIndexes[1]); VariableExpression tmp; if (Mask == 0xffffffff) { /* t = a * k; a = b; b = t * k^-1; */ using (context.AcquireTempVar(out tmp)) { context.Emit(new AssignmentStatement { Value = a * (LiteralExpression)Key, Target = tmp }).Emit(new AssignmentStatement { Value = b, Target = a }).Emit(new AssignmentStatement { Value = tmp * (LiteralExpression)MathsUtils.modInv(Key), Target = b }); } } else { var mask = (LiteralExpression)Mask; var notMask = (LiteralExpression)~Mask; /* t = (a & mask) * k; a = a & (~mask) | (b & mask); b = b & (~mask) | (t * k^-1); */ using (context.AcquireTempVar(out tmp)) { context.Emit(new AssignmentStatement { Value = (a & mask) * (LiteralExpression)Key, Target = tmp }).Emit(new AssignmentStatement { Value = (a & notMask) | (b & mask), Target = a }).Emit(new AssignmentStatement { Value = (b & notMask) | (tmp * (LiteralExpression)MathsUtils.modInv(Key)), Target = b }); } } }
public override void EmitInverse(CipherGenContext context) { Expression val = context.GetDataExpression(DataIndexes[0]); VariableExpression tmp; using (context.AcquireTempVar(out tmp)) { if (IsAlternate) context.Emit(new AssignmentStatement { Value = (val << (32 - Bits)), Target = tmp }).Emit(new AssignmentStatement { Value = (val >> Bits) | tmp, Target = val }); else context.Emit(new AssignmentStatement { Value = (val >> (32 - Bits)), Target = tmp }).Emit(new AssignmentStatement { Value = (val << Bits) | tmp, Target = val }); } }
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; }
public override void EmitInverse(CipherGenContext context) { EmitCore(context); }
public abstract void EmitInverse(CipherGenContext context);
public abstract void Emit(CipherGenContext context);
void EmitCore(CipherGenContext context, uint[,] k) { Expression a = context.GetDataExpression(DataIndexes[0]); Expression b = context.GetDataExpression(DataIndexes[1]); Expression c = context.GetDataExpression(DataIndexes[2]); Expression d = context.GetDataExpression(DataIndexes[3]); VariableExpression ta, tb, tc, td; Func<uint, LiteralExpression> l = v => (LiteralExpression)v; using (context.AcquireTempVar(out ta)) using (context.AcquireTempVar(out tb)) using (context.AcquireTempVar(out tc)) using (context.AcquireTempVar(out td)) { context.Emit(new AssignmentStatement { Value = a * l(k[0, 0]) + b * l(k[0, 1]) + c * l(k[0, 2]) + d * l(k[0, 3]), Target = ta }).Emit(new AssignmentStatement { Value = a * l(k[1, 0]) + b * l(k[1, 1]) + c * l(k[1, 2]) + d * l(k[1, 3]), Target = tb }).Emit(new AssignmentStatement { Value = a * l(k[2, 0]) + b * l(k[2, 1]) + c * l(k[2, 2]) + d * l(k[2, 3]), Target = tc }).Emit(new AssignmentStatement { Value = a * l(k[3, 0]) + b * l(k[3, 1]) + c * l(k[3, 2]) + d * l(k[3, 3]), Target = td }) .Emit(new AssignmentStatement { Value = ta, Target = a }) .Emit(new AssignmentStatement { Value = tb, Target = b }) .Emit(new AssignmentStatement { Value = tc, Target = c }) .Emit(new AssignmentStatement { Value = td, Target = d }); } }
public override void Emit(CipherGenContext context) { EmitCore(context, Key); }