daily pastebin goal
32%
SHARE
TWEET

Go md5-bruteforce (par.)

a guest Mar 31st, 2015 536 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
Top