![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Привет всем участникам форума ! Помогите пожалуйста в решении такой задачи : 
		
	
		
		
		
		
		
	
		
		
	
	
	Перебор символов ( букв англ. языка ) в Delphi 7 . Например чтобы получалось так : a b c .. z ___ aa ab ac .. zz ___ и т.д. Размер пароля до 8 символов , и если можно пожалуйста с объяснением . Подобных тем смотрел очень много , не очень то понятно , надеюсь здесь мне помогут . Заранее спасибо !  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну, идея в том, что тебе надо просто перебирать последний символ. Если только буквы, то это довольно просто: 
		
	
		
		
		
		
		
	
		
		
	
	
	В общем, как то так: Код: 
	function GetNextValue(var AValue : String) : Boolean;
  procedure IncValue(var AValue : String; AIndex : Integer);
  var
    Ch : Char;
  begin
    If (AIndex < 1) Or (AIndex > Length(AValue)) Then 
     Raise Exception.Create('Index out of bounds');
    Ch := AValue[AIndex];
    If Ch <> 'z' Then AValue[AIndex] := Chr(Ord(Ch) + 1) Else
      Begin
        AValue[AIndex] := 'a';
        If AIndex = 1 
          Then AValue := 'a' + AValue 
          Else IncValue(AValue,AIndex-1);
      End;
  end;
begin
  Result := True;
  If AValue = '' Then AValue := 'a' Else
    If AValue = 'zzzzzzzz' Then Result := False Else
        IncValue(AValue,Length(AValue);
end;Код не проверял. Просто идея.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
UchusNaDelhi7 (08.03.2012)
  | ||
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Делаешь масив со всеми английскими буквами. Затем запускаешь два цикла один в другом и побуквенно перебираешь. Если тебе нужен пароль с 8 символов запускай 8 циклов. Это по моему самый просто вариант тупого перебора. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо m1sclick за это полезное сообщение: | ||
 
UchusNaDelhi7 (08.03.2012)
  | ||
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Почему взломщику пароля все помогают? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 С самого начала хотел с массивом , но не получилось , если можно объясните на примере ( особенно с циклами ) .  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Согласись , как организовать посимвольный перебор ( подбор пароля ) , в интернете уже давно есть , целое море , но я больше хочу узнать принцип перебора , нежели взломать кого -то .  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну если говоришь что хочешь научиться то учись. А то я скину тебе код а толку для тебя ноль будет. 
		
	
		
		
		
		
		
	
		
		
	
	
	Создай массив с анлийским алфавитом, 8 переменных типа integer, дальше друг в друге напиши 8 циклов, а в конце добавь что-то типа Memo1.Lines.Add(alphabet[first]+alphabet[second]+alphabet[third]+...); И на выходе получишь все возможные комбинации.  | 
| Этот пользователь сказал Спасибо m1sclick за это полезное сообщение: | ||
 
UchusNaDelhi7 (10.03.2012)
  | ||
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Код я и с интернета могу скопировать , вот именно что толку ноль для меня будет . Принцип ясен , приступаю к работе , по ходу написания программы отпишусь , Спасибо ! Последний раз редактировалось UchusNaDelhi7, 08.03.2012 в 13:30.  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Решил написать код не для всего Англ.алфавита , а для 3 букв : a,b,c ( для начала , что бы не запутаться ) , но не знаю как поставить оператор цикла и правильно организовать вывод результатов . Вот мой примитивный код : Код: 
	procedure TForm1.Button1Click(Sender: TObject);
var
Abc : array [1..3] of char; // массив с алфавитом
k,n,m ,i: integer;
begin
 Abc[1]:='a';
 Abc[2]:='b';
 Abc[3]:='c';
 k:=0;
    
       While k<=2 do //  первый оператор цикла
       begin  // начало первого оператора цикла
       k:=k+1;
       Memo1.Lines.Add(Abc[k]);
       end  // коней первого оператора цикла
       ...
 ... // Место для других операторов цикла
...
end;
end.т.к. пока один оператор цикла , то в Memo1 у меня получилось так : a , b , c ( т.е. как и должно быть ). Последний раз редактировалось lmikle, 08.03.2012 в 16:38.  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 ОК, т.е. тебе нужен перебор по некоторому алфавиту (только для англ. букв я тебе дал код). Принцип тот же, что я уже показал, только вычисление следующего символа и проверка переноса будут выполняться немного подругому. 
		
	
		
		
		
		
		
	
		
		
	
	
	1. Имеем массив символов, кстати, можно просто строку, с алфавитом. 2. Имеем массив интеджеров для представления текущей комбинации, где 0 означает, что место пока не заполнено. Длинна массива соответствует длинне подбираемого слова. 3. При вызове функции увеличиваем последнюю ячейку на 1. Если зачение получилось > длинны алфавита, то ставим туда 1 и увеличиваем на 1 ячейку слева (по тем же правилам). 4. Генерируем слово используя массив индексов и алфавит (тут думаю проблем не будет). Код не даю, т.к. ты хочешь разобраться. Можешь как начало использовать тот код, что я тебе дал, просто измени его, что бы он работал с алфавитом.  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Спасибо большое , только проблема в том что я в Delphi 7 составлял только программы для вычисления интегралов , вычисления матриц и т.п. и поэтому код , который вы прислали , немножко трудноват , мне сначала надо разобрать и понять что за что отвечает ( в коде программы ) , если можно конечно , объясните принцип работы вашей программы ( в основном так понятно , но поверхностно ). Последний раз редактировалось UchusNaDelhi7, 08.03.2012 в 17:01.  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Спасибо большое еще раз , все гениальное - просто ! Сел с ручкой и листом А4 и писал программу , принцип очень простой как оказалось , написал для 9-значного " пароля " , отладил , все работает . А вот и код : Код: 
	procedure TForm1.Button1Click(Sender: TObject);
var
Abc : array [1..26] of char;
a,b,c,d,e,f,g,h,i: integer;
begin
 Abc[1]:='a';
 Abc[2]:='b';
 Abc[3]:='c';
 Abc[4]:='d';
 Abc[5]:='e';
 Abc[6]:='f';
 Abc[7]:='g';
 Abc[8]:='h';
 Abc[9]:='i';
 Abc[10]:='j';
 Abc[11]:='k';
 Abc[12]:='l';
 Abc[13]:='m';
 Abc[14]:='n';
 Abc[15]:='o';
 Abc[16]:='p';
 Abc[17]:='q';
 Abc[18]:='r';
 Abc[19]:='s';
 Abc[20]:='t';
 Abc[21]:='u';
 Abc[22]:='v';
 Abc[23]:='w';
 Abc[24]:='x';
 Abc[25]:='y';
 Abc[26]:='z';
 a:=0;
 While a<=25 do   // 1 цикл
 begin
 a:=a+1;
 b:=0;
  While b<=25 do   // 2 цикл
  begin
  b:=b+1;
  c:=0;
   While c<=25 do   // 3 цикл
   begin
   c:=c+1;
   d:=0;
    While d<=25 do   // 4 цикл
    begin
    d:=d+1;
    e:=0;
     While e<=25 do   // 5 цикл
     begin
     e:=e+1;
     f:=0;
      While f<=25 do   // 6 цикл
      begin
      f:=f+1;
      g:=0;
       While g<=25 do   // 7 цикл
       begin
       g:=g+1;
       h:=0;
        While h<=25 do   // 8 цикл
        begin
        h:=h+1;
        i:=0;
         While i<=25 do   // 9 цикл
         begin
         i:=i+1;
 Memo1.Lines.Add(Abc[a]+Abc[b]+Abc[c]+Abc[d]+Abc[e]+Abc[f]+Abc[g]+Abc[h]+Abc[i]);
         end
        end
       end
      end
     end
    end
   end
  end ;
 end;
end;В Memo1 получается полный перебор букв Англ. алфавита ( правда по времени очень , очень долго , тем более для 9 знаков ) . Спасибо всем участникам форума за помощь !  | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Для 9-значного " пароля " - Предполагая , что в пароле могут использоваться 36 различных символов (английские буквы одного регистра + цифры), а скорость перебора составляет 100 000 паролей в секунду ( скорость может быть намного меньше ) , то получим 1,015 599 5 x 100000000000000 вариантов , время перебора составит 32 года . Для 8-ми символов займет 11 месяцев .  | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 PHP код: 
	
		
	![]()  | 
| Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
 
UchusNaDelhi7 (10.03.2012)
  | ||
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну блин, неужели ты не слишал о цикле for? Такой код не красивый( 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| Этот пользователь сказал Спасибо m1sclick за это полезное сообщение: | ||
 
UchusNaDelhi7 (10.03.2012)
  | ||