2015-02-27 19 views
0

Я работаю над проектом в MATLAB, целью которого является разрыв пароля пользователя с использованием грубой силы. Я успешно настроил его на разрыв паролей длиной до восьми символов, но я хочу, чтобы он мог работать с паролями любой длины. В целом, код в основном проверяет все возможные односимвольные пароли, а затем все возможные пароли с двумя символами и т. Д. (Примечание: realpass - это пароль, введенный пользователем, угадайте, что укомплектована компьютером, alphasize - это длина алфавита символы, которые я даю MATLAB, чтобы проверить в начале сценария, то есть количество возможных символов.)MATLAB петля грубой силы

% check all 1 character passwords possible w/ given alphabet 
if strcmp(guess, realpass) == 0 
    for i = 1:alphasize(2) 
     guess(1) = alphabet(i); 
     if strcmp(guess, realpass) == 1 
      break 
     end 
    end 
end 

% the password has more than one characters, check all possible 2 character passwords 
if strcmp(guess, realpass) == 0 
    for i = 1:alphasize(2) 
     guess(1) = alphabet(i); 
     for j = 1:alphasize(2) 
      guess(2) = alphabet(j); 
      if strcmp(guess, realpass) == 1 
       break 
      end 
     end 
     if strcmp(guess, realpass) == 1 
      break 
     end 
    end 
end 

Как вы могли бы, вероятно, сказать, чтобы получить это до 8 символов, есть много копий/вставки , что является отличным индикатором того, что цикл может использоваться. Моя проблема в том, что петля ведет себя правильно. Вы можете увидеть мою попытку на github. Есть ли у кого-нибудь какие-либо советы по запуску и запуску этой вещи?

Большое спасибо!

+0

Вопрос - Почему вы не можете просто проверить каждый символ по отдельности? Например, пропустите все символы вашего алфавита для первого символа, и когда мы найдем совпадение, перейдем ко второму символу и т. Д.? Почему вы должны генерировать все возможные 1 перестановки, затем 2 перестановки и т. Д.? – rayryeng

+0

@rayryeng Я думаю, что 'strcmp' только для подделки, если пароль был найден или нет. – CitizenInsane

+0

@CitizenInsane - Я не совсем уверен, что я следую. Не могли бы вы уточнить? – rayryeng

ответ

2

Решение должно работать от линейного индекса и преобразовывать его в некоторую координату в алфавитном порядке с использованием ind2sub.

код является более понятным, чем длинное объяснение здесь моя скотина решение сила:

function [testpass] = BruteForcePassword(realpass) 
%[ 
    if (nargin < 1), realpass = 'hello'; end 

    maxPassLength = 8; 
    alphabet = 'abcdefghijklmnopqrstuvwxyz'; 

    for l = 1:maxPassLength, 

     % Number of possible password for this length 
     combinationCount = length(alphabet)^l; 

     % Put all possible combination in some sort of kilometer counter 
     % where each digit can run up to the number of elements in the alphabet 
     coordinate = cell(1,l); 
     size = length(alphabet) * ones(1,l); 

     for index = 1:combinationCount, 

      [coordinate{:}] = ind2sub(size, index); % transform linear index into coordinate 
      testpass = cellfun(@(i)alphabet(i), coordinate); % build password from current coordinate 

      % Test if password is ok 
      fprintf('Now testing: %s\n', testpass); 
      if (strcmp(testpass, realpass)) 
       break; 
      end 

     end 

     if (strcmp(testpass, realpass)) 
      break; 
     end 

    end 
%] 
end 

Некоторые объяснения

Давайте сначала рассмотрим, мы имеем алфавит из 3-х символов только (только потому, что это проще и это не теряет общности).

Когда мы проверяем проход длиной == 1, мы должны проверить все 3 позиции в векторе алфавита.

1 
2 
3 

Когда мы тестируем для прохода длиной == 2, мы должны исправить некоторые позиции в алфавите для 1-го символа и проверить все 3 позиции для второго. Затем мы фиксируем 1-й символ в другую позицию в алфавите, и мы снова тестируем все 3 позиции для второго. И последнее мы снова фиксируем позицию для 1-го символа, и мы снова тестируем все 3 позиции для 2-го.

+----- Position in the alphabet for first character 
| 
| + -------- Position in the alphabet for second character 
v v 

1 1 
1 2 
1 3 

2 1 
2 2 
2 3 

3 1 
3 2 
3 3 

Так возвращаясь к алфавиту любой длины это, как мы бежим все позиции в массиве размера NxNxN...xN где N является числом позиций в алфавите. Число измерений этого массива равно длине пароля.

В коде я использую функцию ind2sub, чтобы перестроить координату массива из положения линейного индекса.

NB: Еще один способ сказать это, как если бы мы рассчитывали в базе-N, где N - количество элементов в алфавите.

Редактировать

Поскольку число комбинаций может быстро расти (N^л) и может выйти за пределы номера системы представления для правильной линейной индексации ... здесь ссылка на обновленный код для запуска всех координатных позиций без использования линейной индексации вообще (т.е.не используя ind2sub):

>> Code without linear indexing <<

+0

Это билет. Однако короткое объяснение того, что он делает, поможет. Просто примечание, которое вы считаете в базе 'numel (alphabet)' или что-то еще. – beaker

+0

@beaker ... да, я пытался найти текстовое объяснение ... но не нашел вполне синтетического способа его выразить (даже не в моем родном языке!) ... я постараюсь подумать об этом и отредактирует мой ответ. – CitizenInsane

+1

@CitizenInsane - Да, я полностью неверно истолковал вопрос. Я дал вам +1. – rayryeng

Смежные вопросы