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;
}
Wow, "lokal". Dies ist ein wirklich alter Code. – jrockway
-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
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