Guest User

Go md5-bruteforce (par.)

a guest
Mar 31st, 2015
658
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.  
  3. import (
  4.     "crypto/md5"
  5.     "encoding/hex"
  6.     "fmt"
  7.     "log"
  8.     "runtime"
  9.     "time"
  10. )
  11.  
  12. var hash [16]byte
  13.  
  14. func nextByte(b byte) byte {
  15.     switch b {
  16.     case 'z':
  17.         return '0'
  18.     case '9':
  19.         return 'a'
  20.     default:
  21.         return b + 1
  22.     }
  23. }
  24.  
  25. func nextPass(b []byte) {
  26.     for i := len(b) - 1; i >= 0; i-- {
  27.         b[i] = nextByte(b[i])
  28.         if b[i] != '0' {
  29.             return
  30.         }
  31.     }
  32. }
  33.  
  34. type part struct {
  35.     start string
  36.     end   byte
  37. }
  38.  
  39. // worker по порядку сравнивает хэш каждого пароля с искомым
  40. func worker(in <-chan part, out chan<- string) {
  41.     var p part
  42.     var b []byte
  43.     for {
  44.         p = <-in
  45.         b = []byte(p.start)
  46.         for b[0] != p.end {
  47.             if md5.Sum(b) == hash {
  48.                 out <- string(b)
  49.                 return
  50.             }
  51.             nextPass(b)
  52.         }
  53.     }
  54. }
  55.  
  56. func generator(in chan<- part) {
  57.         start := []byte("00000")
  58.         var b byte
  59.         for {
  60.             b = nextByte(start[0])
  61.             in <- part{string(start), b}
  62.             start[0] = b
  63.         }  
  64. }
  65.  
  66. func main() {
  67.     t := time.Now()
  68.     const hashString = "95ebc3c7b3b9f1d2c40fec14415d3cb8" // "zzzzz"
  69.     h, err := hex.DecodeString(hashString)
  70.     if err != nil {
  71.         log.Fatal(err)
  72.     }
  73.     copy(hash[:], h)
  74.     num := runtime.NumCPU()
  75.     runtime.GOMAXPROCS(num)
  76.     in := make(chan part)
  77.     out := make(chan string)
  78.     go generator(in)
  79.     for i := 0; i < num; i++ {
  80.         go worker(in, out)
  81.     }
  82.     fmt.Println("Пароль: ", <-out)
  83.     fmt.Println("Время поиска: ", time.Since(t))
  84. }
RAW Paste Data