2009-07-15 6 views
0

Cela n'a pas été écrit par moi; il a été écrit par quelqu'un qui me l'a transmis. J'ai perdu le contact avec l'auteur du code. J'utilise ce code depuis quelques années et je viens de réaliser cette erreur. Il semble que la séquence de lettres rkey1 salit la sortie.Pourquoi ma fonction de décryptage ne fonctionne-t-elle pas?

Par exemple turkey1 sort comme décryptage comme tur79y1. Ce code Perl doit générer turkey1 et non 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, "local". C'est un code vraiment ancien. – jrockway

+2

-1: Il y a beaucoup à demander sans plus d'explications/commentaires. Pourquoi ne remplacez-vous pas ce code avec la bibliothèque openssl, ou une autre bonne bibliothèque de chiffrement? – gahooa

+0

Le code que vous avez fourni sort "turkey1
" sur mon système (v5.10.0 x86_64-linux-gnu-thread-multi). Quelle version perl (perl -v) et quel système d'exploitation utilisez-vous? – Inshallah

Répondre

10

Votre problème est que votre decode_escaped ne permet pas d'annuler exactement ce que encode_escaped a fait. Remplacez-le par ce qui suit et cela devrait résoudre votre problème.

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

fonctionne parfaitement. Merci – ParoX

Questions connexes