require 'pbkdf2.rb'
args = ARGV # arguments in the following order: salt hash iterations samples.txt transformations.txt -v
if !args.empty?
salt = args[0]
hash = args[1]
iterations = Integer(args[2])
samplesTxt = args[3]
transformsTxt = args[4]
else
puts "Error: Following order required: \"salt hash iterations samples.txt transformations.txt [-v]\""
end
# puts PBKDF2.new(:password=>"1337", :salt=>"kikugalanet", :iterations=>10000).hex_string
if ARGV.include? "-v"
debug = true
end
# Guess by file approach
if debug
puts "Testing words from #{samplesTxt}"
end
samplesFile = File.new(samplesTxt, "r")
IO.foreach(samplesFile){|sampleLine|
temp_password = PBKDF2.new(:password=>sampleLine, :salt=>salt, :iterations=>iterations)
if hash == temp_password.hex_string
puts "PASSWORD FOUND: #{sampleLine}"
samplesFile.close
exit
else
if debug
puts "Failed: #{sampleLine}"
end
end
}
# Tranformations approach
if debug
puts "Testing permutations using #{transformsTxt}"
end
samplesFile = File.new(samplesTxt, "r")
transformsFile = File.new(transformsTxt, "r")
IO.foreach(samplesFile){|sampleLine|
temp = sampleLine
IO.foreach(transformsFile){|transformLine|
split = transformLine.split
temp = temp.gsub(split[0].match(/(?<=\/)(.*?)(?=\/)/).to_s, split[1].match(/(?<=\')(.*?)(?=\')/).to_s)
}
temp_password = PBKDF2.new(:password=>temp, :salt=>salt, :iterations=>iterations)
if hash == temp_password.hex_string
puts "PASSWORD FOUND: #{temp}"
samplesFile.close
transformsFile.close
exit
else
if debug
puts "Failed: #{temp}"
end
end
}
samplesFile.close
transformsFile.close
# Brute Force approach
if debug
puts "Last Method: \"Brute Force\" initialized"
end
Comments