Parallel brute force
Parallel brute force is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
- Task
Find, through brute force, the five-letter passwords corresponding with the following SHA256 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 SHA256 hashes by calling a library or through a custom implementation. Print each matching password, along with its SHA256 value. Optionally, measure how long your program takes to run, and print that time.
C#
<lang csharp>using System; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks;
class Program {
static void Main(string[] args) { byte[] one = StringHashToByteArray("1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad"); byte[] two = StringHashToByteArray("3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b"); byte[] three = StringHashToByteArray("74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"); var prey = new byte[][] { one, two, three }; var dt = DateTime.Now; int chunksize = 26 * 26 * 26 * 26 * 26 / Environment.ProcessorCount; Task[] tasks = ( from i in Enumerable.Range(0, Environment.ProcessorCount) select Task.Run(() => MatchesInRange(i * chunksize, (i + 1) * chunksize - 1, prey)) ).ToArray(); Task.WaitAll(tasks); Console.WriteLine((DateTime.Now - dt).TotalMilliseconds + " milliseconds elapsed."); } static byte[] StringHashToByteArray(string s) { return Enumerable.Range(0, s.Length / 2).Select(i => (byte)Convert.ToInt16(s.Substring(i * 2, 2), 16)).ToArray(); }
static void MatchesInRange(int start, int stop, byte[][] prey) { byte[] letters = new byte[5]; byte[] hash; int serial; var shaFactory = new SHA256Managed(); for (int seriali = start; seriali <= stop; seriali++) { serial = seriali; int divisor = 456976; // 26 * 26 * 26 * 26; for (int i = 0; i < 5; i++) { letters[i] = (byte)(97 + Math.DivRem(serial, divisor, out serial)); divisor /= 26; } hash = shaFactory.ComputeHash(letters); if (hash[0] == prey[0][0] || hash[0] == prey[1][0] || hash[0] == prey[2][0]) { if (Enumerable.SequenceEqual(hash, prey[0]) || Enumerable.SequenceEqual(hash, prey[1]) || Enumerable.SequenceEqual(hash, prey[2])) { Console.WriteLine(Encoding.ASCII.GetString(letters) + " => " + BitConverter.ToString(hash).ToLower().Replace("-", "")); } } } }
}</lang>
- Output:
apple => 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b mmmmm => 74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f zyzzx => 1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad