Warum nicht meine Entschlüsselungs-Funktion funktioniert?
-
13-09-2019 - |
Frage
Dies wurde nicht von mir geschrieben; es wurde von jemandem geschrieben, der es an mir vergangen. Ich verlor den Kontakt mit dem Autor des Codes. Ich habe seit ein paar Jahren diesen Code benutze und gerade jetzt diesen Fehler erkannt. Es scheint, dass die Buchstabenfolge rkey1
vermasselt die Ausgabe auf.
Zum Beispiel turkey1
Ausgänge als Entschlüsselung als 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;
}
Lösung
Ihr Problem ist, dass Ihr decode_escaped nicht rückgängig genau das, was encode_escaped tat. Ersetzen sie mit folgendem 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow