2009-07-15 13 views
0

Dies wurde nicht von mir geschrieben; Es wurde von jemandem geschrieben, der es mir übergeben hat. Ich habe den Kontakt mit dem Autor des Codes verloren. Ich benutze diesen Code seit einigen Jahren und habe gerade diesen Fehler erkannt. Es scheint, dass die Buchstabenfolge rkey1 die Ausgabe durcheinander bringt.Warum funktioniert meine Entschlüsselungsfunktion nicht?

Zum Beispiel turkey1 Ausgänge als Entschlüsselung wie tur79y1. Dieser Perl-Code ausgeben sollte turkey1 und nicht 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; 
} 
+1

Wow, "lokal". Dies ist ein wirklich alter Code. – jrockway

+2

-1: Es ist eine Menge zu fragen ohne weitere Erklärung/Kommentar. Warum ersetzen Sie diesen Code nicht durch die OpenSSL-Bibliothek oder eine andere gute Verschlüsselungsbibliothek? – gahooa

+0

Der von Ihnen bereitgestellte Code gibt "truthahn1
" auf meinem System aus (v5.10.0 x86_64-linux-gnu-thread-multi). Welche Perl-Version (perl -v) und welches Betriebssystem verwendest du? – Inshallah

Antwort

10

Ihr Problem ist, dass Ihr decode_escaped nicht rückgängig genau das, was encode_escaped tat. Ersetzen Sie es durch das Folgende und das sollte Ihr Problem beheben.

sub decode_escaped 
{ 
    $_[0] =~ m/\"(.*)\"/; 
    local @str = split /(\\\\)/, $1; 
    foreach (@str) { 
     s/\\"/"/g; 
     s/\\(..)/chr(hex($1))/ge; 
     s/\\\\/\\/; 
    } 
    return join '', @str; 
} 
+0

perfekt funktioniert. Danke – ParoX