По моему вопросу n = 16, но и общий ответ был бы оценен.Как поэтапно перебирать все возможные значения байтового массива размера n?
Поэтому у меня есть массив байтов:
byte[] key;
Моя проблема заключается в том, что я хочу, чтобы перебрать все возможные значения каждого элемента в этом массиве, вместе взятых. Я знаю, что это займет много времени, и я не собираюсь на самом деле завершить этот цикл, просто чтобы создать цикл, который, по крайней мере, попытается это сделать.
Так например .:
Первая итерация:
//Math.Pow(2,128) is the max no. of iterations right?
byte[] key;
for(int i = 0; i < Math.Pow(2,128); i++)
{
key = new byte[16] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}
Вторая итерация:
//Math.Pow(2,128) is the max no. of iterations right?
byte[] key;
for(int i = 0; i < Math.Pow(2,128); i++)
{
key = new byte[16] {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}
Третья итерация:
//Math.Pow(2,128) is the max no. of iterations right?
byte[] key;
for(int i = 0; i < Math.Pow(2,128); i++)
{
key = new byte[16] {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}
Final итерация:
//Math.Pow(2,128) is the max no. of iterations right?
byte[] key;
for(int i = 0; i < Math.Pow(2,128); i++)
{
key = new byte[16] {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
}
Очевидно, я просто жёстко массив выше. Мне нужен способ сделать это правильно. Опять же, я знаю, есть много различных комбинаций. Все, что мне нужно - это способ начать повторение всех возможных значений. Как я могу сделать это в моем цикле?
I.e. что я должен заменить тело моего цикла с, чтобы перебрать все возможные значения байта массива размера 16.
То, что я пытался:
В теле цикла у меня есть попробовал следующее:
key = new byte[16] { (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i, (byte)i };
Очевидно, что это неправильно, проверит только небольшое подмножество возможных значений. Просто попробуем i = 0, ..., 255, а затем начнем, когда i = 256 -> (байт) i = 0.
Я подозреваю, что мне нужно еще несколько гнездящихся. Возможно, до 16 вложенных циклов, что кажется безумным и, вероятно, неправильным? Я не могу решить эту проблему, любая помощь будет высоко оценена!
Цель: Цель этого вопроса - продемонстрировать, насколько практичным является неэффективный криптоанализ грубой силы. Остальная часть моей программы работает, я просто застрял в этом цикле.
Упростите это немного. Как бы вы справились с массивом из двух байтов? Что насчет 3? Кроме того, блог eric lippert содержит отличный пост обо всех возможных подмножествах. Я найду его для тебя в одно мгновение. –
[Есть пять частей; здесь часть первая] (http://ericlippert.com/2014/10/16/producing-combinations-part-two/). Это делает отличное чтение, особенно. о C#. –
@BenKnoble Спасибо. Я дам ему прочитать сейчас :) – DSF