首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含"^“的Perl XOR转义字符串

包含"^“的Perl XOR转义字符串
EN

Stack Overflow用户
提问于 2013-02-20 18:48:03
回答 1查看 224关注 0票数 0

在Perl中执行逐位XOR时,如何转义"^“字符?我的脚本是好的,但是当我输入一个像.1M80P]/)S@*>RQF^RM< \n这样的字符串时,输出就会变得混乱:

代码语言:javascript
复制
#!/usr/bin/perl

$key = pack("H*","3cb37efae7f4f376ebbd76cd");

print "Enter string to decode: ";
$str=<STDIN>;chomp $str; $str =~s/\\(.)/$1/g;
$dec = decode($str);
print "Decoded string value: $dec\n";

sub decode{
    @subvar=@_;
    my $sqlstr = $subvar[0];
    $cipher = unpack("u", $sqlstr);
    $plain = $cipher^$key;
    return substr($plain, 0, length($cipher));
}

输出:

代码语言:javascript
复制
Enter string to decode: .1M80P]/)S@*>RQF^RM< \n
Decoded string value: zen94==tuvosÊ×

奇怪的是,下面的字符串,\=_\\^M;+ D1F$U@7L\n可以正常工作,并解码为KL@OU4books!,但.;H ^F8B8EQ">SA^BDL8 \n没有像预期的那样工作,并返回了R3@coldfusioÆ

以下是ikegami清理后的代码(结果相同):

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
use warnings;

sub deliteral {
   my ($s) = @_;
   $s =~ s/\\n/\n/g;
   die "Unrecognised escape \\$1\n" if $s =~ /\\[a-zA-Z0-9]/;
   $s =~ s/\\(.)/$1/sg;
   return $s;   
}

sub uudecode {
   return unpack 'u', $_[0];
}

sub decode {
   my ($key, $cipher) = @_;
   return substr($cipher^$key, 0, length($cipher)); # XXX
}

my $key = pack('H*', '3cb37efae7f4f376ebbd76cd');

print "Enter string to decode: ";
chomp( my $coded = <STDIN> );

my $cipher = uudecode(deliteral($coded));
my $plain = decode($key, $cipher);
print("Plain text: $plain\n");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 17:35:58

多亏了ikegami的帮助,这就是解决方案:

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
use warnings;

sub deliteral {
   my ($s) = @_;
   $s =~ s/\\n/\n/g;
   die "Unrecognised escape \\$1\n" if $s =~ /(?<!\\)(?:\\{2})*\\([a-zA-Z0-9])/;   $s =~ s/\\(.)/$1/sg;
   return $s;   
}

sub uudecode {
   return unpack 'u', $_[0];
}

sub decode {
   my ($key, $cipher) = @_;
   return substr($cipher^$key, 0, length($cipher)); # XXX
}

my $key = pack('H*', '3cb37efae7f4f376ebbd76cdfce7391e9ed9cee4cfceb4b33332fc96ff7b');

print "Enter string to decode: ";
chomp( my $coded = <STDIN> );

my $cipher = uudecode(deliteral($coded));
my $plain = decode($key, $cipher);
print("Plain text: $plain\n");

问题出在密钥的长度上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14977946

复制
相关文章

相似问题

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