Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.03.2012, 21:25
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию Перебор символов

Привет всем участникам форума ! Помогите пожалуйста в решении такой задачи :
Перебор символов ( букв англ. языка ) в Delphi 7 .
Например чтобы получалось так :
a
b
c
..
z
___
aa
ab
ac
..
zz
___ и т.д.

Размер пароля до 8 символов , и если можно пожалуйста с объяснением .
Подобных тем смотрел очень много , не очень то понятно , надеюсь здесь мне помогут . Заранее спасибо !
Ответить с цитированием
  #2  
Старый 07.03.2012, 22:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

В общем, как то так:
Код:
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  
Старый 08.03.2012, 10:12
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Делаешь масив со всеми английскими буквами. Затем запускаешь два цикла один в другом и побуквенно перебираешь. Если тебе нужен пароль с 8 символов запускай 8 циклов. Это по моему самый просто вариант тупого перебора.
Ответить с цитированием
Этот пользователь сказал Спасибо m1sclick за это полезное сообщение:
UchusNaDelhi7 (08.03.2012)
  #4  
Старый 08.03.2012, 12:08
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Почему взломщику пароля все помогают?
Ответить с цитированием
  #5  
Старый 08.03.2012, 12:11
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Делаешь масив со всеми английскими буквами. Затем запускаешь два цикла один в другом и побуквенно перебираешь. Если тебе нужен пароль с 8 символов запускай 8 циклов. Это по моему самый просто вариант тупого перебора.

С самого начала хотел с массивом , но не получилось , если можно объясните на примере ( особенно с циклами ) .
Ответить с цитированием
  #6  
Старый 08.03.2012, 12:22
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от AlexSku
Почему взломщику пароля все помогают?

Согласись , как организовать посимвольный перебор ( подбор пароля ) , в интернете уже давно есть , целое море , но я больше хочу узнать принцип перебора , нежели взломать кого -то .
Ответить с цитированием
  #7  
Старый 08.03.2012, 13:04
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Ну если говоришь что хочешь научиться то учись. А то я скину тебе код а толку для тебя ноль будет.
Создай массив с анлийским алфавитом, 8 переменных типа integer, дальше друг в друге напиши 8 циклов, а в конце добавь что-то типа Memo1.Lines.Add(alphabet[first]+alphabet[second]+alphabet[third]+...);
И на выходе получишь все возможные комбинации.
Ответить с цитированием
Этот пользователь сказал Спасибо m1sclick за это полезное сообщение:
UchusNaDelhi7 (10.03.2012)
  #8  
Старый 08.03.2012, 13:27
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Ну если говоришь что хочешь научиться то учись. А то я скину тебе код а толку для тебя ноль будет.
Создай массив с анлийским алфавитом, 8 переменных типа integer, дальше друг в друге напиши 8 циклов, а в конце добавь что-то типа Memo1.Lines.Add(alphabet[first]+alphabet[second]+alphabet[third]+...);
И на выходе получишь все возможные комбинации.

Код я и с интернета могу скопировать , вот именно что толку ноль для меня будет . Принцип ясен , приступаю к работе , по ходу написания программы отпишусь , Спасибо !

Последний раз редактировалось UchusNaDelhi7, 08.03.2012 в 13:30.
Ответить с цитированием
  #9  
Старый 08.03.2012, 15:01
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Ну если говоришь что хочешь научиться то учись. А то я скину тебе код а толку для тебя ноль будет.
Создай массив с анлийским алфавитом, 8 переменных типа integer, дальше друг в друге напиши 8 циклов, а в конце добавь что-то типа Memo1.Lines.Add(alphabet[first]+alphabet[second]+alphabet[third]+...);
И на выходе получишь все возможные комбинации.

Решил написать код не для всего Англ.алфавита , а для 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  
Старый 08.03.2012, 16:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ОК, т.е. тебе нужен перебор по некоторому алфавиту (только для англ. букв я тебе дал код). Принцип тот же, что я уже показал, только вычисление следующего символа и проверка переноса будут выполняться немного подругому.

1. Имеем массив символов, кстати, можно просто строку, с алфавитом.
2. Имеем массив интеджеров для представления текущей комбинации, где 0 означает, что место пока не заполнено. Длинна массива соответствует длинне подбираемого слова.
3. При вызове функции увеличиваем последнюю ячейку на 1. Если зачение получилось > длинны алфавита, то ставим туда 1 и увеличиваем на 1 ячейку слева (по тем же правилам).
4. Генерируем слово используя массив индексов и алфавит (тут думаю проблем не будет).

Код не даю, т.к. ты хочешь разобраться. Можешь как начало использовать тот код, что я тебе дал, просто измени его, что бы он работал с алфавитом.
Ответить с цитированием
  #11  
Старый 08.03.2012, 16:57
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ОК, т.е. тебе нужен перебор по некоторому алфавиту (только для англ. букв я тебе дал код). Принцип тот же, что я уже показал, только вычисление следующего символа и проверка переноса будут выполняться немного подругому.

1. Имеем массив символов, кстати, можно просто строку, с алфавитом.
2. Имеем массив интеджеров для представления текущей комбинации, где 0 означает, что место пока не заполнено. Длинна массива соответствует длинне подбираемого слова.
3. При вызове функции увеличиваем последнюю ячейку на 1. Если зачение получилось > длинны алфавита, то ставим туда 1 и увеличиваем на 1 ячейку слева (по тем же правилам).
4. Генерируем слово используя массив индексов и алфавит (тут думаю проблем не будет).

Код не даю, т.к. ты хочешь разобраться. Можешь как начало использовать тот код, что я тебе дал, просто измени его, что бы он работал с алфавитом.

Спасибо большое , только проблема в том что я в Delphi 7 составлял только программы для вычисления интегралов , вычисления матриц и т.п. и поэтому код , который вы прислали , немножко трудноват , мне сначала надо разобрать и понять что за что отвечает ( в коде программы ) , если можно конечно , объясните принцип работы вашей программы ( в основном так понятно , но поверхностно ).

Последний раз редактировалось UchusNaDelhi7, 08.03.2012 в 17:01.
Ответить с цитированием
  #12  
Старый 10.03.2012, 12:48
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Делаешь масив со всеми английскими буквами. Затем запускаешь два цикла один в другом и побуквенно перебираешь. Если тебе нужен пароль с 8 символов запускай 8 циклов. Это по моему самый просто вариант тупого перебора.

Спасибо большое еще раз , все гениальное - просто ! Сел с ручкой и листом А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  
Старый 10.03.2012, 13:02
UchusNaDelhi7 UchusNaDelhi7 вне форума
Прохожий
 
Регистрация: 07.03.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от AlexSku
Почему взломщику пароля все помогают?

Для 9-значного " пароля " - Предполагая , что в пароле могут использоваться 36 различных символов (английские буквы одного регистра + цифры), а скорость перебора составляет 100 000 паролей в секунду ( скорость может быть намного меньше ) , то получим 1,015 599 5 x 100000000000000 вариантов , время перебора составит 32 года . Для 8-ми символов займет 11 месяцев .
Ответить с цитированием
  #14  
Старый 10.03.2012, 13:44
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

PHP код:
const ABCstring 'abcdefghijklmnopqrstuvwxyz'
остальной код тоже можно сократить, но за счёт скорости выполнения
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
UchusNaDelhi7 (10.03.2012)
  #15  
Старый 10.03.2012, 15:05
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Ну блин, неужели ты не слишал о цикле for? Такой код не красивый(
Ответить с цитированием
Этот пользователь сказал Спасибо m1sclick за это полезное сообщение:
UchusNaDelhi7 (10.03.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter