我无法理解我最初认为相对简单的算法。
基本上,用户输入一个4长度的数字组合(0 - 9),我想要一个算法,它将尝试每个可能的组合,直到它与用户输入的组合相匹配。
正如我所说,嵌套循环或其他东西可能很简单,但我无法理解它。
感谢任何帮助。我顺便使用了delphi。
答案 0 :(得分:6)
问题似乎是询问如何使用数字'0'
到'9'
生成所有4位数字符串。
您可以通过for
循环和Format
调用轻松完成此操作:
for i := 0 to 9999 do
str := Format('%.4d', [i]);
格式字符串中的精度说明符确保字符串为零填充。
答案 1 :(得分:4)
for i := 1 to 9999 do
TryCombo(i);
不需要执行嵌套循环。如果你需要它们的字符形式,那么使用IntToStr比使用组合和嵌套循环更容易。如果必须填充,则使用简单的填充循环:
s:= inttostr(i);
while length(s) < 4 do
s := '0' + s;
答案 2 :(得分:2)
虽然@Simpson Bart回答是针对您的具体问题的最快解决方案,但我觉得您可能是一名计算机科学专业的学生,并且您已将此任务作为家庭作业。
如果是这种情况,我认为您的老师/专业人员可能希望看到您实施一个自定义计数器,您将使用该计数器测试所有可能的组合,直到您找到核心组合。
如果以这种方式查找密码,这称为暴力攻击。
那你怎么做?
首先考虑数学和使用不同的数字系统。为什么?为了实现自定义计数器,你实际上必须创建自定义数字系统。数字系统的基数是可以在密码中使用的可用字符数。在你的情况下是10(0,1,2,3,4,5,6,7,8,9)。
您要做的第二件事是创建一个包含所有可能字符的字符串。我们稍后通过它们的索引(即字符串中的位置)来查找特定字符来使用它。
然后,您只需在新数字系统中计算,并通过从包含所有可能字符的字符串中指定特定字符来生成可信密码。您可以通过读取位置由数字系统中特定数字的值确定的特定字符来完成此操作。
最后,您要测试生成的密码是否与您正在寻找的密码相同。
我希望我对你如何处理这个问题的解释是可以理解的,因为我不是一个说英语的人,所以我没有用最好的方式表达自己。
如果不是,我也在下面发布一个代码示例,其中包含可能更容易理解的评论。
const
//String containing all possible lower case leters and numbers of english alphabet
CPossibleLowercaseLetersNumbersChars: AnsiString = '0123456789abcdefghijklmnopqrstuvwxz';
//String containing all possible chars used in HexDecimal numeral system
CPossibleHexChars: AnsiString = '0123456789abcdef';
implementation
function BruteForcePasswordFinder(InputStr: AnsiString; PossibleChars: AnsiString): AnsiString;
var Num1, Num2, Num3, Num4: Integer; //Could use Byte (integer from 0 to 255) instead
//String for temporary storing password string we generate
TempPassString: AnsiString;
begin
//Set initial conditions
Num1 := 0;
Num2 := 0;
Num3 := 0;
Num4 := 0;
Result := '';
//Check to see if password is all zeros
//First set the legth of temporary password string to have the same number of characters
//as possible password
SetLength(TempPassString,4);
//Set each character of the temporary password string.
//We read the characters from an array storing all posible hcaracters by specifying characters
//index position in that array
//NOTE Unless you are using newer versions of Delphi and compiling for Android first character
//in string has index of 1 so we have to add 1 to the Num1, Num2, Num3, Num4 value
TempPassString[1] := PossibleChars[Num1+1];
TempPassString[2] := PossibleChars[Num2+1];
TempPassString[3] := PossibleChars[Num3+1];
TempPassString[4] := PossibleChars[Num4+1];
//Check to see if temporary password string matches with the imput password string
if TempPassString = InputStr then
begin
//Set result to matching code
Result := TempPassString;
//Use Exit call to prematurely end the function so we don't waste time testing
//all remaining password combinations
Exit;
end;
//Custom counter implementation
while Result = '' do
begin
//Increase the last number count by one
Num4 := Num4+1;
//Check to see if the Num4 is greater than specific base number
//Base number is number of posible digit representations
//- 0 and 1 in Binary numeral system
//- 0 to 9 in Decimal numeral system
//- 0 to 9 and A B C D E F in HexDecimal numeral system
//In our case base number is the number of posible characters (Lenght of PossibleChars)
//If it is increase the Num3 and set Num4 to 0 just like you increase tens in Decimal
//numeral sytem and stes ones back to 0
if Num4 > Length(PossibleChars) then
begin
Num4 := 0;
Num3 := Num3+1;
//Check to see if Num3 is greater than specific base number
//If it is increase the Num2 by 1 and set Num3 back to 0
if Num3 > Length(PossibleChars) then
begin
Num3 := 0;
Num2 := Num2+1;
//Check to see if Num2 is greater than specific base number
//If it is increase the Num1 by 1 and set Num2 back to 0
if Num2 > Length(PossibleChars) then
begin
Num2 := 0;
Num1 := Num1+1;
end;
end;
end;
//Prepare temp password string for comparison
TempPassString[1] := PossibleChars[Num1+1];
TempPassString[2] := PossibleChars[Num2+1];
TempPassString[3] := PossibleChars[Num3+1];
TempPassString[4] := PossibleChars[Num4+1];
//Check to see if temporary password string matches with the imput password string
if TempPassString = InputStr then
begin
//Set result to matching code
Result := TempPassString;
//Use Exit call to prematurely end the function so we don't waste time testing
//all remaining password combinations
Exit;
end;
end;
end;
用法示例
procedure TForm1.Button1Click(Sender: TObject);
var FoundPassword: String;
begin
FoundPassword := BruteForcePasswordFinder('59dg',CPossibleLowercaseLetersNumbersChars);
ShowMessage('Found password is: '+FoundPassword);
end;
免责声明:我之所以将我的代码放入一个将找到的代码作为字符串结果返回的功能的原因是因为在实际情况下你可能无法根据实际密码测试你的密码(其他人不需要所有密码)但是你可能会检查是否将猜测密码提供给其他算法(例如MD5哈希算法)会产生与输入数据相同的结果(大多数服务器将密码存储为哈希表示,从而阻止服务器所有者查看密码实际存储。)
答案 3 :(得分:1)
从Delphi XE7开始,您可以使用新的并行编程库,使用TParallel.For运行具有更多线程的算法:
TParallel.For (lowerBound, upperBound, Method);
TParallel.For(1, Max, procedure(I: Integer)
begin
if TryCode(I) then
begin
WriteLn(I);
end
end);
但是我看不到有条件地终止并行处理。