73 lines
2.3 KiB
Ada
73 lines
2.3 KiB
Ada
with Ada.Text_IO;
|
|
|
|
with CryptAda.Digests.Message_Digests.SHA_256;
|
|
with CryptAda.Digests.Hashes;
|
|
with CryptAda.Pragmatics;
|
|
|
|
procedure Brute_Force is
|
|
use CryptAda.Digests.Message_Digests;
|
|
use CryptAda.Digests.Hashes;
|
|
use CryptAda.Digests;
|
|
use CryptAda.Pragmatics;
|
|
|
|
Wanted_Sums : constant array (1 .. 3) of String (1 .. 64) :=
|
|
(1 => "1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad",
|
|
2 => "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
|
|
3 => "74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f");
|
|
Wanted_Hash : constant array (1 .. 3) of Hashes.Hash :=
|
|
(1 => Hashes.To_Hash (Wanted_Sums (1)),
|
|
2 => Hashes.To_Hash (Wanted_Sums (2)),
|
|
3 => Hashes.To_Hash (Wanted_Sums (3)));
|
|
|
|
subtype Ciffer is Byte range Character'Pos ('a') .. Character'Pos ('z');
|
|
subtype Code is Byte_Array (1 .. 5);
|
|
|
|
task type Worker (First : Byte) is
|
|
end Worker;
|
|
|
|
procedure Compare (Hash : in Hashes.Hash; Bytes : in Code) is
|
|
begin
|
|
for I in Wanted_Hash'Range loop
|
|
if Hash = Wanted_Hash (I) then
|
|
Ada.Text_IO.Put (Wanted_Sums (I) & " ");
|
|
for C of Bytes loop
|
|
Ada.Text_IO.Put (Character'Val (C));
|
|
end loop;
|
|
Ada.Text_IO.New_Line;
|
|
end if;
|
|
end loop;
|
|
end Compare;
|
|
|
|
task body Worker is
|
|
Handle : constant Message_Digest_Handle := SHA_256.Get_Message_Digest_Handle;
|
|
Digest : constant Message_Digest_Ptr := Get_Message_Digest_Ptr (Handle);
|
|
Bytes : Code;
|
|
Hash : Hashes.Hash;
|
|
begin
|
|
Bytes (Bytes'First) := First;
|
|
|
|
for B2 in Ciffer'Range loop
|
|
for B3 in Ciffer'Range loop
|
|
for B4 in Ciffer'Range loop
|
|
Bytes (2 .. 4) := B2 & B3 & B4;
|
|
for B5 in Ciffer'Range loop
|
|
Bytes (5) := B5;
|
|
Digest_Start (Digest);
|
|
Digest_Update (Digest, Bytes);
|
|
Digest_End (Digest, Hash);
|
|
Compare (Hash, Bytes);
|
|
end loop;
|
|
end loop;
|
|
end loop;
|
|
end loop;
|
|
end Worker;
|
|
|
|
type Worker_Access is access Worker;
|
|
Work : Worker_Access;
|
|
pragma Unreferenced (Work);
|
|
begin
|
|
for C in Ciffer'Range loop
|
|
Work := new Worker (First => C);
|
|
end loop;
|
|
end Brute_Force;
|