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

 
program Parallel_Brute_Force;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils,
  System.Threading,
  DCPsha256;
 
function Sha256(W: string): string;
var
  HashDigest: array[0..31] of byte;
  d, i: Byte;
begin
  Result := '';
  with TDCP_sha256.Create(nil) do
  begin
    Init;
    UpdateStr(W);
    final(HashDigest[0]);
    for i := 0 to High(HashDigest) do
      Result := Result + lowercase(HashDigest[i].ToHexString(2));
  end;
end;
 
procedure Force(a: int64);
var
  password: string;
  hash: string;
  i, j, k, l: integer;
  w: string;
const
  Words: TArray<string> = ['1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad',
    '3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b',
    '74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f'];
begin
  password := '     ';
  password[1] := chr(97 + a);
 
  for i := 97 to 122 do
  begin
    password[2] := chr(i);
    for j := 97 to 122 do
    begin
      password[3] := chr(j);
      for k := 97 to 122 do
      begin
        password[4] := chr(k);
        for l := 97 to 122 do
        begin
          password[5] := chr(l);
          hash := Sha256(password);
 
          for w in Words do
          begin
            if SameText(hash, w) then
            begin
              Writeln('>>', password, ' => ', hash);
            end;
          end;
        end;
      end;
    end;
  end;
end;
 
var
  s: string;
begin
 
  TParallel.&For(0, 25, Force);
 
  Writeln('Enter to exit');
  readln;
end.