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

import strutils, threadpool
import nimcrypto
 
const
 
  # List of hexadecimal representation of target hashes.
  HexHashes = ["1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad",
               "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
               "74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"]
 
  # List of target hashes.
  Hashes = [MDigest[256].fromHex(HexHashes[0]),
            MDigest[256].fromHex(HexHashes[1]),
            MDigest[256].fromHex(HexHashes[2])]
 
  Letters = 'a'..'z'
 
 
proc findHashes(a: char) =
  ## Build the arrays of five characters starting with the value
  ## of "a" and check if their hash matches one of the targets.
  ## Print the string and the hash value if a match is found.
  for b in Letters:
    for c in Letters:
      for d in Letters:
        for e in Letters:
          let s = [a, b, c, d, e]
          let h = sha256.digest(s)
          for i, target in Hashes:
            if h == target:   # Match.
              echo s.join(), " → ", HexHashes[i]
 
 
# Launch a thread for each starting character.
for a in Letters:
  spawn findHashes(a)
 
sync()