using System.Collections; using System.Linq; namespace Cryptos { class Key { const int key_length = 64; BitArray key; BitArray temp_key; BitArray register19; BitArray register22; BitArray register23; public int[] shift19 { get; set; } public int[] shift22 { get; set; } public int[] shift23 { get; set; } public int majority19 { get; set; } public int majority22 { get; set; } public int majority23 { get; set; } private bool majority_winner() { int count = 0; if (register19[majority19 - 1] == true) count++; if (register22[majority22 - 1] == true) count++; if (register23[majority23 - 1] == true) count++; if (count > 1) return true; return false; } public bool Step() { bool m_winner = majority_winner(); if (register19[majority19 - 1] == m_winner) { bool new_bit = register19[shift19[0] - 1]; for(int i=1; i 0; i--) register19[i] = register19[i-1]; register19[0] = new_bit; } if (register22[majority22 - 1] == m_winner) { bool new_bit = register22[shift22[0] - 1]; for (int i = 1; i < shift22.Length; i++) new_bit = new_bit ^ register22[shift22[i] - 1]; for (int i = register22.Length - 1; i > 0; i--) register22[i] = register22[i - 1]; register22[0] = new_bit; } if (register23[majority23 - 1] == m_winner) { bool new_bit = register23[shift23[0] - 1]; for (int i = 1; i < shift23.Length; i++) new_bit = new_bit ^ register23[shift23[i] - 1]; for (int i = register23.Length - 1; i > 0; i--) register23[i] = register23[i - 1]; register23[0] = new_bit; } return register19[register19.Length - 1] ^ register22[register22.Length - 1] ^ register23[register23.Length - 1]; } //Get key STRING public string GetKeyString() { string key_string = ""; int i; for (i = 0; i < key_length; i++) { if (key[i] == true) key_string += "1"; else key_string += "0"; } return key_string; } public string ShiftString(int register) { string result = ""; int i; if (register == 19) { for (i = 0; i < shift19.Length-1; i++) result += shift19[i] + " "; result += shift19[i]; return result; } else if (register == 22) { for (i = 0; i < shift22.Length-1; i++) result += shift22[i] + " "; result += shift22[i]; return result; } else if (register == 23) { for (i = 0; i < shift23.Length-1; i++) result += shift23[i] + " "; result += shift23[i]; return result; } else throw new System.Exception("Bad register!"); } //Checks is argument valid key public bool isKey(string new_key) { if (new_key.Length != key_length) return false; int result; temp_key = new BitArray(key_length); for (int i = 0; i < key_length; i++) { if (int.TryParse(new_key[i].ToString(), out result)) { if (result == 1) temp_key[i] = true; else if (result == 0) temp_key[i] = false; else return false; } else return false; } return true; } //Checks is bit valid majority bit in register public bool isMajority(string bit, int register) { int bit_index; if (!int.TryParse(bit, out bit_index)) return false; if(register == 19 || register == 22 || register == 23) { if (bit_index > 0 && bit_index <= register) return true; return false; } return false; } //Check are bits valid shift bits in register public bool isShift(string bits, int register) { bits = bits.Trim(); string[] parts = bits.Split(' '); int result; if (parts.Length > 0) { if (register == 19 || register == 22 || register == 23) { for(int i=0; i register) return false; } return true; } return false; } else return false; } //Set argument as new key public bool SetKey(string new_key) { key = new BitArray(key_length); if (isKey(new_key)) { register19 = new BitArray(19); register22 = new BitArray(22); register23 = new BitArray(23); for (int i = 0; i < key_length; i++) { if (i < 19) register19[i] = temp_key[i]; if (i >= 19 && i < 41) register22[i-19] = temp_key[i]; if (i >= 41 && i < 64) register23[i - 41] = temp_key[i]; key[i] = temp_key[i]; } return true; } else return false; } //Set bit as new majority bit in register public bool SetMajority(string bit, int register) { if (isMajority(bit, register)) { if (register == 19) majority19 = int.Parse(bit); else if (register == 22) majority22 = int.Parse(bit); else if (register == 23) majority23 = int.Parse(bit); else return false; return true; } else return false; } //Set bit as new shift bits in register public bool SetShift(string bits, int register) { if (!isShift(bits, register)) return false; string[] parts = bits.Split(' '); if (register == 19) { if (parts.Length > 19) return false; shift19 = new int[parts.Length]; for (int i = 0; i < parts.Length; i++) shift19[i] = int.Parse(parts[i]); } else if (register == 22) { if (parts.Length > 22) return false; shift22 = new int[parts.Length]; for (int i = 0; i < parts.Length; i++) shift22[i] = int.Parse(parts[i]); } else if (register == 23) { if (parts.Length > 23) return false; shift23 = new int[parts.Length]; for (int i = 0; i < parts.Length; i++) shift23[i] = int.Parse(parts[i]); } else return false; return true; } } }