В ruby 1.9 string[some_index]
больше не является байтовым значением, вместо этого будет строка
ruby-1.9.2-p180 :001 > '123'[2] => "3"
Строка не имеет метода ^, поэтому вы получите ошибку, которую вы описали. В ruby 1.8.7 вы бы взяли значение байта, и все бы сработало. Я думаю, вам повезет больше, если вы используете unpack, чтобы превратить строку в массив байтов, манипулировать ею, а затем собрать все вместе, что-то вроде
bytes = key.unpack('C*')
bytes.each_with_index {|b,i| ... }
key = bytes.pack('C*')