Ruby Integer # chr против Python chr () разные результаты - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь написать алгоритм шифрования RC4 в Ruby. У меня проблема в том, что некоторые порядковые значения искажаются или по-разному переводятся, когда я преобразую его в символ, чтобы получить его двоичное значение.

Например,

>> 27.chr
=> "\e"
=> 27.chr
>> 27.chr.encoding
=> #<Encoding:US-ASCII>
>> 27.chr(Encoding::UTF_8)
=> "\e"

С другой стороны, используя python3 или javascript (String.fromCharCode()), он дает другое значение (которое мне нужно)

>>> chr(27)
'\x1b'

Конечно, эта проблема затрагивает окончательную зашифрованную строку, где я не могу расшифруйте его с помощью других реализаций, которые пишутся на других языках.

Код шифрования RC4

def rc4_encrypt(key, str)
  s = (0..256).to_a
  j = 0

  (0..256).each do |i|
    j = (j + s[i] + key[i % key.size].ord) % 256
    s[i], s[j] = s[j], s[i]
  end
  j = 0
  y = 0
  o = []
  str.each_char do |c|
    j = (j + 1) % 256
    y = (y + s[j]) % 256
    s[j], s[y] = s[y], s[j]
    r = (c.ord ^ s[(s[j] + s[y]) % 256])
    o << r.chr 
  end
  o.join
end

Примечания:

  • Я попробовал некоторые другие Ruby реализации, и я получаю та же проблема.
  • Я знаю, что RC4 - очень слабый алгоритм.

Спасибо!

...