내 해독 기능이 작동하지 않는 이유는 무엇입니까?
-
13-09-2019 - |
문제
이것은 나에 의해 쓰여지지 않았습니다. 그것은 나에게 그것을 전달한 사람이 작성했습니다. 코드의 저자와 연락을 잃었습니다. 나는이 코드를 몇 년 동안 사용해 왔으며 지금은이 오류를 깨달았습니다. 문자 시퀀스 인 것 같습니다 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;
}
해결책
당신의 문제는 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;
}
제휴하지 않습니다 StackOverflow