program t_shad;
{$ifdef win32}
{$apptype console}
{$endif}
uses
mem_util, hash, md5;
{
Als Beispiel aus der /etc/shadow (Passwort ist 'password'):
$1$7fX5iR5l$L8QJdkpAkAe6/ucGxAbBq.
}
function to64(l: longint; n: integer):
string;
const
a64:
array[0..63]
of char = '
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var
s:
string;
begin
s := '
';
while n>0
do begin
s := s+a64[l
and $3f];
l := l
shr 6;
dec(n);
end;
to64 := s;
end;
procedure md5crypt(
const salt, pw:
string;
var shad:
string);
const
magic:
array[0..2]
of char = '
$1$';
var
ctx,ctx1: THashContext;
final: TMD5Digest;
i: integer;
l: longint;
begin
MD5Init(ctx);
MD5Update(ctx, @pw[1], length(pw));
MD5Update(ctx, @magic, 3);
MD5Update(ctx, @salt[1], length(salt));
MD5Init(ctx1);
MD5Update(ctx1, @pw[1], length(pw));
MD5Update(ctx1, @salt[1], length(salt));
MD5Update(ctx1, @pw[1], length(pw));
MD5Final(ctx1,
final);
i := length(pw);
while i>0
do begin
if i>16
then MD5Update(ctx, @
final, 16)
else MD5Update(ctx, @
final, i);
dec(i,16);
end;
fillchar(
final,sizeof(
final),0);
i := length(pw);
while i<>0
do begin
if odd(i)
then MD5Update(ctx, @
final, 1)
else MD5Update(ctx, @pw[1], 1);
i := i
shr 1;
end;
MD5Final(ctx,
final);
for i:=0
to 999
do begin
MD5Init(ctx1);
if (i
and 1) <>0
then MD5Update(ctx1, @pw[1], length(pw))
else MD5Update(ctx1, @
final, 16);
if i
mod 3 <> 0
then MD5Update(ctx1, @salt[1], length(salt));
if i
mod 7 <> 0
then MD5Update(ctx1, @pw[1], length(pw));
if (i
and 1) <>0
then MD5Update(ctx1, @
final, 16)
else MD5Update(ctx1, @pw[1], length(pw));
MD5Final(ctx1,
final);
end;
shad := '
';
l := (longint(
final[ 0])
shl 16)
or (longint(
final[ 6])
shl 8)
or final[12]; shad := shad + to64(l,4);
l := (longint(
final[ 1])
shl 16)
or (longint(
final[ 7])
shl 8)
or final[13]; shad := shad + to64(l,4);
l := (longint(
final[ 2])
shl 16)
or (longint(
final[ 8])
shl 8)
or final[14]; shad := shad + to64(l,4);
l := (longint(
final[ 3])
shl 16)
or (longint(
final[ 9])
shl 8)
or final[15]; shad := shad + to64(l,4);
l := (longint(
final[ 4])
shl 16)
or (longint(
final[10])
shl 8)
or final[ 5]; shad := shad + to64(l,4);
l :=
final[11]; shad := shad + to64(l,2);
end;
var
shadow:
string;
begin
md5crypt('
7fX5iR5l', '
password', shadow);
writeln('
Test:"L8QJdkpAkAe6/ucGxAbBq."');
writeln('
Calc:"',shadow,'
"');
end.