Task

Find, through brute force, the five-letter passwords corresponding with the following SHA-256 hashes:

1. 1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad
2. 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
3. 74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f

Your program should naively iterate through all possible passwords consisting only of five lower-case ASCII English letters. It should use concurrent or parallel processing, if your language supports that feature. You may calculate SHA-256 hashes by calling a library or through a custom implementation. Print each matching password, along with its SHA-256 hash.

Related task: SHA-256

func invert_sha256(hash) {
 
    var letters = @('a'..'z')
 
    var job = func (prefix, hash) {
        variations_with_repetition(letters, 4, {|*a|
            var s = join('', prefix, a...)
            return s if (s.sha256 == hash)
        })
        return nil
    }
 
    letters.map {|prefix|
        job.ffork(prefix, hash)
    }.each {|f|
        with (f.wait) { return _ }
    }
}
 
var tests = %w(
  1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad
  3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b
  74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f
)
 
tests.each {|t|
    var phrase = invert_sha256(t)
    say "#{t} : #{phrase}"
}