function GetUser:
string;
// Function to get UserName
var // Declaring our variables
StrUserName: PChar;
// PointerChar
Size: DWord;
// DWORD integer Begin //
Begin
Size:=250;
// Set size to 250 (max UN length)
GetMem(StrUserName, Size);
// Allocate some memory
GetUserName(StrUserName, Size);
// API to get UN
result := StrPas(StrUserName);
// Return the UN
FreeMem(StrUserName);
// Free up the allocated memory
end;
Procedure RSADecrypt(CT :
String; D :
String; N :
String;
var PT :
String);
Var
c,d1,n1,p : TFGInt;
Begin
ConvertHexStringToBase256String(CT,CT);
Base256StringToFGInt(CT,c);
ConvertHexStringToBase256String(D,D);
Base256StringToFGInt(D,d1);
ConvertHexStringToBase256String(N,N);
Base256StringToFGInt(N,n1);
FGIntModExp(c,d1,n1,p);
// C ^ D mod N
FGIntToBase256String(P,PT);
ConvertBase256StringToHexString(PT,PT);
FGIntDestroy(c);
// Destroy FGInt (important!)
FGIntDestroy(d1);
// Destroy FGInt (important!)
FGIntDestroy(n1);
// Destroy FGInt (important!)
FGIntDestroy(p);
// Destroy FGInt (important!) End;
end;
function HexToInt(s :
string) : Int64;
// Convert HEX to Int64 integers
begin // Begin
if (s <> '
')
and (s[1] <> '
$')
then // If s != ‘’ and s[1] is not $ then
result := strToInt64('
$' + s )
// Convert ‘$’+s to Int64 ($ = HEX)
else // Else
result := strToInt64(s);
// Convert s to Int64 end;
end;
function Part1(s:
string):
string;
// Part 1
var // Declaring variables
i, x : integer;
// Counter and Holder as integers
begin // Begin
x := 0;
// Initialize x as 0
for i := 1
to length(s)
do // For 1 to 32 do
begin // Begin
x := x + HexToInt(s[i]);
// hier knallt es wenn ich oben den code verwende
end;
// End
result := new_md5(IntToHex(x,0));
// Get the MD5 of x
end;
function Part2(s:
string):
string;
// Part 2
var // Declaring Variables
i, j, x : integer;
// 2 Counters and a holder as integers begin //
Begin
i := 1;
// Initialize i as 1
j := 2;
// Initialize j as 2
x := 0;
// Initialize x as 0
while i <= length(s)
do // If i <= 32, then execute loop begin //
Begin
x := x + HexToInt(s[i] + s[j]);
// Pair
inc(i,2);
// Increment counter
inc(j,2);
// Increment counter
end;
// End
result := new_md5(IntToHex(x,0));
// Get the MD5 of x oder hier
end;
function Part3(s:
string):
string;
// Part 3
var // Declaring variables
arr :
array [1..8]
of string;
// Array [1..8] of strings
i, x : integer;
// Counter and Holder as integers begin //
Begin
arr[1] := s[01] + s[02] + s[03] + s[04];
// I got a little lazy here...
arr[2] := s[05] + s[06] + s[07] + s[08];
// Manually splitting the MD5 into
arr[3] := s[09] + s[10] + s[11] + s[12];
// Groups of 4... made possible by
arr[4] := s[13] + s[14] + s[15] + s[16];
// The creators of Copy/Paste ļ
arr[5] := s[17] + s[18] + s[19] + s[20];
// Still going...
arr[6] := s[21] + s[22] + s[23] + s[24];
// And going...
arr[7] := s[25] + s[26] + s[27] + s[28];
// Almost...
arr[8] := s[29] + s[30] + s[31] + s[32];
// Finally!
x := 0;
// Initialize x as 0
for i := 1
to 8
do // 1 to length of the array do loop begin //
Begin
x := x + HexToInt(arr[i]);
// Groups of 4
end;
// End
result := new_md5(IntToHex(x,0));
// Get the MD5 of x
end;
function Part4(s:
string):
string;
// Part 4
var // Refer to Part 3 for more info...
arr :
array [1..4]
of string;
i, x : integer;
begin
arr[1] := s[01] + s[02] + s[03] + s[04] + s[05] + s[06] + S[07] + s[08];
arr[2] := s[09] + s[10] + s[11] + s[12] + s[13] + s[14] + s[15] + s[16];
arr[3] := s[17] + s[18] + s[19] + s[20] + s[21] + s[22] + s[23] + s[24];
arr[4] := s[25] + s[26] + s[27] + s[28] + s[29] + s[30] + s[31] + s[32];
x := 0;
for i := 1
to 4
do
begin
x := x + HexToInt(arr[i]);
end;
result := new_md5(IntToHex(x,0));
end;
function Part5(s:
string):
string;
// Part 5
var // Refer to Part 3 for more info...
arr :
array [1..4]
of string;
x : int64;
i : integer;
begin
x := 0;
arr[1] := s[01] + s[02] + s[03] + s[04] + s[05] + s[06] + s[07] + s[08] +
s[09] + s[10] + s[11] + s[12] + s[13] + s[14] + s[15] + s[16];
arr[2] := s[17] + s[18] + s[19] + s[20] + s[21] + s[22] + s[23] + s[24] +
s[25] + s[26] + s[27] + s[28] + s[29] + s[30] + s[31] + s[32];
for i := 1
to 2
do
begin
x := x + HexToInt(arr[i]);
end;
result := new_md5(IntToHex(x,0));
end;
procedure TForm1.btn1Click(Sender: TObject);
Var // Declaring variables
A,b:
string;
// Strings ‘a’ and ‘b’ (b = serial)
begin // Begin
a := Part1(new_md5(GetUser));
//Part 1
a := Part2(a);
// Part 2
a := Part3(a);
// Part 3
a := Part4(a);
// Part 4
a := Part5(a);
// Part 5 { RSA Decrypt the final MD5 hash (result goes in ‘b’): }
RSADecrypt(a,'
3E6CBE18ABF0172741C8A583CA54402D',
'
D679E4D420CF78D335DC9AD165F9D819',b);
edt1.text := b;
// Print out serial end; // End
end;