ブルートフォースアタック

をするプログラムを書いてみた。

=begin
### brute.rb
#
## 指定したpassをブルートフォースアタックで見つける
# 
## usage: ruby brute.rb [pass]
#
###
=end

$pass = "kwt"
$pass = ARGV.shift if ARGV.size > 0
$temp = ""
$cand = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYX0123456789"
#$cand = "abc"
$cand = $cand.split('')

$old = Time.now

def brute(n)
  if n == 0
    # プロセスを全て表示(すると大分遅くなる)
    #puts $temp
    
    if $temp == $pass
      puts "Password: #{$temp}"
      puts "Time: #{Time.now-$old}msec"
      exit
    end
    
    return
  end
  
  $cand.each {|c|
    $temp += c
    brute(n-1)
    # 最後尾の一文字をカット
    $temp = $temp.slice(0, $temp.size-1)
  }
end

for i in 1..$pass.size
  puts "--- Try#{i} ---"
  brute(i)
end

ループの処理が中々上手くできなかった。悩んだときはやっぱり紙に書いてみるに限る。