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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.06.2010, 02:51
Hack_ERR++ Hack_ERR++ вне форума
Прохожий
 
Регистрация: 20.06.2010
Сообщения: 17
Репутация: 10
По умолчанию Составление комбинаций символов

Интересует алгоритм для составления всех возможных комбинаций из указанных символов. То есть,

a
b
c
..
z
aa
ab
..
zz
aaa

и так далее
Ответить с цитированием
  #2  
Старый 30.06.2010, 03:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Присал такое:
Код:
procedure IncTestID(var AID : String; Num : Integer);
type
  TCharSet = 'A'..'Z';
var
  C : TCharSet;
  I : Integer;
begin
  If AID = '' Then
    Begin
      AID := 'A';
      Exit;
    End;
  C := AID[Num];
  If C = 'Z'
    Then
      Begin
        C := 'A';
        If Num = 1 Then
          Begin
            AID := 'A' + AID;
            For I := 1 To Length(AID) Do AID[i] := 'A';
            WriteLn('Iteration: ' + AID);
          end
            Else IncTestID(AID,Num-1);
      End
    Else
      Begin
        C := Succ(C);
      End;
  AID[Num] := C;
end;

procedure TMyApplication.Exec;
var
  V : String;
begin
  V := '';

  While V < 'ZZZZ' Do
  Begin
    IncTestID(V,Length(V));
    WriteLn(V);
  End;
end;

только больше, чем на 3х лучше не пробовать. Уже на 4 работает очень долго...
Ответить с цитированием
  #3  
Старый 30.06.2010, 12:15
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

генерация пароль-списков )) Хакеры не спят ))
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel
Ответить с цитированием
  #4  
Старый 30.06.2010, 19:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не, не прокатит. Генерация на 4 символа (не самый длинный пароль) у меня заняла около 2 часов и создала файл примерно в 80 Гб (правда там в файле куча служебной информации на один вариант было, но не суть). Прикинь сколько займет времени и места тупая генерация хотя бы 6 символьного пароля. И это при том, что генерилось только 26 заглавных букв латинского алфавита. Добавь туда маленькие буквы, цифры и спецсимволы и ты поймешь, что это не вариант. Списки паролей генеряться немного по другому принципу...
Ответить с цитированием
  #5  
Старый 02.07.2010, 15:18
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение

Цитата:
Сообщение от lmikle
Генерация на 4 символа (не самый длинный пароль) у меня заняла около 2 часов
Омг... Посмотрел на твой алгоритм:
Использование string ? Отсутствие буферизации ? Операции вывода непосредственно при генерации ?
Я не удивляюсь такому времени работы алгоритма...
Код:
program PassGen;

{$APPTYPE CONSOLE}

uses Windows;

type TByteArray = array of byte;

const CHF = 65; // CHar First - первый символ (соотв. коду символа 'A')
      CHL = 90; // CHar Last  - последний символ (соотв. коду символа 'Z')
      CHC = CHL-CHF+1; // CHar Count - кол-во символов (90-65+1=26)
      MPL = 4; // Max Password Length - максимальная длина пароля
      // для данного алгоритма допустимы значения MPL от 1 до 5

 procedure Generate(const N:Cardinal; P:Cardinal);
 var i:Integer;
     j:Cardinal;
     X:TByteArray;
 begin
  SetLength(X,N+1);
  for i:=0 to N-1 do X[i]:=CHF;
  X[N] := 13;
  j:=0;
  repeat
   CopyMemory(Pointer(P+(N+1)*j),@X[0],N+1);
   Inc(j);
   i:=N-1;
   while (i>=0)and(X[i]=CHL) do
    begin
     X[i]:=CHF;
     Dec(i)
    end;
   if i>=0 then inc(X[i]) else Break;
  until False;
  X := nil;
 end;

var i,TmpSize,Shift : Cardinal;
    Buff : Cardinal;
    BuffSize : Cardinal;
    //
    FileOut : THandle;
    FOPath : String;
    WriteCnt:Cardinal;

begin
 // Init

 BuffSize := 0;
 TmpSize := 1;
 for i:=1 to MPL do
  begin
   TmpSize := TmpSize * CHC;
   Inc(BuffSize,TmpSize * (i+1));
  end;

 Buff := GlobalAlloc(GMEM_FIXED,BuffSize);

 // Generate

 TmpSize := 1;
 Shift := 0;
 for i:=1 to MPL do
  begin
   Generate(i,Buff + Shift);
   TmpSize := TmpSize * CHC;
   Inc(Shift,TmpSize * (i+1));
  end;

 // Output

 FOPath := ParamStr(0) + '.output.txt';
 FileOut := CreateFile(PAnsiChar(FOPath),GENERIC_WRITE,0,nil,
            CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL+FILE_FLAG_WRITE_THROUGH,0);

 TmpSize := 1;
 Shift := 0;
 for i:=1 to MPL do
  begin
   TmpSize := TmpSize * CHC ;
   WriteFile(FileOut,Pointer(Buff + Shift)^,TmpSize * (i+1),WriteCnt,nil);
   Inc(Shift,TmpSize * (i+1));
  end;

 CloseHandle(FileOut);

 GlobalFree(Buff);
end.
Вот алгоритм, который может генерировать пароли с макс. длиной 5, алфавит - заглавные от 'A' до 'Z'

Для генерации паролей большей длины его надо немного переписать:
выделять буфер меньшей длины чем необходимо, и в процессе генерации заполнять его и сохранять на диск.
(Так как для всей комбинаций паролей с длиной 6, а их 26^6 = 308915776 , необходим буфер с размером
26^6 * 7 = 2162410432 - больше 2 Гб)

PS: Про скорость алгоритма - для генерации всех паролей с длиной от 1 до 5 потребовалось ~2 сек, размер результирующего файла ~70 Мб.
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887

Последний раз редактировалось Rokuell, 02.07.2010 в 15:23.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter