Ошибка Ruby: в «блоке в процессе»: неопределенный метод «^» для 4: String (NoMethodError)

Пытаетесь запустить алгоритм rc4, но он не распознает метод XOR? Или что-то еще происходит? Я получаю сообщение об ошибке, когда он переходит к процессу определения (текст).

Ошибка:

rc4.rb:26:in block in process': undefined method^' для "4":String (NoMethodError) из rc4.rb:26:in upto' from rc4.rb:26:inprocess' из rc4.rb:21:in encrypt' from rc4.rb:48:in'

Код:

class Rc4

def initialize(str)
    @q1, @q2 = 0, 0
    @key = []
    str.each_byte {|elem| @key << elem} while @key.size < 256
    @key.slice!([email protected]) if @key.size >= 256
    @s = (0..255).to_a
    j = 0 
    0.upto(255) do |i| 
      j = (j + @s[i] + @key[i] )%256
      @s[i], @s[j] = @s[j], @s[i]
    end    
  end

  def encrypt!(text)
    process text
  end  

  def encrypt(text)
    process text.dup
  end 

  private

  def process(text)
    0.upto(text.length-1) {|i| text[i] = text[i] ^ round}
    text
  end

  def round
    @q1 = (@q1 + 1)%256
    @q2 = (@q2 + @s[@q1])%256
    @s[@q1], @s[@q2] = @s[@q2], @s[@q1]
    @s[(@s[@q1]+@s[@q2])%256]  
  end

end

puts "Enter key."
    keyInput = gets.chomp
    keyInput = keyInput.to_s
    encryptInstance = Rc4.new(keyInput)
    decryptInstance = Rc4.new(keyInput)

  puts "Enter plaintext."
    plainInput = gets.chomp
    plainInput = plainInput.to_s
    cipherText = encryptInstance.encrypt(plainInput)

  puts "Plaintext is: " + plainInput

  puts "Ciphertext is: " + cipherText

  decryptedText = decryptInstance.encrypt(cipherText)

  puts "Decrypted text is: " + decryptedText

person Corey    schedule 07.10.2014    source источник
comment
Какой у Вас вопрос?   -  person sawa    schedule 07.10.2014
comment
Почему я получаю эту ошибку/Почему он не запускается?   -  person Corey    schedule 07.10.2014
comment
Я работал над RC4 раньше, вы можете увидеть код здесь: github.com/suryart/spree_ebsin/blob/master/lib/spree_ebsin/   -  person Surya    schedule 07.10.2014
comment
0.upto(text.length-1) {|i| text[i] = text[i] ^ round} не будет работать, так как вы пытаетесь использовать строку: text[i] в выражении: text[i] ^ round должно быть text[i].to_i ^ round или что-то в этом роде.   -  person Surya    schedule 08.10.2014
comment
Попробовал это и начал получать другую ошибку, которую я разместил ниже в комментариях к другому ответу.   -  person Corey    schedule 08.10.2014


Ответы (1)


text[i] здесь является строкой. Используйте text[i].to_i

Это должно работать

0.upto(text.length-1) {|i| text[i] = (text[i].ord ^ round).chr}

Поскольку вы занимаетесь шифрованием, преобразование «4» в 4 будет большой ошибкой. Мы оперируем кодировками и конвертируем обратно.

person rohit89    schedule 07.10.2014
comment
rc4.rb:27:in []=': no implicit conversion of Fixnum into String (TypeError) from rc4.rb:27:in block in process' из rc4.rb:27:in upto' from rc4.rb:27:in process' from rc4.rb:21:in encrypt' from rc4.rb:49:in ‹main›' - person Corey; 07.10.2014
comment
Взял это с github.com/maxprokopiev/ruby-rc4, поэтому я подумал, что это должно работать - person Corey; 07.10.2014
comment
Хорошо, эта версия работает, как мне сделать так, чтобы зашифрованный текст отображался как обычные числа? Вот что я получил: Открытый текст: 123 11 81 99 232 5 Зашифрованный текст: ƻ?~??K??????6? Расшифрованный текст: 123 11 81 99 232 5 - person Corey; 08.10.2014
comment
Что вы даете в качестве входных данных? - person rohit89; 08.10.2014
comment
Клавиша ввода. 1234 5678 Введите открытый текст. 9876 5432 Открытый текст: 9876 5432 Зашифрованный текст: ??T:?A?@s Расшифрованный текст: 9876 5432 - person Corey; 08.10.2014
comment
Зашифрованные символы не всегда являются печатными символами ascii. Если вы хотите отобразить зашифрованный текст, вам нужно будет закодировать его в шестнадцатеричном формате и распечатать. - person rohit89; 08.10.2014