念のため今回のブルートフォースアタックは悪用ではありませんので。
ブルートフォースアタックのプログラムを作るうと思ったのですが、パスワード用の文字列を作成するのが簡単と思いきや挫折しました。
0〜9、a〜z、A〜Zで作ろうと思ったんですが・・・
精密には+や/等の記号も必要ですが。
1桁は簡単ですが2桁以上になったらと考えてると全然ソースロジックが思いつきません。
そういうルーチンないかと探してみましたが見つかりませんでした。
どこかにそういう関数等ないでしょうか?
>どこかにそういう関数等ないでしょうか?
+
何か書きかけが気になりますが、要はn進数ですよね。
function CharRoop(aChar:Char; Count:Integer):string;
var
i: Integer;
begin
Result := '';
for i := 0 to Count - 1 do
Result := Result + aChar;
end;
function GetString(fChars:string; n,Count: Integer): string;
var
aLen:Integer;
begin
aLen := Length(fChars);
Result := '';
repeat
Result := fChars[(Count mod aLen) +1] + Result;
Count := Count div aLen;
until Count = 0;
Result := CharRoop(fChars[1], n-Length(Result)) + Result;
end;
function GetStringAll(fChars:string; n: Integer): string;
var
aLen,aMax:Integer;
i: Integer;
begin
aLen := Length(fChars);
aMax := aLen;
for i := 0 to n - 2 do
aMax := aMax * aLen;
for i := 0 to aMax - 1 do
Result := Result + GetString(fChars,n,i) + #$D#$A;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
ListBox1.Clear;
for i := 0 to 81 - 1 do
ListBox1.Items.Add(GetString('ABC',4,i));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear;
ListBox1.Items.Text := GetStringAll('ABC',4);
end;
end.
少しだけ高速化
function GetString(fChars:string; n,Count: Integer): string;
var
aLen,p:Integer;
begin
aLen := Length(fChars);
SetLength(Result,n);
for p := 1 to n do
Result[p]:=fChars[1];
for p := n downto 1 do
begin
Result[p] := fChars[(Count mod aLen) +1];
Count := Count div aLen;
if Count=0 then Exit; //無くても可
end;
end;
すんません、これで最後。
function GetString(fChars:string; n,Count: Integer): string;
var
aLen,p:Integer;
begin
aLen := Length(fChars);
SetLength(Result,n);
for p := n downto 1 do
begin
Result[p] := fChars[(Count mod aLen) +1];
Count := Count div aLen;
end;
end;
うおおお! すごいです!
まさにこれです!
正直ソース見ても私には解読できませんが大変助かりました。
勉強させてもらいます。
ありがとうございました!
ツイート | ![]() |