![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Интересует алгоритм для составления всех возможных комбинаций из указанных символов. То есть,
a b c .. z aa ab .. zz aaa и так далее |
|
#2
|
|||
|
|||
|
Присал такое:
Код:
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
|
||||
|
||||
|
генерация пароль-списков )) Хакеры не спят ))
|
|
#4
|
|||
|
|||
|
Не, не прокатит. Генерация на 4 символа (не самый длинный пароль) у меня заняла около 2 часов и создала файл примерно в 80 Гб (правда там в файле куча служебной информации на один вариант было, но не суть). Прикинь сколько займет времени и места тупая генерация хотя бы 6 символьного пароля. И это при том, что генерилось только 26 заглавных букв латинского алфавита. Добавь туда маленькие буквы, цифры и спецсимволы и ты поймешь, что это не вариант. Списки паролей генеряться немного по другому принципу...
|
|
#5
|
||||
|
||||
|
Цитата:
Использование 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.Для генерации паролей большей длины его надо немного переписать: выделять буфер меньшей длины чем необходимо, и в процессе генерации заполнять его и сохранять на диск. (Так как для всей комбинаций паролей с длиной 6, а их 26^6 = 308915776 , необходим буфер с размером 26^6 * 7 = 2162410432 - больше 2 Гб) PS: Про скорость алгоритма - для генерации всех паролей с длиной от 1 до 5 потребовалось ~2 сек, размер результирующего файла ~70 Мб. Последний раз редактировалось Rokuell, 02.07.2010 в 15:23. |