【问题标题】:Perl XOR escape string that contains "^"包含“^”的 Perl XOR 转义字符串
【发布时间】:2013-02-22 17:35:58
【问题描述】:

在 Perl 中进行按位异或时,如何转义“^”字符?我的脚本没问题,但是当我输入像.1M80P]/)S@*>RQF^RM< \n 这样的字符串时,输出就会混乱:

#!/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));
}

输出:

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

奇怪的是,以下字符串 ,\=_\\^M;+ D1F$U@7L\n 可以正常工作并解码为 KL@OU4books! 但同样.;H ^F8B8EQ"&gt;SA^BDL8 \n 无法按预期工作并返回 R3@coldfusioÆ

这是 ikegami 清理后的代码(但结果相同):

#!/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");

【问题讨论】:

  • 您期望的输出是什么?
  • 所以你说当纯文本比密钥长时它不起作用。
  • 不是真的,这行得通:,6\\\=/S,G\!PQF?SQF5\n 解码为gt16.50otroX
  • gt16.50otroX 比密钥长多少?
  • 你是对的,不是。也许问题出在长度上?

标签: perl escaping xor


【解决方案1】:

这就是解决方案,感谢 ikegami 的帮助:

#!/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");

问题在于 KEY 的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 2015-10-01
    • 2010-11-23
    • 2014-10-08
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多