2013-02-19 2 views
1

У меня есть следующий Perl-скрипт, который делает побитового XOR на строку с ключом HEX:Порт маленький побитовое исключающее функция Perl Руби

#!/usr/bin/perl 

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

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

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

Пример вывода запустить его:

$ perl deXOR.pl 
Enter string to decode: (?LM-D\=^5DB$ \n 
Decoded string value: Bx3k8aaW 

Я пытался портировать его Руби, но я делаю что-то неправильно, то результат не то же самое:

#!/usr/bin/env ruby 

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

print "Enter string to decode: " 
STDOUT.flush 
a_string = gets 
a_string.chomp! 
a_string = a_string.gsub(/\//, "") 
dec = String(key) 
puts "Decoded string value: "+dec 

class String 
    def xor(key) 
    text = dup 
    text.length.times {|n| text[n] = (text[n].ord^key[n.modulo key.size].ord).chr } 
    text 
    end 
end 

Пример вывода:

$ ruby deXOR.rb 
Enter string to decode: (?LM-D\=^5DB$ \n 
Decoded string value: <³~úçôóvë½vÍ 

Что я делаю неправильно? Есть предположения? Благодаря!

Измененный, до сих пор бардак ...

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

def xor(text, key) 
    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(/\//, "") 
dec = xor(a_string, key) 
puts "Decoded string value: "+dec 

Выход:

$ ruby deXOR.rb 
Enter string to decode: (?LM-D\=^5DB$ \n 
Decoded string value: 2·Ê°¯Kµ2" 

Работа версию с помощью Digitaka в:

key = ['3cb37efae7f4f376ebbd76cd'].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 deXOR.rb 
Enter string to decode: (?LM-D=^5DB$ \n 
Decoded string value: Bx3k8aaW 
+0

В вашем фрагменте кода вы, кажется, не называя вашу функцию XOR на всех –

+0

Кажется, никто не может помочь, все равно спасибо ... – bsteo

ответ

1

В perl ваш код является uudecodeing введенной строкой, и эквивалент не происходит в ruby. Этот фрагмент кода uudecodes и декодирует как перловый код:

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

# took some liberties to simplify the input text code 
istr = "(?LM-D=^5DB$ ".unpack('u')[0] 

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 

puts decode(istr,key) 
# => Bx3k8aaW 
+0

работает как шарм! Благодаря! – bsteo

+0

Хмм, эта закодированная строка не работает: «*% XI'R-7 \! QT /? _ 0 \ n" -> "+ 992ôkäÂ" должно указывать "+ 99225454 @" – bsteo

+0

Я думаю, что мне нужно добавить «a_string = a_string. gsub (/ \\ /, "") " – bsteo