Создание 2^24 таблиц, которые отличаются только на один бит с C#

В настоящее время я работаю в области криптоанализа и начал заниматься программированием на C#

Сейчас,
Чтобы найти 5 оптимальных s-блоков (я имею в виду эти 2^24 таблицы), сначала их нужно сгенерировать. Я знаю все о критериях поиска оптимальных.

Здесь sbox представляет собой таблицу 2*8, первая строка которой содержит числа от 0 до 7(двоичные:000 - 111)(как вход sbox), а во второй строке каждый вход (0 - 7) связан с числом., как показано ниже:

Первый sbox:

input     000   001 010 011 100 101 110 111  
output    000   000 000 000 000 000 000 000  

Второй sbox, который отличается только на один бит:

input   000 001 010 011 100 101 110 111  
output  001 000 000 000 000 000 000 000  

Третий, который отличается только на один бит, копируется ко второму:

input   000 001 010 011 100 101 110 111  
output  010 000 000 000 000 000 000 000  

и 2^24-й:

input   000 001 010 011 100 101 110 111  
output  111 111 111 111 111 111 111 111  

Вопрос в том, как сгенерировать эти таблицы? я не знаю, как положить для цикла или сохранить результаты в массиве отдельно для каждого sbox.

Любая помощь приветствуется.

2 ответа

Решение
for (int j = 0; j < Math.Pow(2, 24); j++)
  {
           Console.WriteLine(Convert.ToString(j, 2).PadRight(24, '0'));
  }  

Может быть, эти строки кода помогут вам:

class Program {
    static void Main( string[ ] args ) {
      Dictionary< long, Tuple <input, output> > dict = new Dictionary<long,Tuple<input,output>> () ;
      for (long i = 0 ;  i < (long) (2^28) ;  i++) {
        input ip = new input( );
        output op = new output( );
        for( int j = 0; j < 8; j++ ) {
          //you have to write your own lodic for creating input and output
          unit isp = new unit( );
          unit osp = new unit( );
          ip.iData[ j ] = isp;
          op.oData[ j ] = osp;
        }
        dict.Add( i, Tuple.Create( ip, op ) );
      }    
    }
  }

  public class input {
    public  unit [] iData = new unit [8] ; 
  }

  public class output {
    public unit[ ] oData = new unit[ 8 ];
  }

  public class unit {
    public int item1;
    public int item2;
    public int item3;
  }

Однако эту проблему можно решить разными способами.

Другие вопросы по тегам