首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的解密函数不起作用?

为什么我的解密函数不起作用?
EN

Stack Overflow用户
提问于 2009-07-15 01:31:11
回答 1查看 660关注 0票数 0

这不是我写的;它是由一个传给我的人写的。我和代码的作者失去了联系。我使用这个代码已经有几年了,现在才意识到这个错误。看起来字母序列rkey1弄乱了输出。

例如,turkey1输出与tur79y1一样的解密。这段Perl代码应该输出turkey1,而不是tur79y1

代码语言:javascript
复制
$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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-15 03:24:05

你的问题是你的decode_escaped并不能完全撤销encode_escaped所做的事情。用下面的代码替换它,这应该会解决你的问题。

代码语言:javascript
复制
sub decode_escaped
{
    $_[0] =~ m/\"(.*)\"/;
    local @str = split /(\\\\)/, $1;
    foreach (@str) {
        s/\\"/"/g;
        s/\\(..)/chr(hex($1))/ge;
        s/\\\\/\\/;
    }
    return join '', @str;
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1128950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档