سؤال

هذا لم يكتب بي؛ لقد كتبها شخص ما اجتازني. لقد فقدت الاتصال مع مؤلف الكود. لقد كنت أستخدم هذا الرمز لبضع سنوات وأدرك الآن هذا الخطأ. يبدو أن تسلسل الرسالة 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top