Вот код в Java , который реализует ту же функцию. Это может помочь вам сделать то же самое на других языках.
Для PHP вы можете посмотреть этот код:
echo 'MD5: ' . crypt('mypassword', '$1$somesalt$') . "\n";
echo 'MD5: ' . mycrypt('mypassword', 'somesalt') . "\n";
function to64($s, $n)
{
$i64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$r = '';
while (--$n >= 0) {
$ss = $s & 0x3f;
$r .= $i64[$s & 0x3f];
$s >>= 6;
}
return $r;
}
function mycrypt($v, $s) {
$m = hash_init("md5");
hash_update($m, $v);
hash_update($m, '$1$');
hash_update($m, $s);
$m1 = hash_init("md5");
hash_update($m1, $v);
hash_update($m1, $s);
hash_update($m1, $v);
$final = hash_final($m1, true);
for ($pl = strlen($v); $pl>0; $pl-=16) {
hash_update($m, substr($final, 0, $pl > 16? 16:$pl));
}
$final = "\0";
for($i=strlen($v);$i!=0;$i>>=1) {
if (($i & 1) != 0) {
hash_update($m, $final);
} else {
hash_update($m, $v[0]);
}
}
$final = hash_final($m, true);
for($i=0;$i<1000;$i++) {
$m1 = hash_init("md5");
if(($i&1)) {
hash_update($m1, $v);
} else {
hash_update($m1, $final);
}
if(($i%3)) {
hash_update($m1, $s);
}
if(($i%7)) {
hash_update($m1, $v);
}
if(($i&1)) {
hash_update($m1, $final);
} else {
hash_update($m1, $v);
}
$final = hash_final($m1, true);
}
$l = '$1$'.$s.'$';
$l .= to64(ord($final[ 0])<<16 | (ord($final[ 6])<<8) | ord($final[12]), 4);
$l .= to64(ord($final[ 1])<<16 | (ord($final[ 7])<<8) | ord($final[13]), 4);
$l .= to64(ord($final[ 2])<<16 | (ord($final[ 8])<<8) | ord($final[14]), 4);
$l .= to64(ord($final[ 3])<<16 | (ord($final[ 9])<<8) | ord($final[15]), 4);
$l .= to64(ord($final[ 4])<<16 | (ord($final[10])<<8) | ord($final[ 5]), 4);
$l .= to64(ord($final[11]), 2);
return $l;
}