Это не было написано мной; он был написан кем-то, кто передал его мне. Я потерял контакт с автором кода. Я использую этот код в течение нескольких лет и только сейчас понял эту ошибку. Кажется, что последовательность букв rkey1
испортила выход.Почему моя функция дешифрования не работает?
Например, turkey1
выдается как расшифровка как tur79y1
. Этот код Perl должен выводить turkey1
и не tur79y1
:
$String = "turkey1";
$e = &encode_escaped(&palace_encrypt($String));
$d = &palace_decrypt(&decode_escaped("'\"".$e."\"'"));
print $d."<br>\n";
KEY REMOVED BY OWNER
sub palace_decrypt
{
local $lastchar = 0;
local $rc = 0;
local @bs;
for($i=length($_[0])-1; $i>=0; $i--) {
local $tmp = ord(substr($_[0], $i, 1));
$bs[$i] = $tmp^$palace_key[$rc++]^$lastchar;
$lastchar = $tmp^$palace_key[$rc++];
}
return join("", map { chr($_) } @bs);
}
sub decode_escaped
{
$_[0] =~ m/\"(.*)\"/;
local $str = $1;
$str =~ s/\\\\/\0/g;
$str =~ s/\\"/"/g;
$str =~ s/\\(..)/pack("c",hex($1))/ge;
$str =~ s/\0/\\/g;
return $str;
}
sub palace_encrypt
{
local $lastchar = 0;
local $rc = 0;
local @bs;
for($i=length($_[0])-1; $i>=0; $i--) {
local $b = ord(substr($_[0], $i, 1));
$bs[$i] = $b^$palace_key[$rc++]^$lastchar;
$lastchar = $bs[$i]^$palace_key[$rc++];
}
return join("", map { chr($_) } @bs);
}
sub encode_escaped
{
local $str = $_[0];
$str =~ s/\\/\\\\/g;
$str =~ s/([^A-Za-z0-9\.\\])/sprintf("\\%2.2X", ord($1))/ge;
return $str;
}
Вау, «местный». Это действительно старый код. – jrockway
-1: Это много, чтобы спросить без дальнейшего объяснения/комментирования. Почему бы вам не заменить этот код библиотекой openssl или другой хорошей библиотекой шифрования? – gahooa
Код, который вы указали выходы "turkey1
" в моей системе (v5.10.0 x86_64-linux-gnu-thread-multi). Какую версию perl (perl -v) и операционную систему вы используете? – Inshallah