gpt4 book ai didi

ruby - Perl 到 Ruby 使用 HEX key 进行异或解码

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:16 24 4
gpt4 key购买 nike

我编写了以下简单的 Perl 脚本,它使用 HEX key 对字符串进行异或运算,我尝试(到目前为止成功率达到 99%)将其移植到 Ruby,但成功率不是 100%,因为在某些情况下它会失败(有一些特殊字符):

Perl 脚本:

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

ruby 脚本:

#!/usr/bin/env ruby

key = ['3cb37efae7f4f376ebbd76cdfce7391e9ed9cee4cfceb4b33332fc96ff7b'].pack('H*')

def decode(str, key)
text = str.dup
text.length.times { |n| text[n] = (text[n].ord ^ key[n.modulo key.size].ord).chr }
text
end

print "Enter string to decode: "
STDOUT.flush
a_string = gets
a_string.chomp!
a_string = a_string.gsub(/\\n/, "")
a_string = a_string.gsub(/\\/, "")
a_string = a_string.unpack('u')[0]
dec = decode(a_string, key)
puts "Decoded string value: "+dec

ruby 脚本失败的例子:

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: ,6]\\3B8Z9@QJ.Q4_T\n
Plain text: glmsimplex99
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: ,6]\\3B8Z9@QJ.Q4_T\n
Decoded string value: ggA5ÕZîÍ

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: *4\\L'GM?,EQ?9B0 \n
Plain text: oxyd08da24
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: *4\\L'GM?,EQ?9B0 \n
Decoded string value: nrOÑ6ý

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: 33\\8.GY67DAJ"VP2LFXY5\=\\'N^@ \n
Plain text: supercalifragili_74
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: 33\\8.GY67DAJ"VP2LFXY5\=\\'N^@ \n
Decoded string value: q0ÙuÖ]|]ërdqyÎ

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: +7\=\\;EI*&D@+8C40 \n
Plain text: alelurat302
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: +7\=\\;EI*&D@+8C40 \n
Decoded string value: aeFPsÀÈìv

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: '"\\ 1C(*&T@ \n
Plain text: 7sover!
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: '"\\ 1C(*&T@ \n
Decoded string value: 4·ÚF@s

root@server:~/coding/ruby$ perl dec6admin.pl
Enter string to decode: *4\\,*RY>&G$?9C0 \n
Plain text: opt1pro120
root@server:~/coding/ruby$ ruby dec6admin.rb
Enter string to decode: *4\\,*RY>&G$?9C0 \n
Decoded string value: lqÌSâý

知道我在 Ruby 脚本中哪里错了吗?

最佳答案

比较行:

$s =~ s/\\(.)/$1/sg;

在您的 Perl 代码中相应的行:

a_string = a_string.gsub(/\\/, "")

在您的 Ruby 代码中。你能看出区别吗?

这里有一个提示:Ruby 代码从字符串中去除所有 反斜杠,而 Perl 代码将反斜杠后跟任何其他字符(包括另一个反斜杠)替换为该字符。这意味着你输入的 ,6]\\3B8Z9@QJ.Q4_T 在被 Perl 代码处理后变成了 ,6]\3B8Z9@QJ.Q4_T,但是 ,6]3B8Z9@QJ.Q4_T 由 Ruby 代码处理时。

用等效的 Perl 代码替换 Ruby 代码中的那一行,即:

a_string = a_string.gsub(/\\(.)/s, '\1')

让它对我有用。

附言。为什么你甚至需要在uudecoding之前处理字符串?在没有任何双反斜杠或尾随换行符的情况下存储您的输入会简单得多。

关于ruby - Perl 到 Ruby 使用 HEX key 进行异或解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com