【发布时间】:2009-07-15 01:31:10
【问题描述】:
这不是我写的;它是由传给我的人写的。我与代码的作者失去了联系。我已经使用这个代码几年了,现在才意识到这个错误。似乎字母序列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:没有进一步的解释/评论就问了很多。为什么不用 openssl 库或其他一些好的加密库替换这段代码?
-
您提供的代码在我的系统(v5.10.0 x86_64-linux-gnu-thread-multi)上输出“turkey1
”。您使用的是什么 perl 版本 (perl -v) 和操作系统? -
无论您是否使用本土加密算法,将您的密钥材料发布到公共论坛可能不是一个好主意。
-
它不再是真正的“加密”了。那是在 1995 年。现在它试图保护的软件基本上是开放的,没有人在这个项目上工作。密钥可以是公开的。我必须使用这种方法,因为软件需要它,我不能使用 SSL。我的 perl-v 这是 perl, v5.10.0 为 i486-linux-gnu-thread-multi 和 Debian Lenny (5) 构建
标签: perl encode decode encryption