private void btnStructure_Click(object sender, EventArgs e) { int DATASIZE = (int)numBits.Value; //string rawData = "000073af00000000"; string rawData = "000000b5"; //string rawData = "73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af73af"; uint[] aa = new uint[(DATASIZE / 16 > 0) ? DATASIZE / 16 : 1]; uint[] bb = new uint[(DATASIZE / 16 > 0) ? DATASIZE / 16 : 1]; BitHolder32[] a = new BitHolder32[(DATASIZE / 16 > 0) ? DATASIZE / 16 : 1]; XORCollector32Bit[] b = new XORCollector32Bit[(DATASIZE / 16 > 0) ? DATASIZE / 16 : 1]; for (int i = 0; i < ((DATASIZE / 16 > 0) ? DATASIZE / 16 : 1); i++) { a[i] = new BitHolder32(i * 32); b[i] = new XORCollector32Bit(); aa[i] = uint.Parse(rawData.Substring(i * 8, 8), System.Globalization.NumberStyles.HexNumber); } SortedDictionary<ANDCombination, object>[] xorEq = new SortedDictionary<ANDCombination, object>[DATASIZE * 2]; for (int i = 0; i < xorEq.Length; i++) { xorEq[i] = new SortedDictionary<ANDCombination, object>(); } for (int i = 0; i < DATASIZE; i++) { for (int j = 0; j < DATASIZE; j++) { bb[(i + j) / 32] ^= (((aa[i / 32] >> (i % 32)) & (aa[j / 32 + DATASIZE / 32] >> (j + DATASIZE % 32)) & 1) << ((i + j) % 32)); ANDCombination andc = new ANDCombination(i + 1, j + DATASIZE + 1); xorEq[(i + j)][andc] = null; //if (!TestPartialEncryption(aa, bb, xorEq)) // throw new Exception("You messed up!"); } } StringBuilder sb = new StringBuilder(); AppendStructure(sb, xorEq); sb.AppendLine(); sb.AppendLine(); bb.AppendHex(sb); sb.AppendLine(); tbOut.Text = sb.ToString(); }
/// <summary> /// It doesn't matter how many XOR_0's you have because y ^ 0 = y; /// We need to track XOR_1's because y ^ 1 = !y && y ^ 1 ^ 1 = y; /// </summary> /// <param name="x"></param> public void XOR(BitHolder32 x) { for (int i = 0; i < 32; i++) { int ele0 = x.AndOperations[i][0]; // we need to check ele0 before we sort the data int ele1 = x.AndOperations[i][1]; // we need to verify consistant data if (ele0 == -2) { if (ele1 != -2) // I've programmed in some sort of logic error if this is the case. { throw new Exception("Unexpected Data"); } xor1state[i] = !xor1state[i]; throw new Exception("Unexpected Data"); } else if (ele0 == -1) { // do nothing in this case because A ^ 0 == A } else if (ele1 == -1) // ele0 should have been set to 0 (-1) also because A & 0 == 0 { // this is definately a logic error on my part. throw new Exception("Unexpected Data"); } else if (ele1 == -2) // this case is fine because ele0 & 1 == ele0 { var t = new ANDCombination(ele0, ele1); if (!xorOperations[i].Remove(t)) // if it existed in the xor chain list then remove it { // because (A ^ A ^ B) => (0 ^ B) => (B) xorOperations[i].Add(t, null); // if it wasn't in the xor chain list then we add it } throw new Exception("Unexpected Logic Path"); // I don't believe I ever set my data to look like this. // it should come in the form A & A, not A & 1. } else // both ele0 and ele1 must not be a set value of 0 or 1 (-1 or -2) now and refer to bitIDs { var t = new ANDCombination(ele0, ele1); // if it existed in the xor chain list then remove it // because (A ^ A ^ B == 0 ^ B) => (B ^ 0 == B) if (!xorOperations[i].Remove(t)) { // if it wasn't in the xor chain list then we add it xorOperations[i].Add(t, null); } } } }