TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
l k
NA
1
656
Resumable brute force algorithm
Jun 9 2016 5:40 AM
Hi
I have a few password protected ZIP files I created about 10 years ago, unfortunately i forgot password to it. I've found algorithm created by jwoschitz from github that I want to use. With long passwords it can take a long time to find correct password so can you help me change it so it can be resumable?
class
Program
{
#region Private variables
// the secret password which we will try to find via brute force
private
static
string password =
"p123"
;
private
static
string result;
private
static
bool
isMatched =
false
;
/* The length of the charactersToTest Array is stored in a
* additional variable to increase performance */
private
static
int
charactersToTestLength = 0;
private
static
long
computedKeys = 0;
/* An array containing the characters which will be used to create the brute force keys,
* if less characters are used (e.g. only lower case chars) the faster the password is matched */
private
static
char
[] charactersToTest =
{
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'p'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'P'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'0'
,
'!'
,
'$'
,
'#'
,
'@'
,
'-'
};
#endregion
static
void
Main(string[] args)
{
var timeStarted = DateTime.Now;
Console.WriteLine(
"Start BruteForce - {0}"
, timeStarted.ToString());
// The length of the array is stored permanently during runtime
charactersToTestLength = charactersToTest.Length;
// The length of the password is unknown, so we have to run trough the full search space
var estimatedPasswordLength = 0;
while
(!isMatched)
{
/* The estimated length of the password will be increased and every possible key for this
* key length will be created and compared against the password */
estimatedPasswordLength++;
startBruteForce(estimatedPasswordLength);
}
Console.WriteLine(
"Password matched. - {0}"
, DateTime.Now.ToString());
Console.WriteLine(
"Time passed: {0}s"
, DateTime.Now.Subtract(timeStarted).TotalSeconds);
Console.WriteLine(
"Resolved password: {0}"
, result);
Console.WriteLine(
"Computed keys: {0}"
, computedKeys);
Console.ReadLine();
}
#region Private methods
/// <summary>
/// Starts the recursive method which will create the keys via brute force
/// </summary>
/// <param name="keyLength">The length of the key</param>
private
static
void
startBruteForce(
int
keyLength)
{
var keyChars = createCharArray(keyLength, charactersToTest[0]);
// The index of the last character will be stored for slight perfomance improvement
var indexOfLastChar = keyLength - 1;
createNewKey(0, keyChars, keyLength, indexOfLastChar);
}
/// <summary>
/// Creates a new char array of a specific length filled with the defaultChar
/// </summary>
/// <param name="length">The length of the array</param>
/// <param name="defaultChar">The char with whom the array will be filled</param>
/// <returns></returns>
private
static
char
[] createCharArray(
int
length,
char
defaultChar)
{
return
(from c in
new
char
[length] select defaultChar).ToArray();
}
/// <summary>
/// This is the main workhorse, it creates new keys and compares them to the password until the password
/// is matched or all keys of the current key length have been checked
/// </summary>
/// <param name="currentCharPosition">The position of the char which is replaced by new characters currently</param>
/// <param name="keyChars">The current key represented as char array</param>
/// <param name="keyLength">The length of the key</param>
/// <param name="indexOfLastChar">The index of the last character of the key</param>
private
static
void
createNewKey(
int
currentCharPosition,
char
[] keyChars,
int
keyLength,
int
indexOfLastChar)
{
var nextCharPosition = currentCharPosition + 1;
// We are looping trough the full length of our charactersToTest array
for
(
int
i = 0; i < charactersToTestLength; i++)
{
/* The character at the currentCharPosition will be replaced by a
* new character from the charactersToTest array => a new key combination will be created */
keyChars[currentCharPosition] = charactersToTest[i];
// The method calls itself recursively until all positions of the key char array have been replaced
if
(currentCharPosition < indexOfLastChar)
{
createNewKey(nextCharPosition, keyChars, keyLength, indexOfLastChar);
}
else
{
// A new key has been created, remove this counter to improve performance
computedKeys++;
/* The char array will be converted to a string and compared to the password. If the password
* is matched the loop breaks and the password is stored as result. */
if
((
new
String(keyChars)) == password)
{
if
(!isMatched)
{
isMatched =
true
;
result =
new
String(keyChars);
}
return
;
}
}
}
}
#endregion
}
Reply
Answers (
0
)
How can i get a values from dbase in a txtbox without button
How to send free sms using c# web application