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;
}
Wow, "local". C'est un code vraiment ancien. – jrockway
-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
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