|
#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)
|