stoneman

A51

Nov 11th, 2015
508
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.58 KB | None | 0 0
  1. using System.Collections;
  2. using System.Linq;
  3.  
  4. namespace Cryptos
  5. {
  6.     class Key
  7.     {
  8.         const int key_length = 64;
  9.  
  10.         BitArray key;
  11.         BitArray temp_key;
  12.  
  13.         BitArray register19;
  14.         BitArray register22;
  15.         BitArray register23;
  16.  
  17.         public int[] shift19 { get; set; }
  18.         public int[] shift22 { get; set; }
  19.         public int[] shift23 { get; set; }
  20.  
  21.         public int majority19 { get; set; }
  22.         public int majority22 { get; set; }
  23.         public int majority23 { get; set; }
  24.  
  25.         private bool majority_winner()
  26.         {
  27.             int count = 0;
  28.             if (register19[majority19 - 1] == true)
  29.                 count++;
  30.  
  31.             if (register22[majority22 - 1] == true)
  32.                 count++;
  33.  
  34.             if (register23[majority23 - 1] == true)
  35.                 count++;
  36.  
  37.             if (count > 1)
  38.                 return true;
  39.  
  40.             return false;
  41.         }
  42.         public bool Step()
  43.         {
  44.             bool m_winner = majority_winner();
  45.  
  46.             if (register19[majority19 - 1] == m_winner)
  47.             {
  48.                 bool new_bit = register19[shift19[0] - 1];
  49.                 for(int i=1; i<shift19.Length; i++)
  50.                     new_bit = new_bit ^ register19[shift19[i] - 1];
  51.  
  52.                 for (int i = register19.Length-1; i > 0; i--)
  53.                     register19[i] = register19[i-1];
  54.  
  55.                 register19[0] = new_bit;
  56.             }
  57.  
  58.             if (register22[majority22 - 1] == m_winner)
  59.             {
  60.                 bool new_bit = register22[shift22[0] - 1];
  61.                 for (int i = 1; i < shift22.Length; i++)
  62.                     new_bit = new_bit ^ register22[shift22[i] - 1];
  63.  
  64.                 for (int i = register22.Length - 1; i > 0; i--)
  65.                     register22[i] = register22[i - 1];
  66.  
  67.                 register22[0] = new_bit;
  68.             }
  69.  
  70.             if (register23[majority23 - 1] == m_winner)
  71.             {
  72.                 bool new_bit = register23[shift23[0] - 1];
  73.                 for (int i = 1; i < shift23.Length; i++)
  74.                     new_bit = new_bit ^ register23[shift23[i] - 1];
  75.  
  76.                 for (int i = register23.Length - 1; i > 0; i--)
  77.                     register23[i] = register23[i - 1];
  78.  
  79.                 register23[0] = new_bit;
  80.             }
  81.  
  82.             return register19[register19.Length - 1] ^ register22[register22.Length - 1] ^ register23[register23.Length - 1];
  83.  
  84.         }
  85.  
  86.         //Get key STRING
  87.         public string GetKeyString()
  88.         {
  89.             string key_string = "";
  90.             int i;
  91.             for (i = 0; i < key_length; i++)
  92.             {
  93.                 if (key[i] == true)
  94.                     key_string += "1";
  95.                 else
  96.                     key_string += "0";
  97.             }
  98.                
  99.  
  100.             return key_string;
  101.         }
  102.  
  103.         public string ShiftString(int register)
  104.         {
  105.             string result = "";
  106.             int i;
  107.             if (register == 19)
  108.             {
  109.                 for (i = 0; i < shift19.Length-1; i++)
  110.                     result += shift19[i] + " ";
  111.                 result += shift19[i];
  112.                 return result;
  113.             }
  114.             else if (register == 22)
  115.             {
  116.                 for (i = 0; i < shift22.Length-1; i++)
  117.                     result += shift22[i] + " ";
  118.                 result += shift22[i];
  119.                 return result;
  120.             }
  121.             else if (register == 23)
  122.             {
  123.                 for (i = 0; i < shift23.Length-1; i++)
  124.                     result += shift23[i] + " ";
  125.                 result += shift23[i];
  126.                 return result;
  127.             }
  128.             else
  129.                 throw new System.Exception("Bad register!");
  130.         }
  131.  
  132.         //Checks is argument valid key
  133.         public bool isKey(string new_key)
  134.         {
  135.             if (new_key.Length != key_length)
  136.                 return false;
  137.  
  138.             int result;
  139.             temp_key = new BitArray(key_length);
  140.  
  141.             for (int i = 0; i < key_length; i++)
  142.             {
  143.                 if (int.TryParse(new_key[i].ToString(), out result))
  144.                 {
  145.                     if (result == 1)
  146.                         temp_key[i] = true;
  147.                     else if (result == 0)
  148.                         temp_key[i] = false;
  149.                     else
  150.                         return false;
  151.                 }
  152.                 else
  153.                     return false;
  154.             }
  155.  
  156.             return true;
  157.         }
  158.  
  159.         //Checks is bit valid majority bit in register
  160.         public bool isMajority(string bit, int register)
  161.         {
  162.             int bit_index;
  163.  
  164.             if (!int.TryParse(bit, out bit_index))
  165.                 return false;
  166.  
  167.             if(register == 19 || register == 22 || register == 23)
  168.             {
  169.                 if (bit_index > 0 && bit_index <= register)
  170.                     return true;
  171.  
  172.                 return false;
  173.             }
  174.  
  175.             return false;
  176.         }
  177.  
  178.  
  179.         //Check are bits valid shift bits in register
  180.         public bool isShift(string bits, int register)
  181.         {
  182.             bits = bits.Trim();
  183.             string[] parts = bits.Split(' ');
  184.             int result;
  185.  
  186.             if (parts.Length > 0)
  187.             {
  188.                 if (register == 19 || register == 22 || register == 23)
  189.                 {
  190.                     for(int i=0; i<parts.Length; i++)
  191.                     {
  192.                         if (!int.TryParse(parts[i], out result))
  193.                             return false;
  194.                         else
  195.                             if (result < 1 || result > register)
  196.                                 return false;
  197.                     }
  198.  
  199.                     return true;
  200.                 }
  201.  
  202.                 return false;
  203.             }
  204.             else
  205.                 return false;
  206.         }
  207.  
  208.         //Set argument as new key
  209.         public bool SetKey(string new_key)
  210.         {
  211.             key = new BitArray(key_length);
  212.             if (isKey(new_key))
  213.             {
  214.                 register19 = new BitArray(19);
  215.                 register22 = new BitArray(22);
  216.                 register23 = new BitArray(23);
  217.  
  218.                 for (int i = 0; i < key_length; i++)
  219.                 {
  220.                     if (i < 19)
  221.                         register19[i] = temp_key[i];
  222.  
  223.                     if (i >= 19 && i < 41)
  224.                         register22[i-19] = temp_key[i];
  225.  
  226.                     if (i >= 41 && i < 64)
  227.                         register23[i - 41] = temp_key[i];
  228.  
  229.                     key[i] = temp_key[i];
  230.                 }
  231.  
  232.                 return true;
  233.             }
  234.             else
  235.                 return false;
  236.         }
  237.  
  238.         //Set bit as new majority bit in register
  239.         public bool SetMajority(string bit, int register)
  240.         {
  241.             if (isMajority(bit, register))
  242.             {
  243.                 if (register == 19)
  244.                     majority19 = int.Parse(bit);
  245.                 else if (register == 22)
  246.                     majority22 = int.Parse(bit);
  247.                 else if (register == 23)
  248.                     majority23 = int.Parse(bit);
  249.                 else
  250.                     return false;
  251.  
  252.                 return true;
  253.             }
  254.             else
  255.                 return false;
  256.         }
  257.  
  258.         //Set bit as new shift bits in register
  259.         public bool SetShift(string bits, int register)
  260.         {
  261.             if (!isShift(bits, register))
  262.                 return false;
  263.  
  264.             string[] parts = bits.Split(' ');
  265.  
  266.             if (register == 19)
  267.             {
  268.                 if (parts.Length > 19)
  269.                     return false;
  270.  
  271.                 shift19 = new int[parts.Length];
  272.  
  273.                 for (int i = 0; i < parts.Length; i++)
  274.                     shift19[i] = int.Parse(parts[i]);
  275.             }
  276.             else if (register == 22)
  277.             {
  278.                 if (parts.Length > 22)
  279.                     return false;
  280.  
  281.                 shift22 = new int[parts.Length];
  282.  
  283.                 for (int i = 0; i < parts.Length; i++)
  284.                     shift22[i] = int.Parse(parts[i]);
  285.             }
  286.             else if (register == 23)
  287.             {
  288.                 if (parts.Length > 23)
  289.                     return false;
  290.  
  291.                 shift23 = new int[parts.Length];
  292.  
  293.                 for (int i = 0; i < parts.Length; i++)
  294.                     shift23[i] = int.Parse(parts[i]);
  295.             }
  296.             else
  297.                 return false;
  298.  
  299.             return true;
  300.  
  301.         }
  302.     }
  303. }
Advertisement
Add Comment
Please, Sign In to add comment