![]() |
|
|
#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)
| ||