Шифрование Пароля
Не знаю в какой раздел лучше поместить данную тему,поэтому пишу сюда...
Ни для кого не секрет что ко многим сборкам идут в комплекте скрипты и один из них добавляет юзера "root" с одноименным паролем. В этом же скриптике есть этот пароль в зашифрованном виде,в каком его и прописывают в базу. Вот тут и возник вопрос,каким образом происходит это шифрование? изучая скрипт понял что мне чего-то не хватает и это чего-то скорее всего определенный ключ,так ли это,если да,то где его мона выцепить?
Хочу в идеале написать прогу,которая сама будет шифровать эти пароли,но никак не могу добиться этого результата,пробовал и blowfish и md5,на выходе получаю не то число,что должно быть. Помогите или намекните кто знает.
Содрано из l2cp
$key = array();
$dst = array();
$i = 0;
$nBytes = strlen($str);
while ($i < $nBytes){
$i++;
$key[$i] = ord(substr($str, $i - 1, 1));
$dst[$i] = $key[$i];
}
$rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
$one = $rslt * 213119 + 2529077;
$one = $one - intval($one/ 4294967296) * 4294967296;
$rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
$two = $rslt * 213247 + 2529089;
$two = $two - intval($two/ 4294967296) * 4294967296;
$rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
$three = $rslt * 213203 + 2529589;
$three = $three - intval($three/ 4294967296) * 4294967296;
$rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
$four = $rslt * 213821 + 2529997;
$four = $four - intval($four/ 4294967296) * 4294967296;
$key[4] = intval($one/16777216);
$key[3] = intval(($one - $key[4] * 16777216) / 65535);
$key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
$key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));
$key[8] = intval($two/16777216);
$key[7] = intval(($two - $key[8] * 16777216) / 65535);
$key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
$key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));
$key[12] = intval($three/16777216);
$key[11] = intval(($three - $key[12] * 16777216) / 65535);
$key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
$key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));
$key[16] = intval($four/16777216);
$key[15] = intval(($four - $key[16] * 16777216) / 65535);
$key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
$key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));
$dst[1] = $dst[1] ^ $key[1];
$i=1;
while ($i<16){
$i++;
$dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
}
$i=0;
while ($i<16){
$i++;
if ($dst[$i] == 0) {
$dst[$i] = 102;
}
}
$encrypt = "0x";
$i=0;
while ($i<16){
$i++;
if ($dst[$i] < 16) {
$encrypt = $encrypt . "0" . dechex($dst[$i]);
} else {
$encrypt = $encrypt . dechex($dst[$i]);
}
}
return $encrypt;
}
При переводе на дельфи именно этой функции получаем совсем другой ответ,поэтому и возник вопрос,что упускаем?
в скрипте root соответствует
0xb1be70e9a83f19192cb593935ec4e2e2 а вот у меня получается
0x3562FDE8A93E18182DB492925FC5E3E3
не похоже прямо скажем,а вот в чем может быть дело,не понятно...
Шифрование пароля в оффе никакой не md5, не sha1, не base64, и не блоуфиш.
Это собственная частная разработка ncsoft, но правда кривая.
Пользуйтесь тем что есть, на php это все работает прекрасно.
ancient, старую l2cp используешь. Тут в некоторых строчках есть косяки с делением.
— Ålderdom - ingen glädje..
Внешне правда очень похоже на md5,и задумка у меня как раз была в том,чтобы уйти от скриптов php или asp...
А ну-ка, на. Попробуй эту пожувать
$array_mul = array ( 0 => 213119, 1 => 213247, 2 => 213203, 3 => 213821 );
$array_add = array ( 0 => 2529077, 1 => 2529089, 2 => 2529589, 3 => 2529997 );
$dst = $key = array ( 0 => 0, 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0, 11 => 0, 12 => 0, 13 => 0, 14 => 0, 15 => 0 );
for ( $i = 0; $i < strlen ( $plain ); $i++ ) {
$dst [ $i ] = $key [ $i ] = ord ( substr ( $plain, $i, 1 ) );
}
for ( $i = 0; $i <= 3; $i++ ) {
$val [ $i ] = fmod ( ( $key [ $i * 4 + 0 ] + $key [ $i * 4 + 1 ] * 0x100 + $key [ $i * 4 + 2 ] * 0x10000 + $key [ $i * 4 + 3 ] * 0x1000000 ) * $array_mul [ $i ] + $array_add [ $i ], 4294967296 );
}
for ( $i = 0; $i <= 3; $i++ ) {
$key [ $i * 4 + 0 ] = $val [ $i ] & 0xff;
$key [ $i * 4 + 1 ] = $val [ $i ] / 0x100 & 0xff;
$key [ $i * 4 + 2 ] = $val [ $i ] / 0x10000 & 0xff;
$key [ $i * 4 + 3 ] = $val [ $i ] / 0x1000000 & 0xff;
}
$dst [ 0 ] = $dst [ 0 ] ^ $key [ 0 ];
for ( $i = 1; $i <= 15; $i++ ) {
$dst [ $i ] = $dst [ $i ] ^ $dst [ $i - 1 ] ^ $key [ $i ];
}
for ( $i = 0; $i <= 15; $i++ ) {
if ( $dst [ $i ] == 0 ) {
$dst [ $i ] = 0x66;
}
}
$encrypted = "0x";
for ( $i = 0; $i <= 15; $i++ ) {
if ( $dst [ $i ] < 16 ) {
$encrypted .= "0";
}
$encrypted .= strtoupper ( dechex ( $dst [ $i ] ) );
}
return ( $encrypted );
}
— Ålderdom - ingen glädje..
шифрование != хеширование
расставь трйэсы после каждого изменения в пхп куске.. запиши результаты :)
и отладчиком пройдись по дельфийским кускам, сравнивай результаты, найди где пропустил циферку :) "...c4e2e2" "...C5E3E3" очень даже похожи ))
Lordaster, кстати если можешь выложи сырок.
Я тоже на делфи переписывал, но у меня гигантский вывод получился (
— Ålderdom - ingen glädje..
Покопайся может и найдешь что
type
TByteArray = array[0..3] of Byte;
var
Key, Dst: array[1..16] of Byte;
Index: Integer;
Rslt: Integer;
One, Two, Three, Four: Integer;
begin
for Index := Low(Key) to High(Key) do
begin
Key[Index] := 0;
Dst[Index] := 0;
end;
for Index := Succ(Low(Key)) to IfThen(Length(Text) > 16, 16, Length(Text)) do
begin
Key[Index] := Ord(Text[Pred(Index)]);
Dst[Index] := Key[Index];
end;
TByteArray(Rslt)[0] := Key[1];
TByteArray(Rslt)[1] := Key[2];
TByteArray(Rslt)[2] := Key[3];
TByteArray(Rslt)[3] := Key[4];
One := Rslt * 213119 + 2529077;
One := One - Trunc(One / 4294967296) * 4294967296;
TByteArray(Rslt)[0] := Key[5];
TByteArray(Rslt)[1] := Key[6];
TByteArray(Rslt)[2] := Key[7];
TByteArray(Rslt)[3] := Key[8];
Two := Rslt * 213247 + 2529089;
Two := Two - Trunc(Two / 4294967296) * 4294967296;
TByteArray(Rslt)[0] := Key[9];
TByteArray(Rslt)[1] := Key[10];
TByteArray(Rslt)[2] := Key[11];
TByteArray(Rslt)[3] := Key[12];
Three := Rslt * 213203 + 2529589;
Three := Three - Trunc(Three / 4294967296) * 4294967296;
TByteArray(Rslt)[0] := Key[13];
TByteArray(Rslt)[1] := Key[14];
TByteArray(Rslt)[2] := Key[15];
TByteArray(Rslt)[3] := Key[16];
Four := Rslt * 213821 + 2529997;
Four := Four - Trunc(Four / 4294967296) * 4294967296;
Key[4] := Trunc(One / 16777216);
Key[3] := Trunc((One - Key[4] * 16777216) / 65535);
Key[2] := Trunc((One - Key[4] * 16777216 - Key[3] * 65536) / 256);
Key[1] := Trunc((One - Key[4] * 16777216 - Key[3] * 65536 - Key[2] * 256));
Key[8] := Trunc(Two / 16777216);
Key[7] := Trunc((Two - Key[8] * 16777216) / 65535);
Key[6] := Trunc((Two - Key[8] * 16777216 - Key[7] * 65536) / 256);
Key[5] := Trunc((Two - Key[8] * 16777216 - Key[7] * 65536 - Key[6] * 256));
Key[12] := Trunc(Three / 16777216);
Key[11] := Trunc((Three - Key[12] * 16777216) / 65535);
Key[10] := Trunc((Three - Key[12] * 16777216 - Key[11] * 65536) / 256);
Key[9] := Trunc((Three - Key[12] * 16777216 - Key[11] * 65536 - Key[10] * 256));
Key[16] := Trunc(Four / 16777216);
Key[15] := Trunc((Four - Key[16] * 16777216) / 65535);
Key[14] := Trunc((Four - Key[16] * 16777216 - Key[15] * 65536) / 256);
Key[13] := Trunc((Four - Key[16] * 16777216 - Key[15] * 65536 - Key[14] * 256));
Dst[1] := Dst[1] xor Key[1];
for Index := Succ(Low(Dst)) to High(Dst) do
Dst[Index] := Dst[Index] xor Dst[Pred(Index)] xor Key[Index];
for Index := Low(Dst) to High(Dst) do
if Dst[Index] = 0 then
Dst[Index] := 102;
Result := '0x';
for Index := Low(Dst) to High(Dst) do
Result := Result + IntToHex(Dst[Index], 2);
end;
Ну и хардкор у тебя...пипец, можно было все гораздо проще сделать, без min,high, без for.
А bytearray тут вообще можно было не использовать.
Мой совет, перепиши еще раз, по более схожему виду с php скриптом. И округления никакие можно не использовать.
И нафиг не нужен хардкор с bytearray, trunc итд. Эт не бухгалтерская прога всетаки )
Лучше использовать while, а вместо умножений и делений битовые сдвиги.
У тебя проблема в матем.части, ибо значения тут прут не пральные.
— Ålderdom - ingen glädje..
Сложно написано или просто,это десятое дело. Взято почти полностью со скрипта пхп.лучше скажи где ошибка ;)
Я не смог найти ошибку, судя по содержанию key/dst проблема скорей всего в самом "расчете", либо в циклах.
Зачем стока нагородил ))
Можно тупо взять из пхп, убрать intval, убрать $, поменять = на :=, и скобы почистить - и все, таким образом можно гарантировать отсутствие ошибок в мат.части.
— Ålderdom - ingen glädje..

