Я пытаюсь написать алгоритм шифрования 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 - очень слабый алгоритм.
Спасибо!