لماذا لا تعمل وظيفة فك تشفير بلدي؟
-
13-09-2019 - |
سؤال
هذا لم يكتب بي؛ لقد كتبها شخص ما اجتازني. لقد فقدت الاتصال مع مؤلف الكود. لقد كنت أستخدم هذا الرمز لبضع سنوات وأدرك الآن هذا الخطأ. يبدو أن تسلسل الرسالة 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;
}
المحلول
مشكلتك هي أن Decode_Scaped لا تتراجع بالضبط ما فعله تشفير. استبدلها بما يلي وهذا يجب إصلاح مشكلتك.
sub decode_escaped
{
$_[0] =~ m/\"(.*)\"/;
local @str = split /(\\\\)/, $1;
foreach (@str) {
s/\\"/"/g;
s/\\(..)/chr(hex($1))/ge;
s/\\\\/\\/;
}
return join '', @str;
}
لا تنتمي إلى StackOverflow