使用uri_escape_utf8后无法解码字符串

Trouble decoding string after using uri_escape_utf8

提问人:Jon Schlossberg 提问时间:4/8/2023 最后编辑:Jon Schlossberg 更新时间:4/8/2023 访问量:79

问:

在 Perl 中,我加密了一个字符串,然后使用 uri_escape_utf8这样我就可以在 URL 中发送它。然后,我收到似乎完全相同的编码字符串返回Perl,但无法弄清楚对其进行解码。

我在Perl中创建了一个简单的测试程序:

 $encodedUsername = uri_escape_utf8(encrypter($u));
 $enc = Encode::decode('utf8', uri_unescape($encodedUsername));
 $final = unencrypter($enc);

不起作用,$final是一个空字符串。

如果我做一个常规uri_escape而不是uri_escaps_utf8一切正常。但我需要做uri_escape_utf8才能与 Jaascript 的 encodeURI组件兼容。

我错过了什么?

谢谢!-乔恩

背景:我对字符串使用 blowfish 加密,然后使用 uri_escape_utf8 以便我可以在 URL 中发送字符串。接收器是一个 javascript 程序,它使用 encodeURIComponent 将编码后的字符串发送回 Perl 程序。encodeURIComponent 应该等效于 uri_eacape_utf8。

 my $mykeyS = <secret key>; 
 my $len = 8;
 my $mS = Crypt::CBC->new( -literal_key  => 1,
                     -key       => $mykeyS,
                     -iv        => $iv8,
                     -keysize   => $len,
                     -cipher    => 'Blowfish',
                     -header    => 'none'
 );

 sub encrypter{
   my ($val) = @_;

   if (length $val < 8) {
     $val = pack('A8', $val);
   }
 return $mS->encrypt($val);
 }

 sub unencrypter {
    my ($valEncrypted) = @_;

    eval {
       $val = $mS->decrypt($valEncrypted);
       if (length $val == 8) {
          $val = unpack('A8', $val);
       }
    };
    if ($@) {
       $val = '';
    }
    return $val;
 }
perl utf-8 urlencode

评论

0赞 Marijn 4/8/2023
澄清问题:如何定义?encrypterunencrypter
0赞 ikegami 4/8/2023
blowfish 不返回文本,所以我质疑使用 uri_escape_utf8 是否有意义,但没有理由它不起作用。而且你还没有证明它没有。问题很可能出在 .如果没有更多信息,我们对这个问题无能为力。unencrypter

答:

1赞 Jon Schlossberg 4/8/2023 #1

想通了。我没有惹uri_escape_utf8,而是使用

 use MIME::Base64 qw(encode_base64url decode_base64url);
 encode_base64url(encrypter($u));  # to encode
 unencrypter(decode_base64url($p1)); # to decode

到目前为止,它工作得很好!