2009-07-15 2 views
0

Это не было написано мной; он был написан кем-то, кто передал его мне. Я потерял контакт с автором кода. Я использую этот код в течение нескольких лет и только сейчас понял эту ошибку. Кажется, что последовательность букв 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; 
} 
+1

Вау, «местный». Это действительно старый код. – jrockway

+2

-1: Это много, чтобы спросить без дальнейшего объяснения/комментирования. Почему бы вам не заменить этот код библиотекой openssl или другой хорошей библиотекой шифрования? – gahooa

+0

Код, который вы указали выходы "turkey1
" в моей системе (v5.10.0 x86_64-linux-gnu-thread-multi). Какую версию perl (perl -v) и операционную систему вы используете? – Inshallah

ответ

10

Ваша проблема заключается в том, что ваш decode_escaped точно не отменить то, что encode_escaped сделал. Замените его следующим и это должно устранить вашу проблему.

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

Работает идеально. Спасибо – ParoX

Смежные вопросы