代码之家  ›  专栏  ›  技术社区  ›  ParoX

为什么我的解密功能不能工作?

  •  0
  • ParoX  · 技术社区  · 16 年前

    这不是我写的,是传给我的人写的。我和代码的作者失去了联系。我使用这个代码已经有几年了,现在才意识到这个错误。似乎字母顺序 rkey1 把输出搞砸了。

    例如 turkey1 以解密方式输出 tur79y1 . 这个Perl代码应该输出 土耳其1号 而不是 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 回复  |  直到 16 年前
        1
  •  10
  •   Inshallah    16 年前

    你的问题是你的解码转义并不能完全撤销转义的编码。替换为以下内容,这样可以解决您的问题。

    sub decode_escaped
    {
        $_[0] =~ m/\"(.*)\"/;
        local @str = split /(\\\\)/, $1;
        foreach (@str) {
            s/\\"/"/g;
            s/\\(..)/chr(hex($1))/ge;
            s/\\\\/\\/;
        }
        return join '', @str;
    }